diff --git a/DEPS b/DEPS
index 893522fc..bc63e37 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': '1df161ab8a6aac3ca528fd5ffdecd08438889d97',
+  'skia_revision': '2c49a4185865140827ac4630e6b63cd03e0ad3bb',
   # 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': 'a491782773bf57d1b573f4ce87c5b039df0fb813',
+  'v8_revision': '03707bbe71e93513636b7887590823abbe66f221',
   # 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': '687a79c5ce07bc338192f19d8452edefaf27dd76',
+  'pdfium_revision': 'e818bcba7e036d7e1dc8f282a88022b814dbfb40',
   # 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.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'f25bfea25223277cb04abf0eef039f35f280c987',
+  'catapult_revision': 'c50cbdedf9a36a08ef7f2bb584625332f1a9592f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -205,7 +205,7 @@
     Var('chromium_git') + '/webm/libvpx.git' + '@' +  '164db8278f68a5ab376500ed6aad99ef7da3e9b0',
 
   'src/third_party/ffmpeg':
-    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '239c9f9e275486c051f3313efb6725968bb9a004',
+    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'a77cdbfeb7b629eb3a5012d7c6c94ef11e0488be',
 
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '8679f2b0bf063ac894dc473debefd61dbbebf622',
diff --git a/ash/common/accelerators/ash_focus_manager_factory.cc b/ash/common/accelerators/ash_focus_manager_factory.cc
index 2810ff5..058e0575 100644
--- a/ash/common/accelerators/ash_focus_manager_factory.cc
+++ b/ash/common/accelerators/ash_focus_manager_factory.cc
@@ -6,6 +6,7 @@
 
 #include "ash/common/accelerators/accelerator_controller.h"
 #include "ash/common/wm_shell.h"
+#include "base/memory/ptr_util.h"
 #include "ui/views/focus/focus_manager.h"
 
 namespace ash {
@@ -16,7 +17,9 @@
 views::FocusManager* AshFocusManagerFactory::CreateFocusManager(
     views::Widget* widget,
     bool desktop_widget) {
-  return new views::FocusManager(widget, desktop_widget ? NULL : new Delegate);
+  return new views::FocusManager(
+      widget,
+      desktop_widget ? nullptr : base::WrapUnique<Delegate>(new Delegate));
 }
 
 bool AshFocusManagerFactory::Delegate::ProcessAccelerator(
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 99017c74..805b7a1d3 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2019,6 +2019,7 @@
     "optional_unittest.cc",
     "os_compat_android_unittest.cc",
     "path_service_unittest.cc",
+    "pending_task_unittest.cc",
     "pickle_unittest.cc",
     "posix/file_descriptor_shuffle_unittest.cc",
     "posix/unix_domain_socket_linux_unittest.cc",
diff --git a/base/debug/task_annotator.cc b/base/debug/task_annotator.cc
index 437d69a7..46969f2 100644
--- a/base/debug/task_annotator.cc
+++ b/base/debug/task_annotator.cc
@@ -4,6 +4,8 @@
 
 #include "base/debug/task_annotator.h"
 
+#include <array>
+
 #include "base/debug/activity_tracker.h"
 #include "base/debug/alias.h"
 #include "base/pending_task.h"
@@ -41,13 +43,18 @@
       TRACE_ID_MANGLE(GetTaskTraceID(*pending_task)), TRACE_EVENT_FLAG_FLOW_IN,
       "queue_duration", queue_duration.InMilliseconds());
 
-  // Before running the task, store the program counter where it was posted
-  // and deliberately alias it to ensure it is on the stack if the task
-  // crashes. Be careful not to assume that the variable itself will have the
-  // expected value when displayed by the optimizer in an optimized build.
-  // Look at a memory dump of the stack.
-  const void* program_counter = pending_task->posted_from.program_counter();
-  debug::Alias(&program_counter);
+  // Before running the task, store the task backtrace with the chain of
+  // PostTasks that resulted in this call and deliberately alias it to ensure
+  // it is on the stack if the task crashes. Be careful not to assume that the
+  // variable itself will have the expected value when displayed by the
+  // optimizer in an optimized build. Look at a memory dump of the stack.
+  static constexpr int kStackTaskTraceSnapshotSize =
+      std::tuple_size<decltype(pending_task->task_backtrace)>::value + 1;
+  std::array<const void*, kStackTaskTraceSnapshotSize> task_backtrace;
+  task_backtrace[0] = pending_task->posted_from.program_counter();
+  std::copy(pending_task->task_backtrace.begin(),
+            pending_task->task_backtrace.end(), task_backtrace.begin() + 1);
+  debug::Alias(&task_backtrace);
 
   std::move(pending_task->task).Run();
 
diff --git a/base/message_loop/incoming_task_queue.cc b/base/message_loop/incoming_task_queue.cc
index c32afda1..c7faa9a 100644
--- a/base/message_loop/incoming_task_queue.cc
+++ b/base/message_loop/incoming_task_queue.cc
@@ -67,8 +67,8 @@
       << "Requesting super-long task delay period of " << delay.InSeconds()
       << " seconds from here: " << from_here.ToString();
 
-  PendingTask pending_task(
-      from_here, task, CalculateDelayedRuntime(delay), nestable);
+  PendingTask pending_task(from_here, task, CalculateDelayedRuntime(delay),
+                           nestable);
 #if defined(OS_WIN)
   // We consider the task needs a high resolution timer if the delay is
   // more than 0 and less than 32ms. This caps the relative error to
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
index 72185a8..60df713 100644
--- a/base/message_loop/message_loop.cc
+++ b/base/message_loop/message_loop.cc
@@ -320,7 +320,8 @@
 #endif
       nestable_tasks_allowed_(true),
       pump_factory_(pump_factory),
-      run_loop_(NULL),
+      run_loop_(nullptr),
+      current_pending_task_(nullptr),
       incoming_task_queue_(new internal::IncomingTaskQueue(this)),
       unbound_task_runner_(
           new internal::MessageLoopTaskRunner(incoming_task_queue_)),
@@ -403,6 +404,7 @@
 
 void MessageLoop::RunTask(PendingTask* pending_task) {
   DCHECK(nestable_tasks_allowed_);
+  current_pending_task_ = pending_task;
 
 #if defined(OS_WIN)
   if (pending_task->is_high_res) {
@@ -423,6 +425,8 @@
     observer.DidProcessTask(*pending_task);
 
   nestable_tasks_allowed_ = true;
+
+  current_pending_task_ = nullptr;
 }
 
 bool MessageLoop::DeferOrRunPendingTask(PendingTask pending_task) {
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h
index 91a7b1d3..8417ce49c 100644
--- a/base/message_loop/message_loop.h
+++ b/base/message_loop/message_loop.h
@@ -346,11 +346,13 @@
   void BindToCurrentThread();
 
  private:
-  friend class RunLoop;
   friend class internal::IncomingTaskQueue;
+  friend class RunLoop;
   friend class ScheduleWorkTest;
   friend class Thread;
+  friend struct PendingTask;
   FRIEND_TEST_ALL_PREFIXES(MessageLoopTest, DeleteUnboundLoop);
+  friend class PendingTaskTest;
 
   // Creates a MessageLoop without binding to a thread.
   // If |type| is TYPE_CUSTOM non-null |pump_factory| must be also given
@@ -450,6 +452,13 @@
 
   debug::TaskAnnotator task_annotator_;
 
+  // Used to allow creating a breadcrumb of program counters in PostTask.
+  // This variable is only initialized while a task is being executed and is
+  // meant only to store context for creating a backtrace breadcrumb. Do not
+  // attach other semantics to it without thinking through the use caes
+  // thoroughly.
+  const PendingTask* current_pending_task_;
+
   scoped_refptr<internal::IncomingTaskQueue> incoming_task_queue_;
 
   // A task runner which we haven't bound to a thread yet.
diff --git a/base/pending_task.cc b/base/pending_task.cc
index cca9ebf..b2f95b4 100644
--- a/base/pending_task.cc
+++ b/base/pending_task.cc
@@ -4,18 +4,14 @@
 
 #include "base/pending_task.h"
 
+#include "base/message_loop/message_loop.h"
 #include "base/tracked_objects.h"
 
 namespace base {
 
 PendingTask::PendingTask(const tracked_objects::Location& posted_from,
                          OnceClosure task)
-    : base::TrackingInfo(posted_from, TimeTicks()),
-      task(std::move(task)),
-      posted_from(posted_from),
-      sequence_num(0),
-      nestable(true),
-      is_high_res(false) {}
+    : PendingTask(posted_from, std::move(task), TimeTicks(), true) {}
 
 PendingTask::PendingTask(const tracked_objects::Location& posted_from,
                          OnceClosure task,
@@ -26,7 +22,19 @@
       posted_from(posted_from),
       sequence_num(0),
       nestable(nestable),
-      is_high_res(false) {}
+      is_high_res(false) {
+  const PendingTask* parent_task =
+      MessageLoop::current() ? MessageLoop::current()->current_pending_task_
+                             : nullptr;
+  if (parent_task) {
+    task_backtrace[0] = parent_task->posted_from.program_counter();
+    std::copy(parent_task->task_backtrace.begin(),
+              parent_task->task_backtrace.end() - 1,
+              task_backtrace.begin() + 1);
+  } else {
+    task_backtrace.fill(nullptr);
+  }
+}
 
 PendingTask::PendingTask(PendingTask&& other) = default;
 
diff --git a/base/pending_task.h b/base/pending_task.h
index a55fa518..7f3fccd8 100644
--- a/base/pending_task.h
+++ b/base/pending_task.h
@@ -5,6 +5,7 @@
 #ifndef BASE_PENDING_TASK_H_
 #define BASE_PENDING_TASK_H_
 
+#include <array>
 #include <queue>
 
 #include "base/base_export.h"
@@ -37,6 +38,9 @@
   // The site this PendingTask was posted from.
   tracked_objects::Location posted_from;
 
+  // Task backtrace.
+  std::array<const void*, 4> task_backtrace;
+
   // Secondary sort key for run time.
   int sequence_num;
 
diff --git a/base/pending_task_unittest.cc b/base/pending_task_unittest.cc
new file mode 100644
index 0000000..8d52daa9
--- /dev/null
+++ b/base/pending_task_unittest.cc
@@ -0,0 +1,169 @@
+// Copyright (c) 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 "base/pending_task.h"
+
+#include <vector>
+
+#include "base/bind.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "base/threading/thread.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+class PendingTaskTest : public ::testing::Test {
+ public:
+  PendingTaskTest() = default;
+
+  ~PendingTaskTest() override = default;
+
+ protected:
+  using ExpectedTrace = std::vector<const void*>;
+
+  static void VerifyTraceAndPost(
+      const scoped_refptr<TaskRunner>& task_runner,
+      const tracked_objects::Location& posted_from,
+      const tracked_objects::Location& next_from_here,
+      const std::vector<const void*>& expected_trace,
+      Closure task) {
+    SCOPED_TRACE(StringPrintf("Callback Depth: %zu", expected_trace.size()));
+
+    // Beyond depth + 1, the trace is nonsensical because there haven't been
+    // enough nested tasks called.
+    const PendingTask* current_pending_task =
+        MessageLoop::current()->current_pending_task_;
+    size_t window = std::min(current_pending_task->task_backtrace.size(),
+                             expected_trace.size());
+
+    EXPECT_EQ(posted_from,
+              MessageLoop::current()->current_pending_task_->posted_from);
+    for (size_t i = 0; i < window; i++) {
+      SCOPED_TRACE(StringPrintf("Trace frame: %zu", i));
+      EXPECT_EQ(expected_trace[i], current_pending_task->task_backtrace[i]);
+    }
+    task_runner->PostTask(next_from_here, std::move(task));
+  }
+
+  static void RunTwo(Closure c1, Closure c2) {
+    c1.Run();
+    c2.Run();
+  }
+};
+
+// Ensure the task backtrace populates correctly.
+TEST_F(PendingTaskTest, SingleThreadedSimple) {
+  MessageLoop loop;
+  const tracked_objects::Location& location0 = FROM_HERE;
+  const tracked_objects::Location& location1 = FROM_HERE;
+  const tracked_objects::Location& location2 = FROM_HERE;
+  const tracked_objects::Location& location3 = FROM_HERE;
+  const tracked_objects::Location& location4 = FROM_HERE;
+  const tracked_objects::Location& location5 = FROM_HERE;
+
+  Closure task5 = Bind(
+      &PendingTaskTest::VerifyTraceAndPost, loop.task_runner(), location4,
+      location5,
+      ExpectedTrace({location3.program_counter(), location2.program_counter(),
+                     location1.program_counter(), location0.program_counter()}),
+      Bind(&DoNothing));
+  Closure task4 = Bind(
+      &PendingTaskTest::VerifyTraceAndPost, loop.task_runner(), location3,
+      location4,
+      ExpectedTrace({location2.program_counter(), location1.program_counter(),
+                     location0.program_counter(), nullptr}),
+      task5);
+  Closure task3 = Bind(
+      &PendingTaskTest::VerifyTraceAndPost, loop.task_runner(), location2,
+      location3, ExpectedTrace({location1.program_counter(),
+                                location0.program_counter(), nullptr, nullptr}),
+      task4);
+  Closure task2 =
+      Bind(&PendingTaskTest::VerifyTraceAndPost, loop.task_runner(), location1,
+           location2, ExpectedTrace({location0.program_counter()}), task3);
+  Closure task1 = Bind(&PendingTaskTest::VerifyTraceAndPost, loop.task_runner(),
+                       location0, location1, ExpectedTrace({}), task2);
+
+  loop.task_runner()->PostTask(location0, task1);
+
+  RunLoop().RunUntilIdle();
+}
+
+// Post a task onto another thread. Ensure on the other thread, it has the
+// right stack trace.
+TEST_F(PendingTaskTest, MultipleThreads) {
+  MessageLoop loop;  // Implicitly "thread a."
+  Thread thread_b("pt_test_b");
+  Thread thread_c("pt_test_c");
+  thread_b.StartAndWaitForTesting();
+  thread_c.StartAndWaitForTesting();
+
+  const tracked_objects::Location& location_a0 = FROM_HERE;
+  const tracked_objects::Location& location_a1 = FROM_HERE;
+  const tracked_objects::Location& location_a2 = FROM_HERE;
+  const tracked_objects::Location& location_a3 = FROM_HERE;
+
+  const tracked_objects::Location& location_b0 = FROM_HERE;
+  const tracked_objects::Location& location_b1 = FROM_HERE;
+
+  const tracked_objects::Location& location_c0 = FROM_HERE;
+
+  // On thread c, post a task back to thread a that verifies its trace
+  // and terminates after one more self-post.
+  Closure task_a2 =
+      Bind(&PendingTaskTest::VerifyTraceAndPost, loop.task_runner(),
+           location_a2, location_a3,
+           ExpectedTrace(
+               {location_c0.program_counter(), location_b0.program_counter(),
+                location_a1.program_counter(), location_a0.program_counter()}),
+           Bind(&DoNothing));
+  Closure task_c0 = Bind(&PendingTaskTest::VerifyTraceAndPost,
+                         loop.task_runner(), location_c0, location_a2,
+                         ExpectedTrace({location_b0.program_counter(),
+                                        location_a1.program_counter(),
+                                        location_a0.program_counter()}),
+                         task_a2);
+
+  // On thread b run two tasks that conceptually come from the same location
+  // (managed via RunTwo().) One will post back to thread b and another will
+  // post to thread c to test spawning multiple tasks on different message
+  // loops. The task posted to thread c will not get location b1 whereas the
+  // one posted back to thread b will.
+  Closure task_b0_fork =
+      Bind(&PendingTaskTest::VerifyTraceAndPost,
+           thread_c.message_loop()->task_runner(), location_b0, location_c0,
+           ExpectedTrace({location_a1.program_counter(),
+                          location_a0.program_counter(), nullptr}),
+           task_c0);
+  Closure task_b0_local =
+      Bind(&PendingTaskTest::VerifyTraceAndPost,
+           thread_b.message_loop()->task_runner(), location_b0, location_b1,
+           ExpectedTrace({location_a1.program_counter(),
+                          location_a0.program_counter(), nullptr}),
+           Bind(&DoNothing));
+
+  // Push one frame onto the stack in thread a then pass to thread b.
+  Closure task_a1 =
+      Bind(&PendingTaskTest::VerifyTraceAndPost,
+           thread_b.message_loop()->task_runner(), location_a1, location_b0,
+           ExpectedTrace({location_a0.program_counter(), nullptr}),
+           Bind(&PendingTaskTest::RunTwo, task_b0_local, task_b0_fork));
+  Closure task_a0 =
+      Bind(&PendingTaskTest::VerifyTraceAndPost, loop.task_runner(),
+           location_a0, location_a1, ExpectedTrace({nullptr}), task_a1);
+
+  loop.task_runner()->PostTask(location_a0, task_a0);
+
+  RunLoop().RunUntilIdle();
+
+  thread_b.FlushForTesting();
+  thread_b.Stop();
+
+  thread_c.FlushForTesting();
+  thread_c.Stop();
+}
+
+}  // namespace base
diff --git a/base/trace_event/memory_infra_background_whitelist.cc b/base/trace_event/memory_infra_background_whitelist.cc
index f056d2b..9230fe5 100644
--- a/base/trace_event/memory_infra_background_whitelist.cc
+++ b/base/trace_event/memory_infra_background_whitelist.cc
@@ -35,6 +35,7 @@
     "V8Isolate",
     "WinHeap",
     "SyncDirectory",
+    "TabRestoreServiceHelper",
     nullptr  // End of list marker.
 };
 
@@ -125,6 +126,9 @@
     "sync/0x?/model_type/TYPED_URL",
     "sync/0x?/model_type/WALLET_METADATA",
     "sync/0x?/model_type/WIFI_CREDENTIAL",
+    "tab_restore/service_helper_0x?/entries",
+    "tab_restore/service_helper_0x?/entries/tab_0x?",
+    "tab_restore/service_helper_0x?/entries/window_0x?",
     nullptr  // End of list marker.
 };
 
diff --git a/build_overrides/v8.gni b/build_overrides/v8.gni
deleted file mode 100644
index d67fd16..0000000
--- a/build_overrides/v8.gni
+++ /dev/null
@@ -1,8 +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.
-
-# This file should be empty.
-
-# TODO(brettw) http://crbug.com/684096 Remove this when all callers are updated
-# to use the new build overrides system.
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 919be277..1d17fc8 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -881,6 +881,7 @@
     "animation/transform_operations_unittest.cc",
 
     # Surfaces test files.
+    "surfaces/compositor_frame_sink_support_unittest.cc",
     "surfaces/direct_compositor_frame_sink_unittest.cc",
     "surfaces/display_scheduler_unittest.cc",
     "surfaces/display_unittest.cc",
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 5f777af..b02fb5b 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -600,10 +600,6 @@
 }
 
 bool Layer::IsContainerForFixedPositionLayers() const {
-  if (!inputs_.transform.IsIdentityOrTranslation())
-    return true;
-  if (parent_ && !parent_->inputs_.transform.IsIdentityOrTranslation())
-    return true;
   return inputs_.is_container_for_fixed_position_layers;
 }
 
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 4f6bfdb..ee0a6c84 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -354,7 +354,6 @@
                        texture_rect, draw_info.resource_size(),
                        draw_info.contents_swizzled(), nearest_neighbor_);
           ValidateQuadResources(quad);
-          iter->draw_info().set_was_ever_used_to_draw();
           has_draw_quad = true;
           break;
         }
@@ -364,7 +363,6 @@
           quad->SetNew(shared_quad_state, geometry_rect, visible_geometry_rect,
                        draw_info.solid_color(), false);
           ValidateQuadResources(quad);
-          iter->draw_info().set_was_ever_used_to_draw();
           has_draw_quad = true;
           break;
         }
diff --git a/cc/raster/staging_buffer_pool.cc b/cc/raster/staging_buffer_pool.cc
index ef78e4d..6fa0fe0 100644
--- a/cc/raster/staging_buffer_pool.cc
+++ b/cc/raster/staging_buffer_pool.cc
@@ -432,24 +432,10 @@
   }
 }
 
-void StagingBufferPool::OnMemoryStateChange(base::MemoryState state) {
-  switch (state) {
-    case base::MemoryState::NORMAL:
-      // TODO(tasak): go back to normal state.
-      break;
-    case base::MemoryState::THROTTLED:
-      // TODO(tasak): make the limits of this component's caches smaller to
-      // save memory usage.
-      break;
-    case base::MemoryState::SUSPENDED: {
-      base::AutoLock lock(lock_);
-      // Release all buffers, regardless of how recently they were used.
-      ReleaseBuffersNotUsedSince(base::TimeTicks() + base::TimeDelta::Max());
-    } break;
-    case base::MemoryState::UNKNOWN:
-      // NOT_REACHED.
-      break;
-  }
+void StagingBufferPool::OnPurgeMemory() {
+  base::AutoLock lock(lock_);
+  // Release all buffers, regardless of how recently they were used.
+  ReleaseBuffersNotUsedSince(base::TimeTicks() + base::TimeDelta::Max());
 }
 
 }  // namespace cc
diff --git a/cc/raster/staging_buffer_pool.h b/cc/raster/staging_buffer_pool.h
index 528d031..32edc4f 100644
--- a/cc/raster/staging_buffer_pool.h
+++ b/cc/raster/staging_buffer_pool.h
@@ -90,7 +90,7 @@
       base::trace_event::TracedValue* staging_state) const;
 
   // Overriden from base::MemoryCoordinatorClient.
-  void OnMemoryStateChange(base::MemoryState state) override;
+  void OnPurgeMemory() override;
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
   ContextProvider* const worker_context_provider_;
diff --git a/cc/raster/synchronous_task_graph_runner.cc b/cc/raster/synchronous_task_graph_runner.cc
index f9c0a65b..daadbce 100644
--- a/cc/raster/synchronous_task_graph_runner.cc
+++ b/cc/raster/synchronous_task_graph_runner.cc
@@ -67,6 +67,9 @@
 }
 
 bool SynchronousTaskGraphRunner::RunTask() {
+  // Since we do not have posted from location for tasks, record the context for
+  // tasks as "cc" in heap profiler.
+  TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION scoped_event("cc");
   TRACE_EVENT0("toplevel", "SynchronousTaskGraphRunner::RunTask");
 
   // Find the first category with any tasks to run. This task graph runner
diff --git a/cc/resources/resource_pool.cc b/cc/resources/resource_pool.cc
index 61a7ae3..c200375 100644
--- a/cc/resources/resource_pool.cc
+++ b/cc/resources/resource_pool.cc
@@ -480,23 +480,9 @@
   return true;
 }
 
-void ResourcePool::OnMemoryStateChange(base::MemoryState state) {
-  switch (state) {
-    case base::MemoryState::NORMAL:
-      // TODO(tasak): go back to normal state.
-      break;
-    case base::MemoryState::THROTTLED:
-      // TODO(tasak): make the limits of this component's caches smaller to
-      // save memory usage.
-      break;
-    case base::MemoryState::SUSPENDED:
-      // Release all resources, regardless of how recently they were used.
-      EvictResourcesNotUsedSince(base::TimeTicks() + base::TimeDelta::Max());
-      break;
-    case base::MemoryState::UNKNOWN:
-      // NOT_REACHED.
-      break;
-  }
+void ResourcePool::OnPurgeMemory() {
+  // Release all resources, regardless of how recently they were used.
+  EvictResourcesNotUsedSince(base::TimeTicks() + base::TimeDelta::Max());
 }
 
 }  // namespace cc
diff --git a/cc/resources/resource_pool.h b/cc/resources/resource_pool.h
index b7c43e7..5f387ea 100644
--- a/cc/resources/resource_pool.h
+++ b/cc/resources/resource_pool.h
@@ -85,7 +85,7 @@
                     base::trace_event::ProcessMemoryDump* pmd) override;
 
   // Overriden from base::MemoryCoordinatorClient.
-  void OnMemoryStateChange(base::MemoryState state) override;
+  void OnPurgeMemory() override;
 
   size_t GetTotalMemoryUsageForTesting() const {
     return total_memory_usage_bytes_;
diff --git a/cc/resources/resource_pool_unittest.cc b/cc/resources/resource_pool_unittest.cc
index 3b1c5b7..aa8e853e 100644
--- a/cc/resources/resource_pool_unittest.cc
+++ b/cc/resources/resource_pool_unittest.cc
@@ -353,7 +353,8 @@
   EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
   EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
 
-  // Suspending should not impact an in-use resource.
+  // Purging and suspending should not impact an in-use resource.
+  resource_pool_->OnPurgeMemory();
   resource_pool_->OnMemoryStateChange(base::MemoryState::SUSPENDED);
   EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
   EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
@@ -364,7 +365,8 @@
   EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
   EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());
 
-  // Suspending should now free the busy resource.
+  // Purging and suspending should now free the busy resource.
+  resource_pool_->OnPurgeMemory();
   resource_pool_->OnMemoryStateChange(base::MemoryState::SUSPENDED);
   EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
   EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
diff --git a/cc/surfaces/compositor_frame_sink_support.h b/cc/surfaces/compositor_frame_sink_support.h
index 7351723..cfdd0a2 100644
--- a/cc/surfaces/compositor_frame_sink_support.h
+++ b/cc/surfaces/compositor_frame_sink_support.h
@@ -42,6 +42,10 @@
 
   const FrameSinkId& frame_sink_id() const { return frame_sink_id_; }
 
+  Surface* current_surface_for_testing() {
+    return surface_factory_.current_surface_for_testing();
+  }
+
   void EvictFrame();
   void SetNeedsBeginFrame(bool needs_begin_frame);
   void SubmitCompositorFrame(const LocalSurfaceId& local_surface_id,
diff --git a/cc/surfaces/compositor_frame_sink_support_unittest.cc b/cc/surfaces/compositor_frame_sink_support_unittest.cc
new file mode 100644
index 0000000..6a49fce
--- /dev/null
+++ b/cc/surfaces/compositor_frame_sink_support_unittest.cc
@@ -0,0 +1,391 @@
+// 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 "cc/surfaces/compositor_frame_sink_support.h"
+
+#include "base/macros.h"
+#include "cc/output/compositor_frame.h"
+#include "cc/surfaces/compositor_frame_sink_support_client.h"
+#include "cc/surfaces/frame_sink_id.h"
+#include "cc/surfaces/surface_id.h"
+#include "cc/test/begin_frame_args_test.h"
+#include "cc/test/fake_external_begin_frame_source.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::UnorderedElementsAre;
+using testing::IsEmpty;
+using testing::SizeIs;
+
+namespace cc {
+namespace test {
+namespace {
+
+constexpr FrameSinkId kParentFrameSink(2, 1);
+constexpr FrameSinkId kChildFrameSink1(65563, 1);
+constexpr FrameSinkId kChildFrameSink2(65564, 1);
+constexpr FrameSinkId kArbitraryFrameSink(1337, 7331);
+
+std::vector<SurfaceId> empty_surface_ids() {
+  return std::vector<SurfaceId>();
+}
+
+SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) {
+  return SurfaceId(
+      frame_sink_id,
+      LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u)));
+}
+
+CompositorFrame MakeCompositorFrame(
+    std::vector<SurfaceId> referenced_surfaces) {
+  CompositorFrame compositor_frame;
+  compositor_frame.metadata.referenced_surfaces =
+      std::move(referenced_surfaces);
+  return compositor_frame;
+}
+
+}  // namespace
+
+class CompositorFrameSinkSupportTest : public testing::Test,
+                                       public CompositorFrameSinkSupportClient {
+ public:
+  CompositorFrameSinkSupportTest() {}
+  ~CompositorFrameSinkSupportTest() override {}
+
+  CompositorFrameSinkSupport& parent_support() { return *supports_[0]; }
+  Surface* parent_surface() {
+    return parent_support().current_surface_for_testing();
+  }
+
+  CompositorFrameSinkSupport& child_support1() { return *supports_[1]; }
+  Surface* child_surface1() {
+    return child_support1().current_surface_for_testing();
+  }
+
+  CompositorFrameSinkSupport& child_support2() { return *supports_[2]; }
+  Surface* child_surface2() {
+    return child_support2().current_surface_for_testing();
+  }
+
+  CompositorFrameSinkSupport& support(int index) { return *supports_[index]; }
+  Surface* surface(int index) {
+    return support(index).current_surface_for_testing();
+  }
+
+  SurfaceManager& surface_manager() { return surface_manager_; }
+
+  SurfaceDependencyTracker& dependency_tracker() {
+    return *surface_manager_.dependency_tracker();
+  }
+
+  FakeExternalBeginFrameSource* begin_frame_source() {
+    return begin_frame_source_.get();
+  }
+
+  // testing::Test:
+  void SetUp() override {
+    testing::Test::SetUp();
+    begin_frame_source_ =
+        base::MakeUnique<FakeExternalBeginFrameSource>(0.f, false);
+    std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
+        new SurfaceDependencyTracker(&surface_manager_,
+                                     begin_frame_source_.get()));
+    surface_manager_.SetDependencyTracker(std::move(dependency_tracker));
+    supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
+        this, &surface_manager_, kParentFrameSink, nullptr /* display */,
+        nullptr /* display_begin_frame_source */));
+    supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
+        this, &surface_manager_, kChildFrameSink1, nullptr /* display */,
+        nullptr /* display_begin_frame_source */));
+    supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
+        this, &surface_manager_, kChildFrameSink2, nullptr /* display */,
+        nullptr /* display_begin_frame_source */));
+  }
+
+  void TearDown() override {
+    surface_manager_.SetDependencyTracker(nullptr);
+    begin_frame_source_.reset();
+    supports_.clear();
+  }
+
+  // CompositorFrameSinkSupportClient implementation.
+  void DidReceiveCompositorFrameAck() override {}
+  void OnBeginFrame(const BeginFrameArgs& args) override {}
+  void ReclaimResources(const ReturnedResourceArray& resources) override {}
+  void WillDrawSurface() override {}
+
+ private:
+  SurfaceManager surface_manager_;
+  std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source_;
+  std::vector<std::unique_ptr<CompositorFrameSinkSupport>> supports_;
+
+  DISALLOW_COPY_AND_ASSIGN(CompositorFrameSinkSupportTest);
+};
+
+// The parent Surface is blocked on |child_id1| and |child_id2|.
+TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) {
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1);
+
+  parent_support().SubmitCompositorFrame(
+      parent_id.local_surface_id(),
+      MakeCompositorFrame({child_id1, child_id2}));
+
+  // parent_support is blocked on |child_id1| and |child_id2|.
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(parent_surface()->HasActiveFrame());
+  EXPECT_TRUE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id1, child_id2));
+
+  // Submit a CompositorFrame without any dependencies to |child_id1|.
+  // parent_support should now only be blocked on |child_id2|.
+  child_support1().SubmitCompositorFrame(
+      child_id1.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
+
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(parent_surface()->HasActiveFrame());
+  EXPECT_TRUE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id2));
+
+  // Submit a CompositorFrame without any dependencies to |child_id2|.
+  // parent_support should be activated.
+  child_support2().SubmitCompositorFrame(
+      child_id2.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
+
+  EXPECT_FALSE(dependency_tracker().has_deadline());
+  EXPECT_TRUE(parent_surface()->HasActiveFrame());
+  EXPECT_FALSE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty());
+}
+
+// The parent Surface is blocked on |child_id2| which is blocked on |child_id3|.
+TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedChain) {
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1);
+
+  parent_support().SubmitCompositorFrame(parent_id.local_surface_id(),
+                                         MakeCompositorFrame({child_id1}));
+
+  // parent_support is blocked on |child_id1|.
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(parent_surface()->HasActiveFrame());
+  EXPECT_TRUE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id1));
+
+  child_support1().SubmitCompositorFrame(child_id1.local_surface_id(),
+                                         MakeCompositorFrame({child_id2}));
+
+  // child_support1 should now be blocked on |child_id2|.
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(child_surface1()->HasActiveFrame());
+  EXPECT_TRUE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id2));
+
+  // The parent should still be blocked on |child_id1| because it's pending.
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id1));
+
+  // Submit a CompositorFrame without any dependencies to |child_id2|.
+  // parent_support should be activated.
+  child_support2().SubmitCompositorFrame(
+      child_id2.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
+
+  EXPECT_FALSE(dependency_tracker().has_deadline());
+
+  // child_surface1 should now be active.
+  EXPECT_TRUE(child_surface1()->HasActiveFrame());
+  EXPECT_FALSE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(), IsEmpty());
+
+  // parent_surface should now be active.
+  EXPECT_TRUE(parent_surface()->HasActiveFrame());
+  EXPECT_FALSE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty());
+}
+
+// parent_surface and child_surface1 are blocked on |child_id2|.
+TEST_F(CompositorFrameSinkSupportTest,
+       DisplayCompositorLockingTwoBlockedOnOne) {
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1);
+
+  parent_support().SubmitCompositorFrame(parent_id.local_surface_id(),
+                                         MakeCompositorFrame({child_id2}));
+
+  // parent_support is blocked on |child_id2|.
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(parent_surface()->HasActiveFrame());
+  EXPECT_TRUE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id2));
+
+  // child_support1 should now be blocked on |child_id2|.
+  child_support1().SubmitCompositorFrame(child_id1.local_surface_id(),
+                                         MakeCompositorFrame({child_id2}));
+
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(child_surface1()->HasActiveFrame());
+  EXPECT_TRUE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id2));
+
+  // The parent should still be blocked on |child_id2|.
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id2));
+
+  // Submit a CompositorFrame without any dependencies to |child_id2|.
+  // parent_support should be activated.
+  child_support2().SubmitCompositorFrame(
+      child_id2.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
+
+  EXPECT_FALSE(dependency_tracker().has_deadline());
+
+  // child_surface1 should now be active.
+  EXPECT_TRUE(child_surface1()->HasActiveFrame());
+  EXPECT_FALSE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(), IsEmpty());
+
+  // parent_surface should now be active.
+  EXPECT_TRUE(parent_surface()->HasActiveFrame());
+  EXPECT_FALSE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty());
+}
+
+// parent_surface is blocked on |child_id1|, and child_surface2 is blocked on
+// |child_id2| until the deadline hits.
+TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingDeadlineHits) {
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1);
+
+  parent_support().SubmitCompositorFrame(parent_id.local_surface_id(),
+                                         MakeCompositorFrame({child_id1}));
+
+  // parent_support is blocked on |child_id1|.
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(parent_surface()->HasActiveFrame());
+  EXPECT_TRUE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id1));
+
+  child_support1().SubmitCompositorFrame(child_id1.local_surface_id(),
+                                         MakeCompositorFrame({child_id2}));
+
+  // child_support1 should now be blocked on |child_id2|.
+  EXPECT_TRUE(dependency_tracker().has_deadline());
+  EXPECT_FALSE(child_surface1()->HasActiveFrame());
+  EXPECT_TRUE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id2));
+
+  // The parent should still be blocked on |child_id1| because it's pending.
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(child_id1));
+
+  BeginFrameArgs args =
+      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
+
+  for (int i = 0; i < 3; ++i) {
+    begin_frame_source()->TestOnBeginFrame(args);
+    // There is still a looming deadline! Eeek!
+    EXPECT_TRUE(dependency_tracker().has_deadline());
+
+    // parent_support is still blocked on |child_id1|.
+    EXPECT_FALSE(parent_surface()->HasActiveFrame());
+    EXPECT_TRUE(parent_surface()->HasPendingFrame());
+    EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+                UnorderedElementsAre(child_id1));
+
+    // child_support1 is still blocked on |child_id2|.
+    EXPECT_FALSE(child_surface1()->HasActiveFrame());
+    EXPECT_TRUE(child_surface1()->HasPendingFrame());
+    EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(),
+                UnorderedElementsAre(child_id2));
+  }
+
+  begin_frame_source()->TestOnBeginFrame(args);
+
+  // The deadline has passed.
+  EXPECT_FALSE(dependency_tracker().has_deadline());
+
+  // parent_surface has been activated.
+  EXPECT_TRUE(parent_surface()->HasActiveFrame());
+  EXPECT_FALSE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty());
+
+  // child_surface1 has been activated.
+  EXPECT_TRUE(child_surface1()->HasActiveFrame());
+  EXPECT_FALSE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(), IsEmpty());
+}
+
+// Verifies that the deadline does not reset if we submit CompositorFrames
+// to new Surfaces with unresolved dependencies.
+TEST_F(CompositorFrameSinkSupportTest,
+       DisplayCompositorLockingFramesSubmittedAfterDeadlineSet) {
+  const SurfaceId arbitrary_id = MakeSurfaceId(kArbitraryFrameSink, 1);
+  BeginFrameArgs args =
+      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
+  for (int i = 0; i < 3; ++i) {
+    LocalSurfaceId local_surface_id(1, base::UnguessableToken::Create());
+    support(i).SubmitCompositorFrame(local_surface_id,
+                                     MakeCompositorFrame({arbitrary_id}));
+    // The deadline has been set.
+    EXPECT_TRUE(dependency_tracker().has_deadline());
+
+    // support(i) should be blocked on arbitrary_id.
+    EXPECT_FALSE(surface(i)->HasActiveFrame());
+    EXPECT_TRUE(surface(i)->HasPendingFrame());
+    EXPECT_THAT(surface(i)->blocking_surfaces_for_testing(),
+                UnorderedElementsAre(arbitrary_id));
+
+    // Issue a BeginFrame to get closer to the deadline.
+    begin_frame_source()->TestOnBeginFrame(args);
+  }
+
+  // The deadline hits and all the Surfaces should activate.
+  begin_frame_source()->TestOnBeginFrame(args);
+  for (int i = 0; i < 3; ++i) {
+    EXPECT_TRUE(surface(i)->HasActiveFrame());
+    EXPECT_FALSE(surface(i)->HasPendingFrame());
+    EXPECT_THAT(surface(i)->blocking_surfaces_for_testing(), IsEmpty());
+  }
+}
+
+// This test verifies at the Surface activates once a CompositorFrame is
+// submitted that has no unresolved dependencies.
+TEST_F(CompositorFrameSinkSupportTest,
+       DisplayCompositorLockingNewFrameOverridesOldDependencies) {
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId arbitrary_id = MakeSurfaceId(kArbitraryFrameSink, 1);
+
+  // Submit a CompositorFrame that depends on |arbitrary_id|.
+  parent_support().SubmitCompositorFrame(parent_id.local_surface_id(),
+                                         MakeCompositorFrame({arbitrary_id}));
+
+  // Verify that the CompositorFrame is blocked on |arbitrary_id|.
+  EXPECT_FALSE(parent_surface()->HasActiveFrame());
+  EXPECT_TRUE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(),
+              UnorderedElementsAre(arbitrary_id));
+
+  // Submit a CompositorFrame that has no dependencies.
+  parent_support().SubmitCompositorFrame(
+      parent_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
+
+  // Verify that the CompositorFrame has been activated.
+  EXPECT_TRUE(parent_surface()->HasActiveFrame());
+  EXPECT_FALSE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty());
+}
+
+}  // namespace test
+}  // namespace cc
diff --git a/cc/surfaces/surface.h b/cc/surfaces/surface.h
index 0e74e16e..a427a822 100644
--- a/cc/surfaces/surface.h
+++ b/cc/surfaces/surface.h
@@ -105,6 +105,10 @@
     return referenced_surfaces_;
   }
 
+  const SurfaceDependencies& blocking_surfaces_for_testing() const {
+    return blocking_surfaces_;
+  }
+
   bool HasActiveFrame() const { return active_frame_.has_value(); }
   bool HasPendingFrame() const { return pending_frame_.has_value(); }
 
@@ -136,6 +140,7 @@
   // on multiple Displays.
   std::set<BeginFrameSource*> begin_frame_sources_;
 
+  // The total set of CompositorFrames referenced by the active CompositorFrame.
   std::vector<SurfaceId> referenced_surfaces_;
 
   SurfaceDependencies blocking_surfaces_;
diff --git a/cc/surfaces/surface_factory_unittest.cc b/cc/surfaces/surface_factory_unittest.cc
index 28c8042..99a890ef 100644
--- a/cc/surfaces/surface_factory_unittest.cc
+++ b/cc/surfaces/surface_factory_unittest.cc
@@ -477,7 +477,8 @@
 
 // Tests doing an EvictSurface before shutting down the factory.
 TEST_F(SurfaceFactoryTest, EvictSurface) {
-  LocalSurfaceId id(7, kArbitraryToken);
+  LocalSurfaceId local_surface_id(7, kArbitraryToken);
+  SurfaceId id(kArbitraryFrameSinkId, local_surface_id);
 
   TransferableResource resource;
   resource.id = 1;
@@ -485,11 +486,14 @@
   CompositorFrame frame;
   frame.resource_list.push_back(resource);
   uint32_t execute_count = 0;
-  factory_->SubmitCompositorFrame(id, std::move(frame),
+  factory_->SubmitCompositorFrame(local_surface_id, std::move(frame),
                                   base::Bind(&DrawCallback, &execute_count));
-  EXPECT_EQ(last_created_surface_id().local_surface_id(), id);
+  EXPECT_EQ(last_created_surface_id().local_surface_id(), local_surface_id);
   local_surface_id_ = LocalSurfaceId();
+
+  EXPECT_TRUE(manager_.GetSurfaceForId(id));
   factory_->EvictSurface();
+  EXPECT_FALSE(manager_.GetSurfaceForId(id));
   EXPECT_EQ(1u, execute_count);
 }
 
@@ -535,7 +539,6 @@
       SurfaceSequence(kArbitraryFrameSinkId, 4));
   factory2->EvictSurface();
 
-  CompositorFrame frame;
   DCHECK(manager_.GetSurfaceForId(id2));
   manager_.SatisfySequence(SurfaceSequence(kArbitraryFrameSinkId, 4));
   manager_.SatisfySequence(SurfaceSequence(kArbitraryFrameSinkId, 6));
diff --git a/cc/surfaces/surface_unittest.cc b/cc/surfaces/surface_unittest.cc
index 46bf249e..c47e8a67 100644
--- a/cc/surfaces/surface_unittest.cc
+++ b/cc/surfaces/surface_unittest.cc
@@ -20,14 +20,6 @@
 
 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
 
-CompositorFrame MakeCompositorFrame(
-    std::vector<SurfaceId> referenced_surfaces) {
-  CompositorFrame compositor_frame;
-  compositor_frame.metadata.referenced_surfaces =
-      std::move(referenced_surfaces);
-  return compositor_frame;
-}
-
 class FakeSurfaceFactoryClient : public SurfaceFactoryClient {
  public:
   FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {}
@@ -44,398 +36,6 @@
   BeginFrameSource* begin_frame_source_;
 };
 
-// Surface 1 is blocked on Surface 2 and Surface 3.
-TEST(SurfaceTest, DisplayCompositorLockingBlockedOnTwo) {
-  SurfaceManager manager;
-  std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
-      new FakeExternalBeginFrameSource(0.f, false));
-
-  std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
-      new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
-  manager.SetDependencyTracker(std::move(dependency_tracker));
-
-  LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
-  SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
-
-  LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
-  SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
-
-  LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
-  SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
-
-  FakeSurfaceFactoryClient surface_factory_client1;
-  SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
-                          &surface_factory_client1);
-  factory1.SubmitCompositorFrame(
-      local_surface_id1, MakeCompositorFrame({surface_id2, surface_id3}),
-      SurfaceFactory::DrawCallback());
-  EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
-
-  // |factory1| is blocked on |surface_id2| and |surface_id3|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  FakeSurfaceFactoryClient surface_factory_client2;
-  SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
-                          &surface_factory_client2);
-  factory2.SubmitCompositorFrame(local_surface_id2,
-                                 MakeCompositorFrame(std::vector<SurfaceId>()),
-                                 SurfaceFactory::DrawCallback());
-
-  EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
-  EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
-
-  // |factory1| is blocked on just |surface_id3|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  FakeSurfaceFactoryClient surface_factory_client3;
-  SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
-                          &surface_factory_client3);
-  factory3.SubmitCompositorFrame(local_surface_id3,
-                                 MakeCompositorFrame(std::vector<SurfaceId>()),
-                                 SurfaceFactory::DrawCallback());
-  EXPECT_FALSE(manager.dependency_tracker()->has_deadline());
-
-  // |factory1|'s Frame is now active.
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  factory1.EvictSurface();
-  factory2.EvictSurface();
-  factory3.EvictSurface();
-
-  // Destroy the SurfaceDependencyTracker before we destroy the
-  // BeginFrameSource.
-  manager.SetDependencyTracker(nullptr);
-}
-
-// Surface 1 is blocked on Surface 2 which is blocked on Surface 3.
-TEST(SurfaceTest, DisplayCompositorLockingBlockedChain) {
-  SurfaceManager manager;
-  std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
-      new FakeExternalBeginFrameSource(0.f, false));
-
-  std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
-      new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
-  manager.SetDependencyTracker(std::move(dependency_tracker));
-
-  LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
-  SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
-
-  LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
-  SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
-
-  LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
-  SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
-
-  FakeSurfaceFactoryClient surface_factory_client1;
-  SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
-                          &surface_factory_client1);
-  factory1.SubmitCompositorFrame(local_surface_id1,
-                                 MakeCompositorFrame({surface_id2}),
-                                 SurfaceFactory::DrawCallback());
-
-  // |factory1| is blocked on |surface_id2|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  FakeSurfaceFactoryClient surface_factory_client2;
-  SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
-                          &surface_factory_client2);
-  factory2.SubmitCompositorFrame(local_surface_id2,
-                                 MakeCompositorFrame({surface_id3}),
-                                 SurfaceFactory::DrawCallback());
-
-  // |factory2| is blocked on |surface_id3|.
-  EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
-
-  // |factory1| is still blocked on just |surface_id2|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  FakeSurfaceFactoryClient surface_factory_client3;
-  SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
-                          &surface_factory_client3);
-  CompositorFrame frame3;
-  factory3.SubmitCompositorFrame(local_surface_id3,
-                                 MakeCompositorFrame(std::vector<SurfaceId>()),
-                                 SurfaceFactory::DrawCallback());
-
-  // |factory1|'s Frame is now active.
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  // |factory2|'s Frame is now active.
-  EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
-
-  factory1.EvictSurface();
-  factory2.EvictSurface();
-  factory3.EvictSurface();
-
-  // Destroy the SurfaceDependencyTracker before we destroy the
-  // BeginFrameSource.
-  manager.SetDependencyTracker(nullptr);
-}
-
-// Surface 1 and Surface 2 are blocked on Surface 3.
-TEST(SurfaceTest, DisplayCompositorLockingTwoBlockedOnOne) {
-  SurfaceManager manager;
-  std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
-      new FakeExternalBeginFrameSource(0.f, false));
-
-  std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
-      new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
-  manager.SetDependencyTracker(std::move(dependency_tracker));
-
-  LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
-  SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
-
-  LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
-  SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
-
-  LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
-  SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
-
-  FakeSurfaceFactoryClient surface_factory_client1;
-  SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
-                          &surface_factory_client1);
-  factory1.SubmitCompositorFrame(local_surface_id1,
-                                 MakeCompositorFrame({surface_id3}),
-                                 SurfaceFactory::DrawCallback());
-
-  // |factory1| is blocked on |surface_id3|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  FakeSurfaceFactoryClient surface_factory_client2;
-  SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
-                          &surface_factory_client2);
-  factory2.SubmitCompositorFrame(local_surface_id2,
-                                 MakeCompositorFrame({surface_id3}),
-                                 SurfaceFactory::DrawCallback());
-
-  // |factory2| is blocked on |surface_id3|.
-  EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
-
-  // |factory1| is still blocked on |surface_id3|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  FakeSurfaceFactoryClient surface_factory_client3;
-  SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
-                          &surface_factory_client3);
-  factory3.SubmitCompositorFrame(local_surface_id3,
-                                 MakeCompositorFrame(std::vector<SurfaceId>()),
-                                 SurfaceFactory::DrawCallback());
-
-  // |factory1|'s Frame is now active.
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  // |factory2|'s Frame is now active.
-  EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
-
-  factory1.EvictSurface();
-  factory2.EvictSurface();
-  factory3.EvictSurface();
-
-  // Destroy the SurfaceDependencyTracker before we destroy the
-  // BeginFrameSource.
-  manager.SetDependencyTracker(nullptr);
-}
-
-// |factory1| is blocked on |surface_id2| but the deadline hits.
-TEST(SurfaceTest, DisplayCompositorLockingDeadlineHits) {
-  SurfaceManager manager;
-  std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
-      new FakeExternalBeginFrameSource(0.f, false));
-
-  std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
-      new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
-  manager.SetDependencyTracker(std::move(dependency_tracker));
-
-  LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
-  SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
-
-  LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
-  SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
-
-  LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
-  SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
-
-  FakeSurfaceFactoryClient surface_factory_client1;
-  SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
-                          &surface_factory_client1);
-  CompositorFrame frame;
-  factory1.SubmitCompositorFrame(local_surface_id1,
-                                 MakeCompositorFrame({surface_id2}),
-                                 SurfaceFactory::DrawCallback());
-  EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
-
-  // |factory1| is blocked on |surface_id2|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-  FakeSurfaceFactoryClient surface_factory_client2;
-  SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
-                          &surface_factory_client2);
-  factory2.SubmitCompositorFrame(local_surface_id2,
-                                 MakeCompositorFrame({surface_id3}),
-                                 SurfaceFactory::DrawCallback());
-  EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
-
-  // |factory2| is blocked on |surface_id3|.
-  EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
-
-  BeginFrameArgs args =
-      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
-
-  for (int i = 0; i < 3; ++i) {
-    begin_frame_source->TestOnBeginFrame(args);
-    // |factory1| is still blocked on |surface_id2|.
-    EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-    EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-
-    // |factory2| is still blcoked on |surface_id3|.
-    EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
-    EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
-  }
-
-  begin_frame_source->TestOnBeginFrame(args);
-
-  // |factory1| and |factory2| are no longer blocked.
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
-  EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
-  EXPECT_FALSE(manager.dependency_tracker()->has_deadline());
-
-  factory1.EvictSurface();
-  factory2.EvictSurface();
-
-  // Destroy the SurfaceDependencyTracker before we destroy the
-  // BeginFrameSource.
-  manager.SetDependencyTracker(nullptr);
-}
-
-// Verifies that the deadline does not reset if we submit CompositorFrames
-// to new Surfaces with unresolved dependencies.
-TEST(SurfaceTest, DisplayCompositorLockingFramesSubmittedAfterDeadlineSet) {
-  SurfaceManager manager;
-  std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
-      new FakeExternalBeginFrameSource(0.f, false));
-
-  std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
-      new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
-  manager.SetDependencyTracker(std::move(dependency_tracker));
-
-  LocalSurfaceId local_surface_id(1, base::UnguessableToken::Create());
-  SurfaceId surface_id(FrameSinkId(1, 1), local_surface_id);
-
-  std::vector<std::unique_ptr<SurfaceFactoryClient>> surface_factory_clients;
-  std::vector<std::unique_ptr<SurfaceFactory>> surface_factories;
-
-  BeginFrameArgs args =
-      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
-
-  // Issue BeginFrames and create new surfaces with dependencies.
-  for (int i = 0; i < 3; ++i) {
-    LocalSurfaceId local_surface_id(1, base::UnguessableToken::Create());
-    std::unique_ptr<SurfaceFactoryClient> surface_factory_client(
-        base::MakeUnique<FakeSurfaceFactoryClient>());
-    std::unique_ptr<SurfaceFactory> surface_factory(
-        base::MakeUnique<SurfaceFactory>(FrameSinkId(2 + i, 2 + i), &manager,
-                                         surface_factory_client.get()));
-    surface_factory->SubmitCompositorFrame(local_surface_id,
-                                           MakeCompositorFrame({surface_id}),
-                                           SurfaceFactory::DrawCallback());
-    // The deadline has been set.
-    EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
-
-    // |surface_factory| is blocked on |surface_id2|.
-    EXPECT_FALSE(
-        surface_factory->current_surface_for_testing()->HasActiveFrame());
-    EXPECT_TRUE(
-        surface_factory->current_surface_for_testing()->HasPendingFrame());
-
-    // Issue a BeginFrame.
-    begin_frame_source->TestOnBeginFrame(args);
-
-    surface_factory_clients.push_back(std::move(surface_factory_client));
-    surface_factories.push_back(std::move(surface_factory));
-  }
-
-  // This BeginFrame should cause all the Surfaces to activate.
-  begin_frame_source->TestOnBeginFrame(args);
-
-  // Verify that all the Surfaces have activated.
-  for (int i = 0; i < 3; ++i) {
-    EXPECT_TRUE(
-        surface_factories[i]->current_surface_for_testing()->HasActiveFrame());
-    EXPECT_FALSE(
-        surface_factories[i]->current_surface_for_testing()->HasPendingFrame());
-    // We must evict the surface before we destroy the factories.
-    surface_factories[i]->EvictSurface();
-  }
-
-  // Destroy all the SurfaceFactories and their clients.
-  surface_factories.clear();
-  surface_factory_clients.clear();
-
-  // Destroy the SurfaceDependencyTracker before we destroy the
-  // BeginFrameSource.
-  manager.SetDependencyTracker(nullptr);
-}
-
-// Frame activates once a new frame is submitted.
-TEST(SurfaceTest, DisplayCompositorLockingNewFrameOverridesOldDependencies) {
-  SurfaceManager manager;
-  std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
-      new FakeExternalBeginFrameSource(0.f, false));
-
-  manager.SetDependencyTracker(base::MakeUnique<SurfaceDependencyTracker>(
-      &manager, begin_frame_source.get()));
-
-  LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
-  SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
-
-  LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
-  SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
-
-  FakeSurfaceFactoryClient surface_factory_client1;
-  SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
-                          &surface_factory_client1);
-  factory1.SubmitCompositorFrame(local_surface_id1,
-                                 MakeCompositorFrame({surface_id2}),
-                                 SurfaceFactory::DrawCallback());
-
-  // |factory1|'s Frame is blocked on |surface_id2|.
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
-  EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
-
-  // Another frame is submitted to |factory1| that has no dependencies.
-  factory1.SubmitCompositorFrame(local_surface_id1,
-                                 MakeCompositorFrame(std::vector<SurfaceId>()),
-                                 SurfaceFactory::DrawCallback());
-  EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
-  EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
-  EXPECT_FALSE(manager.dependency_tracker()->has_deadline());
-
-  factory1.EvictSurface();
-
-  // Destroy the SurfaceDependencyTracker before we destroy the
-  // BeginFrameSource.
-  manager.SetDependencyTracker(nullptr);
-}
-
 TEST(SurfaceTest, SurfaceLifetime) {
   SurfaceManager manager;
   FakeSurfaceFactoryClient surface_factory_client;
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index 93cdd29..1dcc40c 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -6,6 +6,7 @@
 
 #include <inttypes.h>
 
+#include "base/auto_reset.h"
 #include "base/debug/alias.h"
 #include "base/memory/discardable_memory_allocator.h"
 #include "base/memory/memory_coordinator_client_registry.h"
@@ -1268,24 +1269,15 @@
 }
 
 void GpuImageDecodeCache::OnMemoryStateChange(base::MemoryState state) {
-  switch (state) {
-    case base::MemoryState::NORMAL:
-      memory_state_ = state;
-      break;
-    case base::MemoryState::THROTTLED:
-    case base::MemoryState::SUSPENDED: {
-      memory_state_ = state;
+  memory_state_ = state;
+}
 
-      // We've just changed our memory state to a (potentially) more
-      // restrictive one. Re-enforce cache limits.
-      base::AutoLock lock(lock_);
-      EnsureCapacity(0);
-      break;
-    }
-    case base::MemoryState::UNKNOWN:
-      // NOT_REACHED.
-      break;
-  }
+void GpuImageDecodeCache::OnPurgeMemory() {
+  base::AutoLock lock(lock_);
+  // Temporary changes |memory_state_| to free up cache as much as possible.
+  base::AutoReset<base::MemoryState> reset(&memory_state_,
+                                           base::MemoryState::SUSPENDED);
+  EnsureCapacity(0);
 }
 
 }  // namespace cc
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h
index f2b21f1..14e4996 100644
--- a/cc/tiles/gpu_image_decode_cache.h
+++ b/cc/tiles/gpu_image_decode_cache.h
@@ -130,6 +130,7 @@
 
   // base::MemoryCoordinatorClient overrides.
   void OnMemoryStateChange(base::MemoryState state) override;
+  void OnPurgeMemory() override;
 
   // Called by Decode / Upload tasks.
   void DecodeImage(const DrawImage& image);
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc
index aeeb6880..901c7f8 100644
--- a/cc/tiles/gpu_image_decode_cache_unittest.cc
+++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -1336,7 +1336,8 @@
   DCHECK_EQ(cache.GetBytesUsedForTesting(), 0u);
   DCHECK_EQ(cache.GetNumCacheEntriesForTesting(), 1u);
 
-  // Set us to the SUSPENDED state.
+  // Set us to the SUSPENDED state with purging.
+  cache.OnPurgeMemory();
   cache.OnMemoryStateChange(base::MemoryState::SUSPENDED);
 
   // Nothing should be cached.
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc
index 53758c02..13ed0512 100644
--- a/cc/tiles/software_image_decode_cache.cc
+++ b/cc/tiles/software_image_decode_cache.cc
@@ -797,12 +797,10 @@
   }
 }
 
-void SoftwareImageDecodeCache::ReduceCacheUsage() {
+void SoftwareImageDecodeCache::ReduceCacheUsageUntilWithinLimit(size_t limit) {
   TRACE_EVENT0("cc", "SoftwareImageDecodeCache::ReduceCacheUsage");
-  base::AutoLock lock(lock_);
-  size_t num_to_remove = (decoded_images_.size() > max_items_in_cache_)
-                             ? (decoded_images_.size() - max_items_in_cache_)
-                             : 0;
+  size_t num_to_remove =
+      (decoded_images_.size() > limit) ? (decoded_images_.size() - limit) : 0;
   for (auto it = decoded_images_.rbegin();
        num_to_remove != 0 && it != decoded_images_.rend();) {
     if (it->second->is_locked()) {
@@ -815,6 +813,11 @@
   }
 }
 
+void SoftwareImageDecodeCache::ReduceCacheUsage() {
+  base::AutoLock lock(lock_);
+  ReduceCacheUsageUntilWithinLimit(max_items_in_cache_);
+}
+
 void SoftwareImageDecodeCache::RemovePendingTask(const ImageKey& key,
                                                  DecodeTaskType task_type) {
   base::AutoLock lock(lock_);
@@ -1173,7 +1176,11 @@
         return;
     }
   }
-  ReduceCacheUsage();
+}
+
+void SoftwareImageDecodeCache::OnPurgeMemory() {
+  base::AutoLock lock(lock_);
+  ReduceCacheUsageUntilWithinLimit(0);
 }
 
 }  // namespace cc
diff --git a/cc/tiles/software_image_decode_cache.h b/cc/tiles/software_image_decode_cache.h
index 1f3d72f..277d4e7 100644
--- a/cc/tiles/software_image_decode_cache.h
+++ b/cc/tiles/software_image_decode_cache.h
@@ -271,8 +271,13 @@
                                const char* cache_name,
                                base::trace_event::ProcessMemoryDump* pmd) const;
 
+  // Removes unlocked decoded images until the number of decoded images is
+  // reduced within the given limit.
+  void ReduceCacheUsageUntilWithinLimit(size_t limit);
+
   // Overriden from base::MemoryCoordinatorClient.
   void OnMemoryStateChange(base::MemoryState state) override;
+  void OnPurgeMemory() override;
 
   // Helper method to get the different tasks. Note that this should be used as
   // if it was public (ie, all of the locks need to be properly acquired).
diff --git a/cc/tiles/tile_draw_info.cc b/cc/tiles/tile_draw_info.cc
index 560345ad..2e4eebb7 100644
--- a/cc/tiles/tile_draw_info.cc
+++ b/cc/tiles/tile_draw_info.cc
@@ -9,17 +9,9 @@
 
 namespace cc {
 
-TileDrawInfo::TileDrawInfo()
-    : was_ever_ready_to_draw_(false),
-      was_ever_used_to_draw_(false),
-      was_a_prepaint_tile_(false) {}
-
+TileDrawInfo::TileDrawInfo() = default;
 TileDrawInfo::~TileDrawInfo() {
   DCHECK(!resource_);
-  if (was_ever_ready_to_draw_ && was_a_prepaint_tile_) {
-    UMA_HISTOGRAM_BOOLEAN("Renderer4.ReadyToDrawTileDrawStatus",
-                          was_ever_used_to_draw_);
-  }
 }
 
 void TileDrawInfo::AsValueInto(base::trace_event::TracedValue* state) const {
diff --git a/cc/tiles/tile_draw_info.h b/cc/tiles/tile_draw_info.h
index 0a4db758..8ba0885 100644
--- a/cc/tiles/tile_draw_info.h
+++ b/cc/tiles/tile_draw_info.h
@@ -81,9 +81,6 @@
 
   void AsValueInto(base::trace_event::TracedValue* state) const;
 
-  void set_was_ever_used_to_draw() { was_ever_used_to_draw_ = true; }
-  void set_was_a_prepaint_tile() { was_a_prepaint_tile_ = true; }
-
  private:
   friend class Tile;
   friend class TileManager;
@@ -98,7 +95,6 @@
 
   void set_resource_ready_for_draw() {
     is_resource_ready_to_draw_ = true;
-    was_ever_ready_to_draw_ = true;
   }
 
   Resource* TakeResource();
@@ -106,7 +102,6 @@
   void set_solid_color(const SkColor& color) {
     mode_ = SOLID_COLOR_MODE;
     solid_color_ = color;
-    was_ever_ready_to_draw_ = true;
   }
 
   void set_oom() { mode_ = OOM_MODE; }
@@ -116,11 +111,6 @@
   Resource* resource_ = nullptr;
   bool contents_swizzled_ = false;
   bool is_resource_ready_to_draw_ = false;
-
-  // Used for gathering UMA stats.
-  bool was_ever_ready_to_draw_ : 1;
-  bool was_ever_used_to_draw_ : 1;
-  bool was_a_prepaint_tile_ : 1;
 };
 
 }  // namespace cc
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 12f3dfd..c7c9ad91 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -669,8 +669,6 @@
               tile->content_rect(), tile->contents_scale(), &color);
       if (is_solid_color) {
         tile->draw_info().set_solid_color(color);
-        if (!tile_is_needed_now)
-          tile->draw_info().set_was_a_prepaint_tile();
         client_->NotifyTileStateChanged(tile);
         continue;
       }
@@ -730,13 +728,6 @@
 
     memory_usage += memory_required_by_tile_to_be_scheduled;
     work_to_schedule.tiles_to_raster.push_back(prioritized_tile);
-
-    // Since we scheduled the tile, set whether it was a prepaint or not
-    // assuming that the tile will successfully finish running. We don't have
-    // priority information at the time the tile completes, so it should be done
-    // here.
-    if (!tile_is_needed_now)
-      tile->draw_info().set_was_a_prepaint_tile();
   }
 
   // Debugging to check that remaining tiles in the priority queue are not in
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
index 6db719eae2..faf8149 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
@@ -88,9 +88,9 @@
     private static final int FRE_PROGRESS_COMPLETED_NOT_SIGNED_IN = 5;
     private static final int FRE_PROGRESS_MAX = 6;
     private static final EnumeratedHistogramSample sMobileFreProgressMainIntentHistogram =
-            new EnumeratedHistogramSample("MobileFre.SignInChoice.MainIntent", FRE_PROGRESS_MAX);
+            new EnumeratedHistogramSample("MobileFre.Progress.MainIntent", FRE_PROGRESS_MAX);
     private static final EnumeratedHistogramSample sMobileFreProgressViewIntentHistogram =
-            new EnumeratedHistogramSample("MobileFre.SignInChoice.ViewIntent", FRE_PROGRESS_MAX);
+            new EnumeratedHistogramSample("MobileFre.Progress.ViewIntent", FRE_PROGRESS_MAX);
 
     @VisibleForTesting
     static FirstRunGlue sGlue = new FirstRunGlueImpl();
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc
index c35dd61d..2210192 100644
--- a/chrome/app/chrome_main.cc
+++ b/chrome/app/chrome_main.cc
@@ -4,10 +4,11 @@
 
 #include <stdint.h>
 
-#include "build/build_config.h"
 #include "base/command_line.h"
 #include "base/time/time.h"
+#include "build/build_config.h"
 #include "chrome/app/chrome_main_delegate.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/common/features.h"
 #include "content/public/app/content_main.h"
 #include "content/public/common/content_switches.h"
@@ -101,7 +102,7 @@
   version_info::Channel channel = chrome::GetChannel();
   if (channel == version_info::Channel::CANARY ||
       channel == version_info::Channel::UNKNOWN) {
-    if (command_line->HasSwitch("mash"))
+    if (command_line->HasSwitch(switches::kMash))
       return MashMain();
     WaitForMashDebuggerIfNecessary();
     if (service_manager::ServiceManagerIsRemote())
diff --git a/chrome/app/mash/BUILD.gn b/chrome/app/mash/BUILD.gn
index 292a1919..a45a8223 100644
--- a/chrome/app/mash/BUILD.gn
+++ b/chrome/app/mash/BUILD.gn
@@ -14,6 +14,7 @@
   deps = [
     ":chrome_mash_catalog",
     "//base:i18n",
+    "//chrome/common:constants",
     "//components/tracing:startup_tracing",
     "//content/public/common",
     "//mash/common",
diff --git a/chrome/app/mash/DEPS b/chrome/app/mash/DEPS
index 8fdd8af..7d04821 100644
--- a/chrome/app/mash/DEPS
+++ b/chrome/app/mash/DEPS
@@ -5,6 +5,7 @@
   # depend upon chrome code in any way.
   "-chrome",
   "+chrome/app/mash",
+  "+chrome/common/chrome_switches.h",
   "+components/font_service",
   "+components/tracing",
   "+services/ui",
diff --git a/chrome/app/mash/mash_runner.cc b/chrome/app/mash/mash_runner.cc
index e436fbd..fc63098 100644
--- a/chrome/app/mash/mash_runner.cc
+++ b/chrome/app/mash/mash_runner.cc
@@ -28,6 +28,7 @@
 #include "base/threading/thread.h"
 #include "base/trace_event/trace_event.h"
 #include "chrome/app/mash/chrome_mash_catalog.h"
+#include "chrome/common/chrome_switches.h"
 #include "components/tracing/common/trace_to_console.h"
 #include "components/tracing/common/tracing_switches.h"
 #include "content/public/common/content_switches.h"
@@ -110,13 +111,13 @@
 
     // When launching the browser process, ensure that we don't inherit the
     // --mash flag so it proceeds with the normal content/browser startup path.
-    // Eliminate all copies in case the developer passed more than one.
-    base::CommandLine::StringVector new_argv;
-    for (const base::CommandLine::StringType& arg : command_line->argv()) {
-      if (arg != FILE_PATH_LITERAL("--mash"))
-        new_argv.push_back(arg);
+    base::CommandLine::SwitchMap new_switches = command_line->GetSwitches();
+    new_switches.erase(switches::kMash);
+    *command_line = base::CommandLine(command_line->GetProgram());
+    for (const std::pair<std::string, base::CommandLine::StringType>& sw :
+         new_switches) {
+      command_line->AppendSwitchNative(sw.first, sw.second);
     }
-    *command_line = base::CommandLine(new_argv);
   }
 
   DISALLOW_COPY_AND_ASSIGN(ServiceProcessLauncherDelegateImpl);
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index fb8fbf2..63fac04 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -926,9 +926,11 @@
      IDS_FLAGS_RUN_ALL_FLASH_IN_ALLOW_MODE_DESCRIPTION, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kRunAllFlashInAllowMode)},
 #endif  // ENABLE_PLUGINS
-#if defined(OS_CHROMEOS)
+#if BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
     {"mash", IDS_FLAGS_USE_MASH_NAME, IDS_FLAGS_USE_MASH_DESCRIPTION, kOsCrOS,
-     SINGLE_VALUE_TYPE("mash")},
+     SINGLE_VALUE_TYPE(switches::kMash)},
+#endif  // BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
+#if defined(OS_CHROMEOS)
     {"allow-touchpad-three-finger-click",
      IDS_FLAGS_ALLOW_TOUCHPAD_THREE_FINGER_CLICK_NAME,
      IDS_FLAGS_ALLOW_TOUCHPAD_THREE_FINGER_CLICK_DESCRIPTION, kOsCrOS,
diff --git a/chrome/browser/apps/app_browsertest.cc b/chrome/browser/apps/app_browsertest.cc
index 823407a..36b4e308 100644
--- a/chrome/browser/apps/app_browsertest.cc
+++ b/chrome/browser/apps/app_browsertest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "apps/launcher.h"
+#include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
@@ -42,7 +43,6 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/test/browser_test_utils.h"
-#include "content/public/test/test_utils.h"
 #include "extensions/browser/app_window/app_window.h"
 #include "extensions/browser/app_window/app_window_registry.h"
 #include "extensions/browser/app_window/native_app_window.h"
@@ -123,10 +123,7 @@
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 class ScopedPreviewTestingDelegate : PrintPreviewUI::TestingDelegate {
  public:
-  explicit ScopedPreviewTestingDelegate(bool auto_cancel)
-      : auto_cancel_(auto_cancel),
-        total_page_count_(1),
-        rendered_page_count_(0) {
+  ScopedPreviewTestingDelegate() {
     PrintPreviewUI::SetDelegateForTesting(this);
   }
 
@@ -135,9 +132,6 @@
   }
 
   // PrintPreviewUI::TestingDelegate implementation.
-  bool IsAutoCancelEnabled() override { return auto_cancel_; }
-
-  // PrintPreviewUI::TestingDelegate implementation.
   void DidGetPreviewPageCount(int page_count) override {
     total_page_count_ = page_count;
   }
@@ -147,18 +141,18 @@
     dialog_size_ = preview_dialog->GetContainerBounds().size();
     ++rendered_page_count_;
     CHECK(rendered_page_count_ <= total_page_count_);
-    if (waiting_runner_.get() && rendered_page_count_ == total_page_count_) {
-      waiting_runner_->Quit();
+    if (rendered_page_count_ == total_page_count_ && run_loop_)  {
+      run_loop_->Quit();
     }
   }
 
   void WaitUntilPreviewIsReady() {
-    CHECK(!waiting_runner_.get());
-    if (rendered_page_count_ < total_page_count_) {
-      waiting_runner_ = new content::MessageLoopRunner;
-      waiting_runner_->Run();
-      waiting_runner_ = NULL;
-    }
+    if (rendered_page_count_ >= total_page_count_)
+      return;
+
+    base::RunLoop run_loop;
+    base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, &run_loop);
+    run_loop.Run();
   }
 
   gfx::Size dialog_size() {
@@ -166,10 +160,9 @@
   }
 
  private:
-  bool auto_cancel_;
-  int total_page_count_;
-  int rendered_page_count_;
-  scoped_refptr<content::MessageLoopRunner> waiting_runner_;
+  int total_page_count_ = 1;
+  int rendered_page_count_ = 0;
+  base::RunLoop* run_loop_ = nullptr;
   gfx::Size dialog_size_;
 };
 
@@ -1138,17 +1131,9 @@
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 
-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
-#define MAYBE_WindowDotPrintShouldBringUpPrintPreview \
-    DISABLED_WindowDotPrintShouldBringUpPrintPreview
-#else
-#define MAYBE_WindowDotPrintShouldBringUpPrintPreview \
-    WindowDotPrintShouldBringUpPrintPreview
-#endif
-
 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
-                       MAYBE_WindowDotPrintShouldBringUpPrintPreview) {
-  ScopedPreviewTestingDelegate preview_delegate(true);
+                       WindowDotPrintShouldBringUpPrintPreview) {
+  ScopedPreviewTestingDelegate preview_delegate;
   ASSERT_TRUE(RunPlatformAppTest("platform_apps/print_api")) << message_;
   preview_delegate.WaitUntilPreviewIsReady();
 }
@@ -1156,7 +1141,7 @@
 // This test verifies that http://crbug.com/297179 is fixed.
 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
                        DISABLED_ClosingWindowWhilePrintingShouldNotCrash) {
-  ScopedPreviewTestingDelegate preview_delegate(false);
+  ScopedPreviewTestingDelegate preview_delegate;
   ASSERT_TRUE(RunPlatformAppTest("platform_apps/print_api")) << message_;
   preview_delegate.WaitUntilPreviewIsReady();
   GetFirstAppWindow()->GetBaseWindow()->Close();
@@ -1178,7 +1163,7 @@
   // areas that are too small, and ones with heights less than 191 pixels will
   // have vertical scrollers for their controls that are too small.
   gfx::Size minimum_dialog_size(410, 191);
-  ScopedPreviewTestingDelegate preview_delegate(false);
+  ScopedPreviewTestingDelegate preview_delegate;
   ASSERT_TRUE(RunPlatformAppTest("platform_apps/print_api")) << message_;
   preview_delegate.WaitUntilPreviewIsReady();
   EXPECT_GE(preview_delegate.dialog_size().width(),
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 0a1c5f7a..98690ba 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -468,19 +468,14 @@
 #endif  // defined(OS_MACOSX)
 
 void RegisterComponentsForUpdate() {
-  component_updater::ComponentUpdateService* cus =
-      g_browser_process->component_updater();
+  const auto cus = g_browser_process->component_updater();
 
-  // Registration can be before or after cus->Start() so it is ok to post
-  // a task to the UI thread to do registration once you done the necessary
-  // file IO to know you existing component version.
-#if !defined(OS_ANDROID)
-#if !defined(OS_CHROMEOS)
   if (base::FeatureList::IsEnabled(features::kImprovedRecoveryComponent))
     RegisterRecoveryImprovedComponent(cus, g_browser_process->local_state());
   else
     RegisterRecoveryComponent(cus, g_browser_process->local_state());
-#endif  // !defined(OS_CHROMEOS)
+
+#if !defined(OS_ANDROID)
   RegisterPepperFlashComponent(cus);
 #if !defined(OS_CHROMEOS)
   RegisterSwiftShaderComponent(cus);
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 6d382dd..c9242bc1 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1190,8 +1190,11 @@
     "printing/cups_print_job_notification.h",
     "printing/cups_print_job_notification_manager.cc",
     "printing/cups_print_job_notification_manager.h",
+    "printing/fake_printer_discoverer.cc",
+    "printing/fake_printer_discoverer.h",
     "printing/ppd_provider_factory.cc",
     "printing/ppd_provider_factory.h",
+    "printing/printer_discoverer.h",
     "printing/printer_pref_manager.cc",
     "printing/printer_pref_manager.h",
     "printing/printer_pref_manager_factory.cc",
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
index fb835af..8cc8410c 100644
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
@@ -7,7 +7,6 @@
 #include "ash/common/accelerators/accelerator_controller.h"
 #include "ash/common/accelerators/accelerator_table.h"
 #include "ash/common/accessibility_types.h"
-#include "ash/common/material_design/material_design_controller.h"
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/wm_shell.h"
 #include "ash/shell.h"
@@ -438,13 +437,6 @@
   }
   SendKeyPress(ui::VKEY_RETURN);
 
-  if (!ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-    while (true) {
-      if (base::MatchPattern(speech_monitor_.GetNextUtterance(), "*Bluetooth"))
-        break;
-    }
-  }
-
   // Navigate to return to previous menu button and press it.
   while (true) {
     std::string utterance = speech_monitor_.GetNextUtterance();
@@ -456,13 +448,8 @@
 
   while (true) {
     std::string utterance = speech_monitor_.GetNextUtterance();
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      if (base::MatchPattern(utterance, "Bluetooth*"))
-        break;
-    } else {
-      if (base::MatchPattern(utterance, "*Bluetooth"))
-        break;
-    }
+    if (base::MatchPattern(utterance, "Bluetooth*"))
+      break;
   }
 }
 
diff --git a/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc b/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc
index b6799d49..203765d 100644
--- a/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc
+++ b/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc
@@ -17,6 +17,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/gpu_service_registry.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
@@ -73,10 +74,9 @@
   // Hardcode pid 0 since it is unused in mojo.
   const base::ProcessHandle kUnusedChildProcessHandle =
       base::kNullProcessHandle;
+  mojo::edk::PendingProcessConnection process;
   mojo::edk::PlatformChannelPair channel_pair;
-  std::string child_token = mojo::edk::GenerateRandomToken();
-  mojo::edk::ChildProcessLaunched(kUnusedChildProcessHandle,
-                                  channel_pair.PassServerHandle(), child_token);
+  process.Connect(kUnusedChildProcessHandle, channel_pair.PassServerHandle());
 
   MojoHandle wrapped_handle;
   MojoResult wrap_result = mojo::edk::CreatePlatformHandleWrapper(
@@ -88,14 +88,8 @@
   }
   mojo::ScopedHandle child_handle{mojo::Handle(wrapped_handle)};
 
-  std::string token = mojo::edk::GenerateRandomToken();
-  mojo::ScopedMessagePipeHandle server_pipe =
-      mojo::edk::CreateParentMessagePipe(token, child_token);
-  if (!server_pipe.is_valid()) {
-    LOG(ERROR) << "Invalid pipe";
-    callback.Run(mojo::ScopedHandle(), std::string());
-    return;
-  }
+  std::string token;
+  mojo::ScopedMessagePipeHandle server_pipe = process.CreateMessagePipe(&token);
   callback.Run(std::move(child_handle), token);
 
   mojo::MakeStrongBinding(base::MakeUnique<VideoAcceleratorFactoryService>(),
diff --git a/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc b/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc
index 766d34c4..2a75d861 100644
--- a/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc
+++ b/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc
@@ -176,8 +176,9 @@
 
 // Shows the enrollment screen and simulates an enrollment failure. Verifies
 // that the error screen is displayed.
+// TODO(crbug.com/690634): Disabled due to timeout flakiness.
 IN_PROC_BROWSER_TEST_F(EnterpriseEnrollmentTest,
-                       TestProperPageGetsLoadedOnEnrollmentFailure) {
+                       DISABLED_TestProperPageGetsLoadedOnEnrollmentFailure) {
   ShowEnrollmentScreen();
 
   enrollment_screen()->OnEnrollmentError(policy::EnrollmentStatus::ForStatus(
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index b065b22..6c6b6c4 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -77,6 +77,7 @@
 #include "chrome/browser/ui/app_list/app_list_service.h"
 #include "chrome/browser/ui/ash/ash_util.h"
 #include "chrome/browser/ui/startup/startup_browser_creator.h"
+#include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/logging_chrome.h"
 #include "chrome/common/pref_names.h"
@@ -107,6 +108,7 @@
 #include "components/user_manager/user_manager.h"
 #include "components/user_manager/user_names.h"
 #include "components/user_manager/user_type.h"
+#include "components/version_info/version_info.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/storage_partition.h"
@@ -284,12 +286,37 @@
   if (user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser())
     return false;
 
+  // When running Mus+ash, the flags stored in Profile Prefs will contain
+  // --mash, while the browser command line will not (and should not) have
+  // it, so ignore it for the purpose of comparison.
+  // TODO(mfomitchev): Find a better way. crbug.com/690083
+  bool in_mash = false;
+  base::CommandLine user_flags_no_mash = user_flags;
+
+#if BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
+  in_mash = user_flags.HasSwitch(::switches::kMash);
+  if (in_mash) {
+    base::CommandLine::SwitchMap switches = user_flags.GetSwitches();
+    switches.erase(::switches::kMash);
+    user_flags_no_mash = base::CommandLine(user_flags.GetProgram());
+    for (const std::pair<std::string, base::CommandLine::StringType>& sw :
+         switches) {
+      user_flags_no_mash.AppendSwitchNative(sw.first, sw.second);
+    }
+  }
+#endif  // BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
+
   if (about_flags::AreSwitchesIdenticalToCurrentCommandLine(
-          user_flags, *base::CommandLine::ForCurrentProcess(),
+          user_flags_no_mash, *base::CommandLine::ForCurrentProcess(),
           out_command_line_difference)) {
     return false;
   }
 
+  // TODO(mfomitchev): Browser restart doesn't currently work in Mus+ash.
+  // So if we are running Mustash and we need to restart - just crash right
+  // here. crbug.com/690140
+  CHECK(!in_mash);
+
   return true;
 }
 
diff --git a/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc b/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc
index 00f26a3..dbeb6870 100644
--- a/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "ash/common/login_status.h"
-#include "ash/common/material_design/material_design_controller.h"
 #include "ash/common/system/date/date_default_view.h"
 #include "ash/common/system/date/date_view.h"
 #include "ash/common/system/date/system_info_default_view.h"
@@ -77,79 +76,43 @@
   }
 
   static base::HourClockType TestGetPrimarySystemTrayTimeHourType() {
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      const ash::TraySystemInfo* tray_system_info =
-          ash::Shell::GetInstance()
-              ->GetPrimarySystemTray()
-              ->GetTraySystemInfoForTesting();
-      const ash::tray::TimeView* time_tray =
-          tray_system_info->GetTimeTrayForTesting();
-
-      return time_tray->GetHourTypeForTesting();
-    }
-
-    const ash::TrayDate* tray_date = ash::Shell::GetInstance()
-                                         ->GetPrimarySystemTray()
-                                         ->GetTrayDateForTesting();
-    const ash::tray::TimeView* time_tray = tray_date->GetTimeTrayForTesting();
+    const ash::TraySystemInfo* tray_system_info =
+        ash::Shell::GetInstance()
+            ->GetPrimarySystemTray()
+            ->GetTraySystemInfoForTesting();
+    const ash::tray::TimeView* time_tray =
+        tray_system_info->GetTimeTrayForTesting();
 
     return time_tray->GetHourTypeForTesting();
   }
 
   static bool TestPrimarySystemTrayHasDateDefaultView() {
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      const ash::TraySystemInfo* tray_system_info =
-          ash::Shell::GetInstance()
-              ->GetPrimarySystemTray()
-              ->GetTraySystemInfoForTesting();
-      const ash::SystemInfoDefaultView* system_info_default_view =
-          tray_system_info->GetDefaultViewForTesting();
-      return system_info_default_view != nullptr;
-    }
-
-    const ash::TrayDate* tray_date = ash::Shell::GetInstance()
-                                         ->GetPrimarySystemTray()
-                                         ->GetTrayDateForTesting();
-    const ash::DateDefaultView* date_default_view =
-        tray_date->GetDefaultViewForTesting();
-    return date_default_view != nullptr;
+    const ash::TraySystemInfo* tray_system_info =
+        ash::Shell::GetInstance()
+            ->GetPrimarySystemTray()
+            ->GetTraySystemInfoForTesting();
+    const ash::SystemInfoDefaultView* system_info_default_view =
+        tray_system_info->GetDefaultViewForTesting();
+    return system_info_default_view != nullptr;
   }
 
   static void TestPrimarySystemTrayCreateDefaultView() {
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      ash::TraySystemInfo* tray_system_info =
-          ash::Shell::GetInstance()
-              ->GetPrimarySystemTray()
-              ->GetTraySystemInfoForTesting();
-      tray_system_info->CreateDefaultViewForTesting(
-          ash::LoginStatus::NOT_LOGGED_IN);
-    } else {
-      ash::TrayDate* tray_date = ash::Shell::GetInstance()
-                                     ->GetPrimarySystemTray()
-                                     ->GetTrayDateForTesting();
-      tray_date->CreateDefaultViewForTesting(ash::LoginStatus::NOT_LOGGED_IN);
-    }
+    ash::TraySystemInfo* tray_system_info = ash::Shell::GetInstance()
+                                                ->GetPrimarySystemTray()
+                                                ->GetTraySystemInfoForTesting();
+    tray_system_info->CreateDefaultViewForTesting(
+        ash::LoginStatus::NOT_LOGGED_IN);
   }
 
   static base::HourClockType TestGetPrimarySystemTrayDateHourType() {
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      const ash::TraySystemInfo* tray_system_info =
-          ash::Shell::GetInstance()
-              ->GetPrimarySystemTray()
-              ->GetTraySystemInfoForTesting();
-      const ash::SystemInfoDefaultView* system_info_default_view =
-          tray_system_info->GetDefaultViewForTesting();
+    const ash::TraySystemInfo* tray_system_info =
+        ash::Shell::GetInstance()
+            ->GetPrimarySystemTray()
+            ->GetTraySystemInfoForTesting();
+    const ash::SystemInfoDefaultView* system_info_default_view =
+        tray_system_info->GetDefaultViewForTesting();
 
-      return system_info_default_view->GetDateView()->GetHourTypeForTesting();
-    }
-
-    const ash::TrayDate* tray_date = ash::Shell::GetInstance()
-                                         ->GetPrimarySystemTray()
-                                         ->GetTrayDateForTesting();
-    const ash::DateDefaultView* date_default_view =
-        tray_date->GetDefaultViewForTesting();
-
-    return date_default_view->GetDateView()->GetHourTypeForTesting();
+    return system_info_default_view->GetDateView()->GetHourTypeForTesting();
   }
 
  private:
diff --git a/chromeos/printing/fake_printer_discoverer.cc b/chrome/browser/chromeos/printing/fake_printer_discoverer.cc
similarity index 95%
rename from chromeos/printing/fake_printer_discoverer.cc
rename to chrome/browser/chromeos/printing/fake_printer_discoverer.cc
index 53828d5..7126f92c 100644
--- a/chromeos/printing/fake_printer_discoverer.cc
+++ b/chrome/browser/chromeos/printing/fake_printer_discoverer.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 "chromeos/printing/fake_printer_discoverer.h"
+#include "chrome/browser/chromeos/printing/fake_printer_discoverer.h"
 
 #include <algorithm>
 #include <iterator>
@@ -13,7 +13,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
-#include "chromeos/printing/printer_discoverer.h"
+#include "chrome/browser/chromeos/printing/printer_discoverer.h"
 
 namespace chromeos {
 
diff --git a/chromeos/printing/fake_printer_discoverer.h b/chrome/browser/chromeos/printing/fake_printer_discoverer.h
similarity index 78%
rename from chromeos/printing/fake_printer_discoverer.h
rename to chrome/browser/chromeos/printing/fake_printer_discoverer.h
index d20b39e2..d7f857e 100644
--- a/chromeos/printing/fake_printer_discoverer.h
+++ b/chrome/browser/chromeos/printing/fake_printer_discoverer.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROMEOS_PRINTING_FAKE_PRINTER_DISCOVERER_H_
-#define CHROMEOS_PRINTING_FAKE_PRINTER_DISCOVERER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_FAKE_PRINTER_DISCOVERER_H_
+#define CHROME_BROWSER_CHROMEOS_PRINTING_FAKE_PRINTER_DISCOVERER_H_
 
 #include <vector>
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/printing/printer_discoverer.h"
 #include "chromeos/printing/printer_configuration.h"
-#include "chromeos/printing/printer_discoverer.h"
 
 namespace chromeos {
 
@@ -38,4 +38,4 @@
 
 }  // namespace chromeos
 
-#endif  // CHROMEOS_PRINTING_FAKE_PRINTER_DISCOVERER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_FAKE_PRINTER_DISCOVERER_H_
diff --git a/chromeos/printing/printer_discoverer.h b/chrome/browser/chromeos/printing/printer_discoverer.h
similarity index 91%
rename from chromeos/printing/printer_discoverer.h
rename to chrome/browser/chromeos/printing/printer_discoverer.h
index 6d9929a..b0a8639 100644
--- a/chromeos/printing/printer_discoverer.h
+++ b/chrome/browser/chromeos/printing/printer_discoverer.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 CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
-#define CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
+#define CHROME_BROWSER_CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
 
 #include <memory>
 #include <vector>
@@ -62,4 +62,4 @@
 
 }  // namespace chromeos
 
-#endif  // CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
diff --git a/chrome/browser/chromeos/shutdown_policy_browsertest.cc b/chrome/browser/chromeos/shutdown_policy_browsertest.cc
index 50dbf70..ec37e71 100644
--- a/chrome/browser/chromeos/shutdown_policy_browsertest.cc
+++ b/chrome/browser/chromeos/shutdown_policy_browsertest.cc
@@ -6,7 +6,6 @@
 #include <string>
 
 #include "ash/common/login_status.h"
-#include "ash/common/material_design/material_design_controller.h"
 #include "ash/common/strings/grit/ash_strings.h"
 #include "ash/common/system/date/date_default_view.h"
 #include "ash/common/system/date/tray_date.h"
@@ -160,12 +159,7 @@
   // Gets the shutdown button view.
   const views::View* GetShutdownButton() {
     ash::SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray();
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      return tray->GetTrayTilesForTesting()
-          ->GetDefaultViewForTesting()
-          ->GetShutdownButtonViewForTest();
-    }
-    return tray->GetTrayDateForTesting()
+    return tray->GetTrayTilesForTesting()
         ->GetDefaultViewForTesting()
         ->GetShutdownButtonViewForTest();
   }
diff --git a/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc b/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc
index 64fb0d3..8b85658 100644
--- a/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc
+++ b/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc
@@ -4,7 +4,6 @@
 
 #include "ash/common/accessibility_types.h"
 #include "ash/common/login_status.h"
-#include "ash/common/material_design/material_design_controller.h"
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/system/tray_accessibility.h"
 #include "ash/common/test/test_session_state_delegate.h"
@@ -240,23 +239,17 @@
   }
 
   // In material design we show the help button but theme it as disabled if
-  // it is not possible to load the the help page.
+  // it is not possible to load the help page.
   bool IsHelpAvailableOnDetailMenu() const {
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      return tray()->detailed_menu_->help_view_->state() ==
-             views::Button::STATE_NORMAL;
-    }
-    return tray()->detailed_menu_->help_view_;
+    return tray()->detailed_menu_->help_view_->state() ==
+           views::Button::STATE_NORMAL;
   }
 
   // In material design we show the settings button but theme it as disabled if
-  // it is not possible to load the the settings page.
+  // it is not possible to load the settings page.
   bool IsSettingsAvailableOnDetailMenu() const {
-    if (ash::MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      return tray()->detailed_menu_->settings_view_->state() ==
-             views::Button::STATE_NORMAL;
-    }
-    return tray()->detailed_menu_->settings_view_;
+    return tray()->detailed_menu_->settings_view_->state() ==
+           views::Button::STATE_NORMAL;
   }
 
   bool IsNotificationShown() const {
diff --git a/chrome/browser/component_updater/recovery_component_installer.cc b/chrome/browser/component_updater/recovery_component_installer.cc
index 868e5c7e..9f4e58d 100644
--- a/chrome/browser/component_updater/recovery_component_installer.cc
+++ b/chrome/browser/component_updater/recovery_component_installer.cc
@@ -493,7 +493,8 @@
 
 void RegisterRecoveryComponent(ComponentUpdateService* cus,
                                PrefService* prefs) {
-#if !defined(OS_CHROMEOS) && defined(GOOGLE_CHROME_BUILD)
+#if defined(GOOGLE_CHROME_BUILD)
+#if defined(OS_WIN) || defined(OS_MACOSX)
   if (SimulatingElevatedRecovery()) {
     BrowserThread::PostTask(
         BrowserThread::UI,
@@ -508,7 +509,8 @@
       FROM_HERE,
       base::Bind(&RecoveryRegisterHelper, cus, prefs),
       base::TimeDelta::FromSeconds(6));
-#endif  // !defined(OS_CHROMEOS) && defined(GOOGLE_CHROME_BUILD)
+#endif
+#endif
 }
 
 void RegisterPrefsForRecoveryComponent(PrefRegistrySimple* registry) {
diff --git a/chrome/browser/conflicts/module_event_sink_impl_win.cc b/chrome/browser/conflicts/module_event_sink_impl_win.cc
index 808940332..d58475ba 100644
--- a/chrome/browser/conflicts/module_event_sink_impl_win.cc
+++ b/chrome/browser/conflicts/module_event_sink_impl_win.cc
@@ -64,7 +64,7 @@
   const void* typed_address =
       reinterpret_cast<const void*>(static_cast<uintptr_t>(address));
   SIZE_T bytes_read = 0;
-  if (!::ReadProcessMemory(process, typed_address, &data, sizeof(data),
+  if (!::ReadProcessMemory(process, typed_address, data, sizeof(data),
                            &bytes_read)) {
     return false;
   }
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
index 22aeeb2..4dcbb75c 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -41,6 +41,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/safe_browsing/certificate_reporting_metrics_provider.h"
 #include "chrome/browser/sync/chrome_sync_client.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/ui/browser_otr_state.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_paths.h"
@@ -50,6 +51,7 @@
 #include "chrome/common/features.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/installer/util/util_constants.h"
+#include "components/browser_sync/profile_sync_service.h"
 #include "components/browser_watcher/stability_debugging.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/metrics/call_stack_profile_metrics_provider.h"
@@ -895,15 +897,19 @@
                  content::NotificationService::AllBrowserContextsAndSources());
   for (Profile* profile :
        g_browser_process->profile_manager()->GetLoadedProfiles()) {
-    RegisterForHistoryDeletions(profile);
+    RegisterForProfileEvents(profile);
   }
 }
 
-void ChromeMetricsServiceClient::RegisterForHistoryDeletions(Profile* profile) {
+void ChromeMetricsServiceClient::RegisterForProfileEvents(Profile* profile) {
   history::HistoryService* history_service =
       HistoryServiceFactory::GetForProfile(profile,
                                            ServiceAccessType::IMPLICIT_ACCESS);
   ObserveServiceForDeletions(history_service);
+  browser_sync::ProfileSyncService* sync =
+      ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile);
+  if (sync)
+    ObserveServiceForSyncDisables(static_cast<syncer::SyncService*>(sync));
 }
 
 void ChromeMetricsServiceClient::Observe(
@@ -925,7 +931,7 @@
       break;
 
     case chrome::NOTIFICATION_PROFILE_ADDED:
-      RegisterForHistoryDeletions(content::Source<Profile>(source).ptr());
+      RegisterForProfileEvents(content::Source<Profile>(source).ptr());
       break;
 
     default:
@@ -945,3 +951,14 @@
   if (ukm_service_)
     ukm_service_->Purge();
 }
+
+void ChromeMetricsServiceClient::OnSyncPrefsChanged(bool must_purge) {
+  if (!ukm_service_)
+    return;
+  if (must_purge) {
+    ukm_service_->Purge();
+    ukm_service_->ResetClientId();
+  }
+  // Signal service manager to enable/disable UKM based on new state.
+  UpdateRunningServices();
+}
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.h b/chrome/browser/metrics/chrome_metrics_service_client.h
index 6f12e37..61dae93a 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.h
+++ b/chrome/browser/metrics/chrome_metrics_service_client.h
@@ -23,6 +23,7 @@
 #include "components/metrics/proto/system_profile.pb.h"
 #include "components/omnibox/browser/omnibox_event_global_tracker.h"
 #include "components/ukm/observers/history_delete_observer.h"
+#include "components/ukm/observers/sync_disable_observer.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "ppapi/features/features.h"
@@ -50,7 +51,8 @@
 class ChromeMetricsServiceClient : public metrics::MetricsServiceClient,
                                    public metrics::TrackingSynchronizerObserver,
                                    public content::NotificationObserver,
-                                   public ukm::HistoryDeleteObserver {
+                                   public ukm::HistoryDeleteObserver,
+                                   public ukm::SyncDisableObserver {
  public:
   ~ChromeMetricsServiceClient() override;
 
@@ -86,9 +88,12 @@
   metrics::EnableMetricsDefault GetMetricsReportingDefaultState() override;
   bool IsUMACellularUploadLogicEnabled() override;
 
-  // ukm::HistoryDeleteObserver
+  // ukm::HistoryDeleteObserver:
   void OnHistoryDeleted() override;
 
+  // ukm::SyncDisableObserver:
+  void OnSyncPrefsChanged(bool must_purge) override;
+
   // Persistent browser metrics need to be persisted somewhere. This constant
   // provides a known string to be used for both the allocator's internal name
   // and for a file on disk (relative to chrome::DIR_USER_DATA) to which they
@@ -142,8 +147,8 @@
   // there was recent activity.
   void RegisterForNotifications();
 
-  // Call to listen for history deletions by the selected profile.
-  void RegisterForHistoryDeletions(Profile* profile);
+  // Call to listen for events on the selected profile's services.
+  void RegisterForProfileEvents(Profile* profile);
 
   // content::NotificationObserver:
   void Observe(int type,
diff --git a/chrome/browser/permissions/permission_blacklist_client.cc b/chrome/browser/permissions/permission_blacklist_client.cc
index 35386710..4262df65d 100644
--- a/chrome/browser/permissions/permission_blacklist_client.cc
+++ b/chrome/browser/permissions/permission_blacklist_client.cc
@@ -9,7 +9,10 @@
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/timer/elapsed_timer.h"
 #include "base/timer/timer.h"
+#include "chrome/browser/permissions/permission_uma_util.h"
+#include "chrome/browser/permissions/permission_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
 #include "url/gurl.h"
@@ -57,6 +60,7 @@
   // empty response if Safe Browsing times out.
   safe_browsing::ThreatMetadata empty_metadata;
   timer_ = base::MakeUnique<base::OneShotTimer>();
+  elapsed_timer_.reset(new base::ElapsedTimer());
   timer_->Start(
       FROM_HERE, base::TimeDelta::FromMilliseconds(timeout_),
       base::Bind(&PermissionBlacklistClient::OnCheckApiBlacklistUrlResult, this,
@@ -71,17 +75,26 @@
     const GURL& url,
     const safe_browsing::ThreatMetadata& metadata) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-  if (timer_->IsRunning())
-    timer_->Stop();
-  else
-    db_manager_->CancelApiCheck(this);
-  timer_.reset(nullptr);
 
+  base::TimeDelta response_time = elapsed_timer_->Elapsed();
+  SafeBrowsingResponse response = SafeBrowsingResponse::NOT_BLACKLISTED;
+
+  if (timer_->IsRunning()) {
+    timer_->Stop();
+  } else {
+    db_manager_->CancelApiCheck(this);
+    response = SafeBrowsingResponse::TIMEOUT;
+  }
+
+  timer_.reset(nullptr);
   bool permission_blocked =
       metadata.api_permissions.find(
           PermissionUtil::ConvertPermissionTypeToSafeBrowsingName(
               permission_type_)) != metadata.api_permissions.end();
+  if (permission_blocked)
+    response = SafeBrowsingResponse::BLACKLISTED;
 
+  PermissionUmaUtil::RecordSafeBrowsingResponse(response_time, response);
   content::BrowserThread::PostTask(
       content::BrowserThread::UI, FROM_HERE,
       base::Bind(&PermissionBlacklistClient::EvaluateBlacklistResultOnUiThread,
@@ -89,11 +102,11 @@
 }
 
 void PermissionBlacklistClient::EvaluateBlacklistResultOnUiThread(
-    bool permission_blocked) {
+    bool response) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   if (is_active_)
-    callback_.Run(permission_blocked);
+    callback_.Run(response);
   Release();
 }
 
diff --git a/chrome/browser/permissions/permission_blacklist_client.h b/chrome/browser/permissions/permission_blacklist_client.h
index 2396143..1d3f080 100644
--- a/chrome/browser/permissions/permission_blacklist_client.h
+++ b/chrome/browser/permissions/permission_blacklist_client.h
@@ -5,9 +5,10 @@
 #ifndef CHROME_BROWSER_PERMISSIONS_PERMISSION_BLACKLIST_CLIENT_H_
 #define CHROME_BROWSER_PERMISSIONS_PERMISSION_BLACKLIST_CLIENT_H_
 
+#include <memory>
+
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
-#include "chrome/browser/permissions/permission_util.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "content/public/browser/permission_type.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -20,6 +21,7 @@
 
 namespace base {
 class OneShotTimer;
+class ElapsedTimer;
 }
 
 // The client used when checking whether a permission has been blacklisted by
@@ -62,7 +64,7 @@
       const GURL& url,
       const safe_browsing::ThreatMetadata& metadata) override;
 
-  void EvaluateBlacklistResultOnUiThread(bool permission_blocked);
+  void EvaluateBlacklistResultOnUiThread(bool response);
 
   // WebContentsObserver implementation. Sets a flag so that when the database
   // manager returns with a result, it won't attempt to run the callback with a
@@ -78,6 +80,7 @@
   // Timer to abort the Safe Browsing check if it takes too long. Created and
   // used on the IO Thread.
   std::unique_ptr<base::OneShotTimer> timer_;
+  std::unique_ptr<base::ElapsedTimer> elapsed_timer_;
   int timeout_;
 
   // True if |callback_| should be invoked, if web_contents() is destroyed, this
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
index 04b412c3..061a905 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
+++ b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
@@ -8,9 +8,11 @@
 
 #include "base/bind.h"
 #include "base/run_loop.h"
+#include "base/test/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/permissions/permission_uma_util.h"
 #include "chrome/browser/permissions/permission_util.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
@@ -265,6 +267,7 @@
 // Test that an origin that has been blacklisted for a permission is embargoed.
 TEST_F(PermissionDecisionAutoBlockerUnitTest, TestUpdateEmbargoBlacklist) {
   GURL url("https://www.google.com");
+  base::HistogramTester histograms;
 
   scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
       new MockSafeBrowsingDatabaseManager(true /* perform_callback */,
@@ -277,6 +280,33 @@
   UpdateEmbargoedStatus(content::PermissionType::GEOLOCATION, url);
   EXPECT_TRUE(callback_was_run());
   EXPECT_TRUE(last_embargoed_status());
+  histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
+                                SafeBrowsingResponse::BLACKLISTED, 1);
+  histograms.ExpectTotalCount(
+      "Permissions.AutoBlocker.SafeBrowsingResponseTime", 1);
+}
+
+// Test that an origin that is blacklisted for a permission will not be placed
+// under embargoed for another.
+TEST_F(PermissionDecisionAutoBlockerUnitTest, TestRequestNotBlacklisted) {
+  GURL url("https://www.google.com");
+  clock()->SetNow(base::Time::Now());
+  base::HistogramTester histograms;
+
+  scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
+      new MockSafeBrowsingDatabaseManager(true /* perform_callback */,
+                                          true /* enabled */);
+  std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
+  db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
+  SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
+                                                     0 /* timeout in ms */);
+
+  UpdateEmbargoedStatus(content::PermissionType::NOTIFICATIONS, url);
+  EXPECT_FALSE(last_embargoed_status());
+  histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
+                                SafeBrowsingResponse::NOT_BLACKLISTED, 1);
+  histograms.ExpectTotalCount(
+      "Permissions.AutoBlocker.SafeBrowsingResponseTime", 1);
 }
 
 // Check that IsUnderEmbargo returns the correct value when the embargo is set
@@ -325,6 +355,7 @@
 TEST_F(PermissionDecisionAutoBlockerUnitTest, TestDismissEmbargoBackoff) {
   GURL url("https://www.google.com");
   clock()->SetNow(base::Time::Now());
+  base::HistogramTester histograms;
 
   // Record some dismisses.
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
@@ -342,6 +373,10 @@
   EXPECT_TRUE(
       autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
 
+  histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse",
+                              0);
+  histograms.ExpectTotalCount(
+      "Permissions.AutoBlocker.SafeBrowsingResponseTime", 0);
   // Accelerate time forward, check that the embargo status is lifted and the
   // request won't be automatically blocked.
   clock()->Advance(base::TimeDelta::FromDays(8));
@@ -359,6 +394,16 @@
   clock()->Advance(base::TimeDelta::FromDays(8));
   EXPECT_FALSE(
       autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+
+  // Record another dismiss, subsequent requests should be autoblocked again.
+  EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
+      url, content::PermissionType::GEOLOCATION));
+  EXPECT_TRUE(
+      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+  histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse",
+                              0);
+  histograms.ExpectTotalCount(
+      "Permissions.AutoBlocker.SafeBrowsingResponseTime", 0);
 }
 
 // Test the logic for a combination of blacklisting and dismissal embargo.
@@ -390,6 +435,7 @@
 TEST_F(PermissionDecisionAutoBlockerUnitTest, TestSafeBrowsingTimeout) {
   GURL url("https://www.google.com");
   clock()->SetNow(base::Time::Now());
+  base::HistogramTester histograms;
 
   scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
       new MockSafeBrowsingDatabaseManager(false /* perform_callback */,
@@ -404,6 +450,10 @@
   EXPECT_FALSE(last_embargoed_status());
   EXPECT_FALSE(
       autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+  histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
+                                SafeBrowsingResponse::TIMEOUT, 1);
+  histograms.ExpectTotalCount(
+      "Permissions.AutoBlocker.SafeBrowsingResponseTime", 1);
   db_manager->SetPerformCallback(true);
   SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
                                                      2000 /* timeout in ms */);
@@ -412,7 +462,12 @@
   UpdateEmbargoedStatus(content::PermissionType::GEOLOCATION, url);
   EXPECT_TRUE(callback_was_run());
   EXPECT_TRUE(last_embargoed_status());
-
+  histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse",
+                              2);
+  histograms.ExpectTotalCount(
+      "Permissions.AutoBlocker.SafeBrowsingResponseTime", 2);
+  histograms.ExpectBucketCount("Permissions.AutoBlocker.SafeBrowsingResponse",
+                               SafeBrowsingResponse::BLACKLISTED, 1);
   clock()->Advance(base::TimeDelta::FromDays(1));
   EXPECT_TRUE(
       autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
@@ -505,3 +560,22 @@
   EXPECT_TRUE(callback_was_run());
   EXPECT_FALSE(last_embargoed_status());
 }
+
+TEST_F(PermissionDecisionAutoBlockerUnitTest, TestSafeBrowsingResponse) {
+  GURL url("https://www.google.com");
+  clock()->SetNow(base::Time::Now());
+  base::HistogramTester histograms;
+
+  scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
+      new MockSafeBrowsingDatabaseManager(true /* perform_callback */,
+                                          true /* enabled */);
+  std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
+  db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
+  SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
+                                                     0 /* timeout in ms */);
+
+  UpdateEmbargoedStatus(content::PermissionType::NOTIFICATIONS, url);
+  EXPECT_FALSE(last_embargoed_status());
+  histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
+                                SafeBrowsingResponse::NOT_BLACKLISTED, 1);
+}
diff --git a/chrome/browser/permissions/permission_uma_util.cc b/chrome/browser/permissions/permission_uma_util.cc
index 82792775..ebc8810 100644
--- a/chrome/browser/permissions/permission_uma_util.cc
+++ b/chrome/browser/permissions/permission_uma_util.cc
@@ -9,6 +9,7 @@
 #include "base/command_line.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
+#include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/permissions/permission_decision_auto_blocker.h"
 #include "chrome/browser/permissions/permission_manager.h"
@@ -357,6 +358,15 @@
   }
 }
 
+void PermissionUmaUtil::RecordSafeBrowsingResponse(
+    base::TimeDelta response_time,
+    SafeBrowsingResponse response) {
+  UMA_HISTOGRAM_TIMES("Permissions.AutoBlocker.SafeBrowsingResponseTime",
+                      response_time);
+  UMA_HISTOGRAM_ENUMERATION("Permissions.AutoBlocker.SafeBrowsingResponse",
+                            response, SafeBrowsingResponse::RESPONSE_NUM);
+}
+
 void PermissionUmaUtil::PermissionPromptShown(
     const std::vector<PermissionRequest*>& requests) {
   DCHECK(!requests.empty());
diff --git a/chrome/browser/permissions/permission_uma_util.h b/chrome/browser/permissions/permission_uma_util.h
index 61a08d9..8a603ef2 100644
--- a/chrome/browser/permissions/permission_uma_util.h
+++ b/chrome/browser/permissions/permission_uma_util.h
@@ -9,6 +9,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/time/time.h"
 #include "chrome/browser/permissions/permission_request.h"
 #include "chrome/browser/permissions/permission_util.h"
 
@@ -41,6 +42,16 @@
   NOT_PERSISTED = 2,
 };
 
+// Any new values should be inserted immediately prior to RESPONSE_NUM.
+enum SafeBrowsingResponse {
+  NOT_BLACKLISTED = 0,
+  TIMEOUT = 1,
+  BLACKLISTED = 2,
+
+  // Always keep this at the end.
+  RESPONSE_NUM,
+};
+
 // A bundle for the information sent in a PermissionReport.
 struct PermissionReportInfo {
   PermissionReportInfo(
@@ -114,7 +125,8 @@
                                 PermissionSourceUI source_ui,
                                 const GURL& revoked_origin,
                                 Profile* profile);
-
+  static void RecordSafeBrowsingResponse(base::TimeDelta response_time,
+                                         SafeBrowsingResponse response);
   // UMA specifically for when permission prompts are shown. This should be
   // roughly equivalent to the metrics above, however it is
   // useful to have separate UMA to a few reasons:
diff --git a/chrome/browser/resources/print_preview/native_layer.js b/chrome/browser/resources/print_preview/native_layer.js
index 69ca087366..6b522fe1 100644
--- a/chrome/browser/resources/print_preview/native_layer.js
+++ b/chrome/browser/resources/print_preview/native_layer.js
@@ -63,7 +63,6 @@
     global.onDidPreviewPage = this.onDidPreviewPage_.bind(this);
     global.updatePrintPreview = this.onUpdatePrintPreview_.bind(this);
     global.onDidGetAccessToken = this.onDidGetAccessToken_.bind(this);
-    global.autoCancelForTesting = this.autoCancelForTesting_.bind(this);
     global.onPrivetPrinterChanged = this.onPrivetPrinterChanged_.bind(this);
     global.onPrivetCapabilitiesSet =
         this.onPrivetCapabilitiesSet_.bind(this);
@@ -761,17 +760,6 @@
     },
 
     /**
-     * Simulates a user click on the print preview dialog cancel button. Used
-     * only for testing.
-     * @private
-     */
-    autoCancelForTesting_: function() {
-      var properties = {view: window, bubbles: true, cancelable: true};
-      var click = new MouseEvent('click', properties);
-      document.querySelector('#print-header .cancel').dispatchEvent(click);
-    },
-
-    /**
      * @param {{serviceName: string, name: string}} printer Specifies
      *     information about the printer that was added.
      * @private
diff --git a/chrome/browser/resources/settings/device_page/storage.html b/chrome/browser/resources/settings/device_page/storage.html
index 06f4a9b..32a1b88 100644
--- a/chrome/browser/resources/settings/device_page/storage.html
+++ b/chrome/browser/resources/settings/device_page/storage.html
@@ -126,34 +126,36 @@
         unicode-bidi: embed;
       }
     </style>
-    <div class="settings-box first"
-        hidden$="[[!isSpaceLow_(sizeStat_.spaceState)]]">
-      <div class="message-area">
-        <iron-icon icon="cr:warning"></iron-icon>
-        <div class="message">
-          <div class="message-title">$i18n{storageSpaceLowMessageTitle}</div>
-          <div class="message-description">
-            <span>$i18n{storageSpaceLowMessageLine1}</span>
-            <span>$i18n{storageSpaceLowMessageLine2}</span>
+    <template is="dom-if" if="[[isSpaceLow_(sizeStat_.spaceState)]]">
+      <div class="settings-box first">
+        <div class="message-area">
+          <iron-icon icon="cr:warning"></iron-icon>
+          <div class="message">
+            <div class="message-title">$i18n{storageSpaceLowMessageTitle}</div>
+            <div class="message-description">
+              <span>$i18n{storageSpaceLowMessageLine1}</span>
+              <span>$i18n{storageSpaceLowMessageLine2}</span>
+            </div>
           </div>
         </div>
       </div>
-    </div>
-    <div class="settings-box first"
-        hidden$="[[!isSpaceCriticallyLow_(sizeStat_.spaceState)]]">
-      <div id="criticallyLowMessage" class="message-area">
-        <iron-icon icon="cr:warning"></iron-icon>
-        <div class="message">
-          <div class="message-title">
-            $i18n{storageSpaceCriticallyLowMessageTitle}
-          </div>
-          <div class="message-description">
-            <span>$i18n{storageSpaceCriticallyLowMessageLine1}</span>
-            <span>$i18n{storageSpaceCriticallyLowMessageLine2}</span>
+    </template>
+    <template is="dom-if" if="[[isSpaceCriticallyLow_(sizeStat_.spaceState)]]">
+      <div class="settings-box first">
+        <div id="criticallyLowMessage" class="message-area">
+          <iron-icon icon="cr:warning"></iron-icon>
+          <div class="message">
+            <div class="message-title">
+              $i18n{storageSpaceCriticallyLowMessageTitle}
+            </div>
+            <div class="message-description">
+              <span>$i18n{storageSpaceCriticallyLowMessageLine1}</span>
+              <span>$i18n{storageSpaceCriticallyLowMessageLine2}</span>
+            </div>
           </div>
         </div>
       </div>
-    </div>
+    </template>
     <div class="settings-box first">
       <div id="barArea">
         <progress id="bar" class$="[[getBarClass_(sizeStat_.spaceState)]]"
@@ -183,14 +185,15 @@
       </div>
       <button class="icon-external" is="paper-icon-button-light"></button>
     </div>
-    <div class="settings-box" on-tap="onDriveCacheTap_"
-         hidden$="[[!driveEnabled_]]" actionable>
-      <div class="start">$i18n{storageItemDriveCache}</div>
-      <div id="driveCacheSize" class="storage-size">
-        $i18n{storageSizeComputing}
+    <template is="dom-if" if="[[driveEnabled_]]">
+      <div class="settings-box" on-tap="onDriveCacheTap_" actionable>
+        <div class="start">$i18n{storageItemDriveCache}</div>
+        <div id="driveCacheSize" class="storage-size">
+          $i18n{storageSizeComputing}
+        </div>
+        <button class="subpage-arrow" is="paper-icon-button-light"></button>
       </div>
-      <button class="subpage-arrow" is="paper-icon-button-light"></button>
-    </div>
+    </template>
     <div class="settings-box" on-tap="onBrowsingDataTap_" actionable>
       <div class="start">$i18n{storageItemBrowsingData}</div>
       <div id="browsingDataSize" class="storage-size">
@@ -198,14 +201,15 @@
       </div>
       <button class="subpage-arrow" is="paper-icon-button-light"></button>
     </div>
-    <div class="settings-box" on-tap="onAndroidTap_"
-         hidden$="[[!androidEnabled_]]" actionable>
-      <div class="start">$i18n{storageItemAndroid}</div>
-      <div id="androidSize" class="storage-size">
-        $i18n{storageSizeComputing}
+    <template is="dom-if" if="[[androidEnabled_]]">
+      <div class="settings-box" on-tap="onAndroidTap_" actionable>
+        <div class="start">$i18n{storageItemAndroid}</div>
+        <div id="androidSize" class="storage-size">
+          $i18n{storageSizeComputing}
+        </div>
+        <button class="icon-external" is="paper-icon-button-light"></button>
       </div>
-      <button class="icon-external" is="paper-icon-button-light"></button>
-    </div>
+    </template>
     <template is="dom-if" if="[[!isGuest_]]">
       <div class="settings-box" on-tap="onOtherUsersTap_" actionable>
         <div class="start">$i18n{storageItemOtherUsers}</div>
diff --git a/chrome/browser/resources/settings/device_page/storage.js b/chrome/browser/resources/settings/device_page/storage.js
index 84453c6..6649b83 100644
--- a/chrome/browser/resources/settings/device_page/storage.js
+++ b/chrome/browser/resources/settings/device_page/storage.js
@@ -82,9 +82,11 @@
     cr.addWebUIListener(
         'storage-android-size-changed',
         this.handleAndroidSizeChanged_.bind(this));
-    cr.addWebUIListener(
-        'storage-other-users-size-changed',
-        this.handleOtherUsersSizeChanged_.bind(this));
+    if (!this.isGuest_) {
+      cr.addWebUIListener(
+          'storage-other-users-size-changed',
+          this.handleOtherUsersSizeChanged_.bind(this));
+    }
     cr.addWebUIListener(
         'storage-drive-enabled-changed',
         this.handleDriveEnabledChanged_.bind(this));
@@ -178,7 +180,8 @@
    * @private
    */
   handleDriveCacheSizeChanged_: function(size) {
-    this.$.driveCacheSize.textContent = size;
+    if (this.driveEnabled_)
+      this.$$('#driveCacheSize').textContent = size;
   },
 
   /**
@@ -196,7 +199,8 @@
    * @private
    */
   handleAndroidSizeChanged_: function(size) {
-    this.$.androidSize.textContent = size;
+    if (this.androidEnabled_)
+      this.$$('#androidSize').textContent = size;
   },
 
   /**
@@ -204,7 +208,8 @@
    * @private
    */
   handleOtherUsersSizeChanged_: function(size) {
-    this.$.otherUsersSize.textContent = size;
+    if (!this.isGuest_)
+      this.$$('#otherUsersSize').textContent = size;
   },
 
   /**
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 42588ca..9d661ca 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1522,6 +1522,8 @@
       "views/subtle_notification_view.h",
       "views/sync/bubble_sync_promo_view.cc",
       "views/sync/bubble_sync_promo_view.h",
+      "views/sync/profile_signin_confirmation_dialog_views.cc",
+      "views/sync/profile_signin_confirmation_dialog_views.h",
       "views/task_manager_view.cc",
       "views/task_manager_view.h",
       "views/update_recommended_message_box.cc",
@@ -1571,8 +1573,6 @@
         "views/screen_capture_notification_ui_views.cc",
         "views/sync/one_click_signin_dialog_view.cc",
         "views/sync/one_click_signin_dialog_view.h",
-        "views/sync/profile_signin_confirmation_dialog_views.cc",
-        "views/sync/profile_signin_confirmation_dialog_views.h",
       ]
     }
 
diff --git a/chrome/browser/ui/browser_tab_strip_tracker.cc b/chrome/browser/ui/browser_tab_strip_tracker.cc
index 16a5327..9fd936a0 100644
--- a/chrome/browser/ui/browser_tab_strip_tracker.cc
+++ b/chrome/browser/ui/browser_tab_strip_tracker.cc
@@ -61,6 +61,11 @@
   if (!ShouldTrackBrowser(browser))
     return;
 
+  // It's possible that a browser is added to the observed browser list twice.
+  // In this case it might cause crash as seen in crbug.com/685731.
+  if (browsers_observing_.find(browser) != browsers_observing_.end())
+    return;
+
   browsers_observing_.insert(browser);
 
   if (browser_list_observer_)
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h
index 976ef13..e53c7cc9 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h
+++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h
@@ -38,16 +38,17 @@
       content::WebContents* web_contents,
       Profile* profile,
       const std::string& username,
-      ui::ProfileSigninConfirmationDelegate* delegate,
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
       bool offer_profile_creation);
   virtual ~ProfileSigninConfirmationDialogCocoa();
 
   // Shows the dialog if needed.
-  static void Show(Browser* browser,
-                   content::WebContents* web_contents,
-                   Profile* profile,
-                   const std::string& username,
-                   ui::ProfileSigninConfirmationDelegate* delegate);
+  static void Show(
+      Browser* browser,
+      content::WebContents* web_contents,
+      Profile* profile,
+      const std::string& username,
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate);
 
   // Closes the dialog, which deletes itself.
   void Close();
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.mm b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.mm
index dbd031b..eab52ff 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.mm
+++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.mm
@@ -16,19 +16,15 @@
 namespace {
 
 // static
-void ShowDialog(
-    Browser* browser,
-    content::WebContents* web_contents,
-    Profile* profile,
-    const std::string& username,
-    ui::ProfileSigninConfirmationDelegate* delegate,
-    bool offer_profile_creation) {
+void ShowDialog(Browser* browser,
+                content::WebContents* web_contents,
+                Profile* profile,
+                const std::string& username,
+                std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
+                bool offer_profile_creation) {
   // The dialog owns itself.
-  new ProfileSigninConfirmationDialogCocoa(browser,
-                                           web_contents,
-                                           profile,
-                                           username,
-                                           delegate,
+  new ProfileSigninConfirmationDialogCocoa(browser, web_contents, profile,
+                                           username, std::move(delegate),
                                            offer_profile_creation);
 }
 
@@ -39,19 +35,18 @@
     content::WebContents* web_contents,
     Profile* profile,
     const std::string& username,
-    ui::ProfileSigninConfirmationDelegate* delegate,
+    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
     bool offer_profile_creation) {
   // Setup the dialog view controller.
   const base::Closure& closeDialogCallback =
       base::Bind(&ProfileSigninConfirmationDialogCocoa::Close,
                  base::Unretained(this));
-  controller_.reset(
-      [[ProfileSigninConfirmationViewController alloc]
-          initWithBrowser:browser
-                 username:username
-                 delegate:delegate
-      closeDialogCallback:closeDialogCallback
-     offerProfileCreation:offer_profile_creation]);
+  controller_.reset([[ProfileSigninConfirmationViewController alloc]
+           initWithBrowser:browser
+                  username:username
+                  delegate:std::move(delegate)
+       closeDialogCallback:closeDialogCallback
+      offerProfileCreation:offer_profile_creation]);
 
   // Setup the constrained window that will show the view.
   base::scoped_nsobject<NSWindow> window([[ConstrainedWindowCustomWindow alloc]
@@ -71,10 +66,10 @@
     content::WebContents* web_contents,
     Profile* profile,
     const std::string& username,
-    ui::ProfileSigninConfirmationDelegate* delegate) {
+    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) {
   ui::CheckShouldPromptForNewProfile(
       profile, base::Bind(ShowDialog, browser, web_contents, profile, username,
-                          delegate));
+                          base::Passed(std::move(delegate))));
 }
 
 void ProfileSigninConfirmationDialogCocoa::Close() {
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.h b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.h
index b3983610..39a1bdd 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.h
+++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_COCOA_PROFILES_PROFILE_SIGNIN_CONFIRMATION_VIEW_CONTROLLER_H_
 
 #import <Cocoa/Cocoa.h>
+#include <memory>
 #include <string>
 
 #include "base/callback.h"
@@ -33,7 +34,7 @@
   bool offerProfileCreation_;
 
   // Dialog button callbacks.
-  ui::ProfileSigninConfirmationDelegate* delegate_;
+  std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate_;
   base::Closure closeDialogCallback_;
 
   // UI elements.
@@ -48,10 +49,12 @@
 }
 
 - (id)initWithBrowser:(Browser*)browser
-             username:(const std::string&)username
-             delegate:(ui::ProfileSigninConfirmationDelegate*)delegate
-  closeDialogCallback:(const base::Closure&)closeDialogCallback
- offerProfileCreation:(bool)offer;
+                username:(const std::string&)username
+                delegate:
+                    (std::unique_ptr<ui::ProfileSigninConfirmationDelegate>)
+                        delegate
+     closeDialogCallback:(const base::Closure&)closeDialogCallback
+    offerProfileCreation:(bool)offer;
 - (IBAction)cancel:(id)sender;
 - (IBAction)ok:(id)sender;
 - (IBAction)close:(id)sender;
@@ -59,12 +62,4 @@
 
 @end
 
-@interface ProfileSigninConfirmationViewController (TestingAPI)
-
-@property(readonly, nonatomic) ui::ProfileSigninConfirmationDelegate* delegate;
-@property(readonly, nonatomic) NSButton* createProfileButton;
-@property(readonly, nonatomic) NSTextView* explanationField;
-
-@end
-
 #endif  // CHROME_BROWSER_UI_COCOA_PROFILES_PROFILE_SIGNIN_CONFIRMATION_VIEW_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
index 5a7480f..28f0873 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
+++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
@@ -142,14 +142,16 @@
 @implementation ProfileSigninConfirmationViewController
 
 - (id)initWithBrowser:(Browser*)browser
-             username:(const std::string&)username
-             delegate:(ui::ProfileSigninConfirmationDelegate*)delegate
-  closeDialogCallback:(const base::Closure&)closeDialogCallback
- offerProfileCreation:(bool)offer {
+                username:(const std::string&)username
+                delegate:
+                    (std::unique_ptr<ui::ProfileSigninConfirmationDelegate>)
+                        delegate
+     closeDialogCallback:(const base::Closure&)closeDialogCallback
+    offerProfileCreation:(bool)offer {
   if ((self = [super initWithNibName:nil bundle:nil])) {
     browser_ = browser;
     username_ = username;
-    delegate_ = delegate;
+    delegate_ = std::move(delegate);
     closeDialogCallback_ = closeDialogCallback;
     offerProfileCreation_ = offer;
   }
@@ -376,7 +378,7 @@
 - (IBAction)cancel:(id)sender {
   if (delegate_) {
     delegate_->OnCancelSignin();
-    delegate_ = NULL;
+    delegate_ = nullptr;
     closeDialogCallback_.Run();
   }
 }
@@ -384,7 +386,7 @@
 - (IBAction)ok:(id)sender {
   if (delegate_) {
     delegate_->OnContinueSignin();
-    delegate_ = NULL;
+    delegate_ = nullptr;
     closeDialogCallback_.Run();
   }
 }
@@ -392,7 +394,7 @@
 - (IBAction)close:(id)sender {
   if (delegate_) {
     delegate_->OnCancelSignin();
-    delegate_ = NULL;
+    delegate_ = nullptr;
   }
   closeDialogCallback_.Run();
 }
@@ -400,7 +402,7 @@
 - (IBAction)createProfile:(id)sender {
   if (delegate_) {
     delegate_->OnSigninWithNewProfile();
-    delegate_ = NULL;
+    delegate_ = nullptr;
     closeDialogCallback_.Run();
   }
 }
@@ -440,19 +442,3 @@
 }
 
 @end
-
-@implementation ProfileSigninConfirmationViewController (TestingAPI)
-
-- (ui::ProfileSigninConfirmationDelegate*)delegate {
-  return delegate_;
-}
-
-- (NSButton*)createProfileButton {
-  return createProfileButton_.get();
-}
-
-- (NSTextView*)explanationField {
-  return explanationField_.get();
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller_browsertest.mm b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller_browsertest.mm
index 6380427..4311f676 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller_browsertest.mm
+++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller_browsertest.mm
@@ -18,10 +18,32 @@
 #import "testing/gtest_mac.h"
 #include "ui/base/l10n/l10n_util.h"
 
-class ProfileSigninConfirmationViewControllerTest
-  : public InProcessBrowserTest,
-    public ui::ProfileSigninConfirmationDelegate {
+@interface ProfileSigninConfirmationViewController (TestingAPI)
 
+@property(readonly, nonatomic) ui::ProfileSigninConfirmationDelegate* delegate;
+@property(readonly, nonatomic) NSButton* createProfileButton;
+@property(readonly, nonatomic) NSTextView* explanationField;
+
+@end
+
+@implementation ProfileSigninConfirmationViewController (TestingAPI)
+
+- (ui::ProfileSigninConfirmationDelegate*)delegate {
+  return delegate_.get();
+}
+
+- (NSButton*)createProfileButton {
+  return createProfileButton_.get();
+}
+
+- (NSTextView*)explanationField {
+  return explanationField_.get();
+}
+
+@end
+
+class ProfileSigninConfirmationViewControllerTest
+    : public InProcessBrowserTest {
  public:
   ProfileSigninConfirmationViewControllerTest()
     : window_(nil),
@@ -44,11 +66,11 @@
         &ProfileSigninConfirmationViewControllerTest::OnClose,
         base::Unretained(this));
     controller_.reset([[ProfileSigninConfirmationViewController alloc]
-                        initWithBrowser:browser()
-                               username:username()
-                               delegate:this
-                    closeDialogCallback:close
-                   offerProfileCreation:offerProfileCreation]);
+             initWithBrowser:browser()
+                    username:username()
+                    delegate:base::MakeUnique<TestSigninDelegate>(this)
+         closeDialogCallback:close
+        offerProfileCreation:offerProfileCreation]);
     [[window_ contentView] addSubview:[controller_ view]];
     [window_ makeKeyAndOrderFront:NSApp];
     ASSERT_TRUE([window_ isVisible]);
@@ -63,10 +85,6 @@
         IDS_ENTERPRISE_SIGNIN_PROFILE_LINK_LEARN_MORE);
   }
 
-  // ui::ProfileSigninConfirmationDelegate:
-  void OnContinueSignin() override { continued_ = true; }
-  void OnCancelSignin() override { cancelled_ = true; }
-  void OnSigninWithNewProfile() override { created_ = true; }
   void OnClose() { closed_ = true; }
 
   // The window containing the dialog.
@@ -82,6 +100,23 @@
   bool closed_;
 
  private:
+  class TestSigninDelegate : public ui::ProfileSigninConfirmationDelegate {
+   public:
+    explicit TestSigninDelegate(
+        ProfileSigninConfirmationViewControllerTest* client)
+        : client_(client) {}
+
+    // ui::ProfileSigninConfirmationDelegate:
+    void OnContinueSignin() override { client_->continued_ = true; }
+    void OnCancelSignin() override { client_->cancelled_ = true; }
+    void OnSigninWithNewProfile() override { client_->created_ = true; }
+
+   private:
+    ProfileSigninConfirmationViewControllerTest* client_;
+
+    DISALLOW_COPY_AND_ASSIGN(TestSigninDelegate);
+  };
+
   DISALLOW_COPY_AND_ASSIGN(ProfileSigninConfirmationViewControllerTest);
 };
 
diff --git a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h
index 1eb2bd5..4d81b16 100644
--- a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h
+++ b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.h
@@ -24,7 +24,7 @@
       Browser* browser,
       Profile* profile,
       const std::string& username,
-      ui::ProfileSigninConfirmationDelegate* delegate) override;
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) override;
   void ShowManagePasswordsBubble(bool user_action) override;
   void HideManagePasswordsBubble() override;
   base::WeakPtr<ValidationMessageBubble> ShowValidationMessage(
diff --git a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm
index bc20ecf6..a66b2ee 100644
--- a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm
+++ b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm
@@ -11,6 +11,7 @@
 #import "chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h"
 #include "chrome/browser/ui/cocoa/tab_dialogs_views_mac.h"
 #import "chrome/browser/ui/cocoa/validation_message_bubble_cocoa.h"
+#include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/material_design/material_design_controller.h"
 
@@ -64,9 +65,9 @@
     Browser* browser,
     Profile* profile,
     const std::string& username,
-    ui::ProfileSigninConfirmationDelegate* delegate) {
-  ProfileSigninConfirmationDialogCocoa::Show(
-      browser, web_contents_, profile, username, delegate);
+    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) {
+  ProfileSigninConfirmationDialogCocoa::Show(browser, web_contents_, profile,
+                                             username, std::move(delegate));
 }
 
 void TabDialogsCocoa::ShowManagePasswordsBubble(bool user_action) {
diff --git a/chrome/browser/ui/cocoa/tab_dialogs_views_mac.h b/chrome/browser/ui/cocoa/tab_dialogs_views_mac.h
index 622777c..980201b 100644
--- a/chrome/browser/ui/cocoa/tab_dialogs_views_mac.h
+++ b/chrome/browser/ui/cocoa/tab_dialogs_views_mac.h
@@ -15,6 +15,11 @@
 
   // TabDialogs:
   void ShowCollectedCookies() override;
+  void ShowProfileSigninConfirmation(
+      Browser* browser,
+      Profile* profile,
+      const std::string& username,
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TabDialogsViewsMac);
diff --git a/chrome/browser/ui/cocoa/tab_dialogs_views_mac.mm b/chrome/browser/ui/cocoa/tab_dialogs_views_mac.mm
index 6187e48..d71c1f2 100644
--- a/chrome/browser/ui/cocoa/tab_dialogs_views_mac.mm
+++ b/chrome/browser/ui/cocoa/tab_dialogs_views_mac.mm
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/cocoa/tab_dialogs_views_mac.h"
 
 #include "chrome/browser/ui/views/collected_cookies_views.h"
+#include "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h"
 
 TabDialogsViewsMac::TabDialogsViewsMac(content::WebContents* contents)
     : TabDialogsCocoa(contents) {}
@@ -15,3 +16,12 @@
   // Deletes itself on close.
   new CollectedCookiesViews(web_contents());
 }
+
+void TabDialogsViewsMac::ShowProfileSigninConfirmation(
+    Browser* browser,
+    Profile* profile,
+    const std::string& username,
+    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) {
+  ProfileSigninConfirmationDialogViews::ShowDialog(browser, profile, username,
+                                                   std::move(delegate));
+}
diff --git a/chrome/browser/ui/collected_cookies_browsertest.cc b/chrome/browser/ui/collected_cookies_browsertest.cc
index 0316265..e946733 100644
--- a/chrome/browser/ui/collected_cookies_browsertest.cc
+++ b/chrome/browser/ui/collected_cookies_browsertest.cc
@@ -22,7 +22,7 @@
  public:
   CollectedCookiesTest() {}
 
-  // TestDialogInterface:
+  // DialogBrowserTest:
   void ShowDialog(const std::string& name) override {
     ASSERT_TRUE(embedded_test_server()->Start());
 
diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
index 1ad06fa..4933765 100644
--- a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
+++ b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
@@ -241,11 +241,11 @@
 
   content::RecordAction(
       base::UserMetricsAction("Signin_Show_EnterpriseAccountPrompt"));
-  TabDialogs::FromWebContents(web_contents)->ShowProfileSigninConfirmation(
-      browser_,
-      profile_,
-      signin->GetUsernameForAuthInProgress(),
-      new SigninDialogDelegate(weak_pointer_factory_.GetWeakPtr()));
+  TabDialogs::FromWebContents(web_contents)
+      ->ShowProfileSigninConfirmation(browser_, profile_,
+                                      signin->GetUsernameForAuthInProgress(),
+                                      base::MakeUnique<SigninDialogDelegate>(
+                                          weak_pointer_factory_.GetWeakPtr()));
 }
 
 void OneClickSigninSyncStarter::LoadPolicyWithCachedCredentials() {
diff --git a/chrome/browser/ui/tab_dialogs.h b/chrome/browser/ui/tab_dialogs.h
index ca3fec18b..41ac3c1 100644
--- a/chrome/browser/ui/tab_dialogs.h
+++ b/chrome/browser/ui/tab_dialogs.h
@@ -59,7 +59,7 @@
       Browser* browser,
       Profile* profile,
       const std::string& username,
-      ui::ProfileSigninConfirmationDelegate* delegate) = 0;
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) = 0;
 
   // Shows or hides the ManagePasswords bubble.
   // Pass true for |user_action| if this is a user initiated action.
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
index 1ee37be..774b60956 100644
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/views/profiles/profile_chooser_view.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/constrained_window/constrained_window_views.h"
@@ -22,6 +21,7 @@
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/ui_features.h"
 #include "ui/gfx/font.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gfx/range/range.h"
@@ -36,13 +36,17 @@
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/dialog_client_view.h"
 
+#if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
+#include "chrome/browser/ui/views/profiles/profile_chooser_view.h"
+#endif
+
 ProfileSigninConfirmationDialogViews::ProfileSigninConfirmationDialogViews(
     Browser* browser,
     const std::string& username,
-    ui::ProfileSigninConfirmationDelegate* delegate)
+    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate)
     : browser_(browser),
       username_(username),
-      delegate_(delegate),
+      delegate_(std::move(delegate)),
       prompt_for_new_profile_(true) {}
 
 ProfileSigninConfirmationDialogViews::~ProfileSigninConfirmationDialogViews() {}
@@ -52,7 +56,8 @@
     Browser* browser,
     Profile* profile,
     const std::string& username,
-    ui::ProfileSigninConfirmationDelegate* delegate) {
+    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) {
+#if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
   // Hides the new avatar bubble if it is currently shown. The new avatar bubble
   // should be automatically closed when it loses focus. However on windows the
   // profile signin confirmation dialog is not modal yet thus it does not take
@@ -61,10 +66,11 @@
   // TODO(guohui): removes the workaround once the profile confirmation dialog
   // is fixed.
   ProfileChooserView::Hide();
+#endif
 
   ProfileSigninConfirmationDialogViews* dialog =
-      new ProfileSigninConfirmationDialogViews(
-          browser, username, delegate);
+      new ProfileSigninConfirmationDialogViews(browser, username,
+                                               std::move(delegate));
   ui::CheckShouldPromptForNewProfile(
       profile,
       // This callback is guaranteed to be invoked, and once it is, the dialog
@@ -117,7 +123,7 @@
       delegate_->OnSigninWithNewProfile();
     else
       delegate_->OnContinueSignin();
-    delegate_ = NULL;
+    delegate_ = nullptr;
   }
   return true;
 }
@@ -125,7 +131,7 @@
 bool ProfileSigninConfirmationDialogViews::Cancel() {
   if (delegate_) {
     delegate_->OnCancelSignin();
-    delegate_ = NULL;
+    delegate_ = nullptr;
   }
   return true;
 }
@@ -246,7 +252,7 @@
   DCHECK(prompt_for_new_profile_);
   if (delegate_) {
     delegate_->OnContinueSignin();
-    delegate_ = NULL;
+    delegate_ = nullptr;
   }
   GetWidget()->Close();
 }
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h
index ffa5f579..a466abd 100644
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_SYNC_PROFILE_SIGNIN_CONFIRMATION_DIALOG_VIEWS_H_
 #define CHROME_BROWSER_UI_VIEWS_SYNC_PROFILE_SIGNIN_CONFIRMATION_DIALOG_VIEWS_H_
 
+#include <memory>
+
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
@@ -23,16 +25,17 @@
                                              public views::ButtonListener {
  public:
   // Create and show the dialog, which owns itself.
-  static void ShowDialog(Browser* browser,
-                         Profile* profile,
-                         const std::string& username,
-                         ui::ProfileSigninConfirmationDelegate* delegate);
+  static void ShowDialog(
+      Browser* browser,
+      Profile* profile,
+      const std::string& username,
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate);
 
  private:
   ProfileSigninConfirmationDialogViews(
       Browser* browser,
       const std::string& username,
-      ui::ProfileSigninConfirmationDelegate* delegate);
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate);
   ~ProfileSigninConfirmationDialogViews() override;
 
   // views::DialogDelegateView:
@@ -69,7 +72,7 @@
   std::string username_;
 
   // Dialog button handler.
-  ui::ProfileSigninConfirmationDelegate* delegate_;
+  std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate_;
 
   // Whether the user should be prompted to create a new profile.
   bool prompt_for_new_profile_;
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc
new file mode 100644
index 0000000..4ee2eb5
--- /dev/null
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc
@@ -0,0 +1,76 @@
+// 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 "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h"
+
+#include "base/command_line.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
+#include "chrome/browser/ui/tab_dialogs.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/test/test_browser_dialog.h"
+#include "components/bookmarks/browser/bookmark_model.h"
+#include "ui/base/ui_base_switches.h"
+
+namespace {
+
+// Test delegate passed to the confirmation dialog to receive (and currently
+// ignore) the result from the dialog.
+class TestSigninDialogDelegate : public ui::ProfileSigninConfirmationDelegate {
+ public:
+  TestSigninDialogDelegate() {}
+  virtual ~TestSigninDialogDelegate() {}
+
+  void OnCancelSignin() override {}
+  void OnContinueSignin() override {}
+  void OnSigninWithNewProfile() override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestSigninDialogDelegate);
+};
+
+}  // namespace
+
+class ProfileSigninConfirmationDialogTest : public DialogBrowserTest {
+ public:
+  ProfileSigninConfirmationDialogTest() {}
+
+  // content::BrowserTestBase:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    command_line->AppendSwitch(switches::kExtendMdToSecondaryUi);
+  }
+
+  // DialogBrowserTest:
+  void ShowDialog(const std::string& name) override {
+    Profile* profile = browser()->profile();
+
+    // Add a bookmark to ensure CheckShouldPromptForNewProfile() returns true.
+    bookmarks::BookmarkModel* bookmarks =
+        BookmarkModelFactory::GetForBrowserContext(profile);
+    bookmarks->AddURL(bookmarks->bookmark_bar_node(), 0,
+                      base::ASCIIToUTF16("title"),
+                      GURL("http://www.example.com"));
+
+    content::WebContents* web_contents =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    TabDialogs::FromWebContents(web_contents)
+        ->ShowProfileSigninConfirmation(
+            browser(), profile, "username@example.com",
+            base::MakeUnique<TestSigninDialogDelegate>());
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ProfileSigninConfirmationDialogTest);
+};
+
+// Test that calls ShowDialog("default"). Interactive when run via
+// browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive
+// --dialog=ProfileSigninConfirmationDialogTest.InvokeDialog_default
+IN_PROC_BROWSER_TEST_F(ProfileSigninConfirmationDialogTest,
+                       InvokeDialog_default) {
+  RunDialog();
+}
diff --git a/chrome/browser/ui/views/tab_dialogs_views.cc b/chrome/browser/ui/views/tab_dialogs_views.cc
index 46177c1..fa36944f 100644
--- a/chrome/browser/ui/views/tab_dialogs_views.cc
+++ b/chrome/browser/ui/views/tab_dialogs_views.cc
@@ -53,10 +53,10 @@
     Browser* browser,
     Profile* profile,
     const std::string& username,
-    ui::ProfileSigninConfirmationDelegate* delegate) {
+    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) {
 #if !defined(OS_CHROMEOS)
-  ProfileSigninConfirmationDialogViews::ShowDialog(
-      browser, profile, username, delegate);
+  ProfileSigninConfirmationDialogViews::ShowDialog(browser, profile, username,
+                                                   std::move(delegate));
 #else
   NOTREACHED();
 #endif
diff --git a/chrome/browser/ui/views/tab_dialogs_views.h b/chrome/browser/ui/views/tab_dialogs_views.h
index 83f4e473..c1bc6fc 100644
--- a/chrome/browser/ui/views/tab_dialogs_views.h
+++ b/chrome/browser/ui/views/tab_dialogs_views.h
@@ -24,7 +24,7 @@
       Browser* browser,
       Profile* profile,
       const std::string& username,
-      ui::ProfileSigninConfirmationDelegate* delegate) override;
+      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) override;
   void ShowManagePasswordsBubble(bool user_action) override;
   void HideManagePasswordsBubble() override;
   base::WeakPtr<ValidationMessageBubble> ShowValidationMessage(
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index e6f28de..fe1e20c 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -604,8 +604,6 @@
     g_testing_delegate->DidRenderPreviewPage(web_ui()->GetWebContents());
   web_ui()->CallJavascriptFunctionUnsafe("onDidPreviewPage", number,
                                          ui_identifier, request_id);
-  if (g_testing_delegate && g_testing_delegate->IsAutoCancelEnabled())
-    web_ui()->CallJavascriptFunctionUnsafe("autoCancelForTesting");
 }
 
 void PrintPreviewUI::OnPreviewDataIsAvailable(int expected_pages_count,
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
index fa9d79e..89ff9b7 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
@@ -151,7 +151,6 @@
   // also instructs the dialog to auto-cancel, which is used for testing only.
   class TestingDelegate {
    public:
-    virtual bool IsAutoCancelEnabled() = 0;
     virtual void DidGetPreviewPageCount(int page_count) = 0;
     virtual void DidRenderPreviewPage(content::WebContents* preview_dialog) = 0;
   };
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index 41a5635..8c9f448 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -16,6 +16,7 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/printing/fake_printer_discoverer.h"
 #include "chrome/browser/chromeos/printing/ppd_provider_factory.h"
 #include "chrome/browser/chromeos/printing/printer_pref_manager_factory.h"
 #include "chrome/browser/download/download_prefs.h"
@@ -26,7 +27,6 @@
 #include "chrome/common/chrome_paths.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/debug_daemon_client.h"
-#include "chromeos/printing/fake_printer_discoverer.h"
 #include "chromeos/printing/ppd_cache.h"
 #include "chromeos/printing/ppd_provider.h"
 #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
index 56580dbd..0ca00aa4 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -11,10 +11,10 @@
 
 #include "base/files/file_path.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/printing/printer_discoverer.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
 #include "chromeos/printing/ppd_provider.h"
 #include "chromeos/printing/printer_configuration.h"
-#include "chromeos/printing/printer_discoverer.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
 
 namespace base {
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
index bbd8910..0a7d662 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
@@ -66,7 +66,7 @@
     waiting_for_android = true;
   } else {
     std::vector<NoteTakingAppInfo> available_apps =
-        NoteTakingHelper::Get()->GetAvailableApps(Profile::FromWebUI(web_ui()));
+        helper->GetAvailableApps(Profile::FromWebUI(web_ui()));
     for (const NoteTakingAppInfo& info : available_apps) {
       auto dict = base::MakeUnique<base::DictionaryValue>();
       dict->SetString(kAppNameKey, info.name);
@@ -78,13 +78,13 @@
     }
   }
 
+  AllowJavascript();
   CallJavascriptFunction(
       "cr.webUIListenerCallback", base::StringValue("onNoteTakingAppsUpdated"),
       apps_list, base::FundamentalValue(waiting_for_android));
 }
 
 void StylusHandler::RequestApps(const base::ListValue* unused_args) {
-  AllowJavascript();
   UpdateNoteTakingApps();
 }
 
@@ -104,13 +104,13 @@
 }
 
 void StylusHandler::HandleInitialize(const base::ListValue* args) {
-  AllowJavascript();
   if (ui::InputDeviceManager::GetInstance()->AreDeviceListsComplete())
     SendHasStylus();
 }
 
 void StylusHandler::SendHasStylus() {
   DCHECK(ui::InputDeviceManager::GetInstance()->AreDeviceListsComplete());
+  AllowJavascript();
   CallJavascriptFunction(
       "cr.webUIListenerCallback", base::StringValue("has-stylus-changed"),
       base::FundamentalValue(ash::palette_utils::HasStylusInput()));
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 59a58613..73bc421 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -1099,6 +1099,11 @@
 const char kWindows8Search[]                = "windows8-search";
 #endif  // defined(OS_WIN)
 
+#if BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
+// Used to enable Mus+ash.
+const char kMash[]                          = "mash";
+#endif
+
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) && !defined(OFFICIAL_BUILD)
 // Enables support to debug printing subsystem.
 const char kDebugPrint[] = "debug-print";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 9ae5a80..df69b26 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -9,6 +9,7 @@
 #define CHROME_COMMON_CHROME_SWITCHES_H_
 
 #include "build/build_config.h"
+#include "chrome/common/features.h"
 #include "ppapi/features/features.h"
 #include "printing/features/features.h"
 
@@ -329,6 +330,10 @@
 extern const char kWindows8Search[];
 #endif  // defined(OS_WIN)
 
+#if BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
+extern const char kMash[];
+#endif
+
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) && !defined(OFFICIAL_BUILD)
 extern const char kDebugPrint[];
 #endif
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc
index 8932a87..69b8a8d 100644
--- a/chrome/service/service_utility_process_host.cc
+++ b/chrome/service/service_utility_process_host.cc
@@ -169,7 +169,6 @@
     : client_(client),
       client_task_runner_(client_task_runner),
       waiting_for_reply_(false),
-      mojo_child_token_(mojo::edk::GenerateRandomToken()),
       weak_ptr_factory_(this) {
   child_process_host_.reset(ChildProcessHost::Create(this));
 }
@@ -221,7 +220,7 @@
 
 bool ServiceUtilityProcessHost::StartProcess(bool no_sandbox) {
   std::string mojo_channel_token =
-      child_process_host_->CreateChannelMojo(mojo_child_token_);
+      child_process_host_->CreateChannelMojo(&process_connection_);
   if (mojo_channel_token.empty())
     return false;
 
@@ -278,13 +277,9 @@
     }
   }
 
-  if (success) {
-    mojo::edk::ChildProcessLaunched(process_.Handle(),
-                                    std::move(parent_handle),
-                                    mojo_child_token_);
-  } else {
-    mojo::edk::ChildProcessLaunchFailed(mojo_child_token_);
-  }
+  if (success)
+    process_connection_.Connect(process_.Handle(), std::move(parent_handle));
+
   return success;
 }
 
diff --git a/chrome/service/service_utility_process_host.h b/chrome/service/service_utility_process_host.h
index d0dea94..7fc9ab88 100644
--- a/chrome/service/service_utility_process_host.h
+++ b/chrome/service/service_utility_process_host.h
@@ -13,6 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "content/public/common/child_process_host_delegate.h"
 #include "ipc/ipc_platform_file.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 
 namespace base {
 class CommandLine;
@@ -147,7 +148,7 @@
   scoped_refptr<Client> client_;
   scoped_refptr<base::SingleThreadTaskRunner> client_task_runner_;
   bool waiting_for_reply_;
-  const std::string mojo_child_token_;
+  mojo::edk::PendingProcessConnection process_connection_;
 
   // Start time of operation.
   base::Time start_time_;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 9af0c32e..928676f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2156,6 +2156,7 @@
         "../browser/ui/views/frame/browser_non_client_frame_view_browsertest_win.cc",
         "../browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc",
         "../browser/ui/views/select_file_dialog_extension_browsertest.cc",
+        "../browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc",
       ]
       deps += [ "//ui/views" ]
       if (!is_chromeos && (!is_mac || mac_views_browser)) {
@@ -2379,6 +2380,7 @@
         "../browser/ui/views/external_protocol_dialog_browsertest.cc",
 
         # inline login UI is disabled on chromeos
+        "../browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc",
         "../browser/ui/webui/signin/inline_login_ui_browsertest.cc",
 
         # chromeos does not use the desktop user manager
diff --git a/chrome/test/base/mojo_test_connector.cc b/chrome/test/base/mojo_test_connector.cc
index 2c7e92a..f1bcee2 100644
--- a/chrome/test/base/mojo_test_connector.cc
+++ b/chrome/test/base/mojo_test_connector.cc
@@ -17,6 +17,7 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/test/test_launcher.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/edk/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
@@ -42,8 +43,7 @@
  public:
   explicit MojoTestState(
       service_manager::BackgroundServiceManager* background_service_manager)
-      : child_token_(mojo::edk::GenerateRandomToken()),
-        background_service_manager_(background_service_manager),
+      : background_service_manager_(background_service_manager),
         weak_factory_(this) {}
   ~MojoTestState() override {}
 
@@ -68,8 +68,8 @@
 #error "Unsupported"
 #endif
     service_manager::mojom::ServicePtr service =
-        service_manager::PassServiceRequestOnCommandLine(command_line,
-                                                         child_token_);
+        service_manager::PassServiceRequestOnCommandLine(&process_connection_,
+                                                         command_line);
 
     background_service_manager_->RegisterService(
         service_manager::Identity(
@@ -87,8 +87,7 @@
   void ChildProcessLaunched(base::ProcessHandle handle,
                             base::ProcessId pid) override {
     platform_channel_->ChildProcessLaunched();
-    mojo::edk::ChildProcessLaunched(
-        handle, platform_channel_->PassServerHandle(), child_token_);
+    process_connection_.Connect(handle, platform_channel_->PassServerHandle());
 
     main_task_runner_->PostTask(
         FROM_HERE,
@@ -102,7 +101,7 @@
     pid_receiver_.reset();
   }
 
-  const std::string child_token_;
+  mojo::edk::PendingProcessConnection process_connection_;
   service_manager::BackgroundServiceManager* const background_service_manager_;
 
   // NOTE: HandlePassingInformation must remain valid through process launch,
diff --git a/chrome/test/chromedriver/chrome/version.cc b/chrome/test/chromedriver/chrome/version.cc
index a401b67..92f52ad 100644
--- a/chrome/test/chromedriver/chrome/version.cc
+++ b/chrome/test/chromedriver/chrome/version.cc
@@ -9,7 +9,7 @@
 namespace {
 
 // This variable must be able to be found and parsed by the upload script.
-const int kMinimumSupportedChromeVersion[] = {54, 0, 2840, 0};
+const int kMinimumSupportedChromeVersion[] = {55, 0, 2883, 0};
 
 }  // namespace
 
diff --git a/chrome/test/chromedriver/test/run_all_tests.py b/chrome/test/chromedriver/test/run_all_tests.py
index 3d4d877..b5b421437 100755
--- a/chrome/test/chromedriver/test/run_all_tests.py
+++ b/chrome/test/chromedriver/test/run_all_tests.py
@@ -193,15 +193,15 @@
       # Linux32 builds need to be special-cased, because 1) they are keyed by
       # git hash rather than commit position, and 2) come from a different
       # download site (so we can't just convert the commit position to a hash).
+      versions['57'] = '7da9cd89d4d18e171323ff7d0d2a93ede0c1d721'
       versions['56'] = '67002b0fdaa3123f10f96fa2f7965677d531db74'
       versions['55'] = 'e9bc4e0245c9a1e570ed2cf8e12152b9122275f2'
-      versions['54'] = '13d140acdaa710770f42790044825b49f99e466c'
       # TODO(samuong): speculative fix for crbug.com/611886
       os.environ['CHROME_DEVEL_SANDBOX'] = '/opt/chromium/chrome_sandbox'
     else:
+      versions['57'] = '444890'
       versions['56'] = '433020'
       versions['55'] = '423791'
-      versions['54'] = '414545'
     code = 0
     for version, revision in versions.iteritems():
       if options.chrome_version and version != options.chrome_version:
diff --git a/chrome/test/chromedriver/test/test_expectations b/chrome/test/chromedriver/test/test_expectations
index b321fde..063ffbb 100644
--- a/chrome/test/chromedriver/test/test_expectations
+++ b/chrome/test/chromedriver/test/test_expectations
@@ -240,6 +240,13 @@
         'CorrectEventFiringTest.testShouldFireMouseDownEventWhenClicking',
         # https://bugs.chromium.org/p/chromedriver/issues/detail?id=998
         'ImplicitWaitTest.testShouldImplicitlyWaitForASingleElement',
+        # https://bugs.chromium.org/p/chromedriver/issues/detail?id=922
+        'ClickTest.testCanClickOnAnElementWithTopSetToANegativeNumber',
+        'CorrectEventFiringTest.testClickEventsShouldBubble',
+        'VisibilityTest.testShouldModifyTheVisibilityOfAnElementDynamically',
+        'CorrectEventFiringTest.testSendingKeysToAFocusedElementShouldNotBlurThatElement',
+        'JavascriptEnabledDriverTest.testShouldBeAbleToClickOnSubmitButtons',
+        'JavascriptEnabledDriverTest.testIssue80ClickShouldGenerateClickEvent',
     ]
 )
 _OS_NEGATIVE_FILTER['android:chrome_beta'] = (
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js
index b8cd5c4..ff1d784 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -274,6 +274,9 @@
         // on a background tab (which has throttled timers) and will timeout.
         link.target = '';
         link.href = '#';
+        // Prevent the link from triggering a page navigation when tapped.
+        // Breaks the test in Vulcanized mode.
+        link.addEventListener('tap', function(e) { e.preventDefault(); });
 
         MockInteractions.tap(link);
 
diff --git a/chrome/utility/importer/firefox_importer_unittest_utils_mac.cc b/chrome/utility/importer/firefox_importer_unittest_utils_mac.cc
index 777a461..e94d671 100644
--- a/chrome/utility/importer/firefox_importer_unittest_utils_mac.cc
+++ b/chrome/utility/importer/firefox_importer_unittest_utils_mac.cc
@@ -28,6 +28,7 @@
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_message.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
 #include "testing/multiprocess_func_list.h"
@@ -146,27 +147,19 @@
   listener_.reset(new FFDecryptorServerChannelListener());
 
   // Set up IPC channel using ChannelMojo.
-  const std::string mojo_child_token = mojo::edk::GenerateRandomToken();
-  const std::string mojo_channel_token = mojo::edk::GenerateRandomToken();
-  mojo::ScopedMessagePipeHandle parent_handle =
-      mojo::edk::CreateParentMessagePipe(mojo_channel_token, mojo_child_token);
-  channel_ = IPC::Channel::CreateServer(parent_handle.release(),
-                                        listener_.get());
+  mojo::edk::PendingProcessConnection process;
+  std::string token;
+  mojo::ScopedMessagePipeHandle parent_pipe = process.CreateMessagePipe(&token);
+  channel_ = IPC::Channel::CreateServer(parent_pipe.release(), listener_.get());
   CHECK(channel_->Connect());
   listener_->SetSender(channel_.get());
 
   // Spawn child and set up sync IPC connection.
   mojo::edk::PlatformChannelPair channel_pair;
   child_process_ = LaunchNSSDecrypterChildProcess(
-      nss_path, channel_pair.PassClientHandle(), mojo_channel_token);
-  if (child_process_.IsValid()) {
-    mojo::edk::ChildProcessLaunched(child_process_.Handle(),
-                                    channel_pair.PassServerHandle(),
-                                    mojo_child_token);
-  } else {
-    mojo::edk::ChildProcessLaunchFailed(mojo_child_token);
-  }
-
+      nss_path, channel_pair.PassClientHandle(), token);
+  if (child_process_.IsValid())
+    process.Connect(child_process_.Handle(), channel_pair.PassServerHandle());
   return child_process_.IsValid();
 }
 
diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp
index 8e98eb2a5..291f667 100644
--- a/chromeos/chromeos.gyp
+++ b/chromeos/chromeos.gyp
@@ -365,15 +365,12 @@
       'network/shill_property_handler.h',
       'network/shill_property_util.cc',
       'network/shill_property_util.h',
-      'printing/fake_printer_discoverer.cc',
-      'printing/fake_printer_discoverer.h',
       'printing/ppd_cache.cc',
       'printing/ppd_cache.h',
       'printing/ppd_provider.cc',
       'printing/ppd_provider.h',
       'printing/printer_configuration.cc',
       'printing/printer_configuration.h',
-      'printing/printer_discoverer.h',
       'printing/printer_translator.cc',
       'printing/printer_translator.h',
       'process_proxy/process_output_watcher.cc',
diff --git a/components/arc/arc_session.cc b/components/arc/arc_session.cc
index 92940393..c063a645 100644
--- a/components/arc/arc_session.cc
+++ b/components/arc/arc_session.cc
@@ -33,6 +33,7 @@
 #include "mojo/edk/embedder/embedder.h"
 #include "mojo/edk/embedder/named_platform_handle.h"
 #include "mojo/edk/embedder/named_platform_handle_utils.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/edk/embedder/platform_channel_utils_posix.h"
 #include "mojo/edk/embedder/platform_handle_vector.h"
@@ -441,15 +442,16 @@
   // Hardcode pid 0 since it is unused in mojo.
   const base::ProcessHandle kUnusedChildProcessHandle = 0;
   mojo::edk::PlatformChannelPair channel_pair;
-  std::string child_token = mojo::edk::GenerateRandomToken();
-  mojo::edk::ChildProcessLaunched(kUnusedChildProcessHandle,
-                                  channel_pair.PassServerHandle(), child_token);
+  mojo::edk::PendingProcessConnection process;
+  process.Connect(kUnusedChildProcessHandle, channel_pair.PassServerHandle());
 
   mojo::edk::ScopedPlatformHandleVectorPtr handles(
       new mojo::edk::PlatformHandleVector{
           channel_pair.PassClientHandle().release()});
 
-  std::string token = mojo::edk::GenerateRandomToken();
+  std::string token;
+  mojo::ScopedMessagePipeHandle pipe = process.CreateMessagePipe(&token);
+
   // We need to send the length of the message as a single byte, so make sure it
   // fits.
   DCHECK_LT(token.size(), 256u);
@@ -464,7 +466,7 @@
     return mojo::ScopedMessagePipeHandle();
   }
 
-  return mojo::edk::CreateParentMessagePipe(token, child_token);
+  return pipe;
 }
 
 void ArcSessionImpl::OnMojoConnected(
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
index 63f6080..52f7982 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
@@ -142,8 +142,7 @@
 bool FetchWarmupURLEnabled() {
   // Fetching of the warmup URL can be enabled only for Enabled* and Control*
   // groups.
-  if (!base::StartsWith(FieldTrialList::FindFullName(kQuicFieldTrial), kEnabled,
-                        base::CompareCase::SENSITIVE) &&
+  if (!IsIncludedInQuicFieldTrial() &&
       !base::StartsWith(FieldTrialList::FindFullName(kQuicFieldTrial), kControl,
                         base::CompareCase::SENSITIVE)) {
     return false;
@@ -215,7 +214,16 @@
 }
 
 bool IsIncludedInQuicFieldTrial() {
-  return IsIncludedInFieldTrial(kQuicFieldTrial);
+  if (base::StartsWith(FieldTrialList::FindFullName(kQuicFieldTrial), kControl,
+                       base::CompareCase::SENSITIVE)) {
+    return false;
+  }
+  if (base::StartsWith(FieldTrialList::FindFullName(kQuicFieldTrial), kDisabled,
+                       base::CompareCase::SENSITIVE)) {
+    return false;
+  }
+  // QUIC is enabled by default.
+  return true;
 }
 
 const char* GetQuicFieldTrialName() {
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_params_unittest.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_params_unittest.cc
index 0d10608..20de811 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_params_unittest.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_params_unittest.cc
@@ -422,8 +422,9 @@
        std::string()},
       {"Control", false, "true", false, true, true, std::string()},
       {"Disabled", false, "false", false, true, false, std::string()},
-      {"enabled", false, "false", false, true, false, std::string()},
+      {"enabled", true, "false", false, true, true, std::string()},
       {"Enabled", true, "true", true, true, true, "example.com/test.html"},
+      {std::string(), true, "true", false, false, false, std::string()},
   };
 
   for (const auto& test : tests) {
diff --git a/components/metrics/metrics_service_client.cc b/components/metrics/metrics_service_client.cc
index 0d95592..5b64277 100644
--- a/components/metrics/metrics_service_client.cc
+++ b/components/metrics/metrics_service_client.cc
@@ -8,6 +8,10 @@
 
 namespace metrics {
 
+MetricsServiceClient::MetricsServiceClient() : update_running_services_() {}
+
+MetricsServiceClient::~MetricsServiceClient() {}
+
 ukm::UkmService* MetricsServiceClient::GetUkmService() {
   return nullptr;
 }
@@ -32,4 +36,18 @@
   return metrics::kDefaultMetricsServerUrl;
 }
 
+bool MetricsServiceClient::IsHistorySyncEnabledOnAllProfiles() {
+  return false;
+}
+
+void MetricsServiceClient::SetUpdateRunningServicesCallback(
+    const base::Closure& callback) {
+  update_running_services_ = callback;
+}
+
+void MetricsServiceClient::UpdateRunningServices() {
+  if (update_running_services_)
+    update_running_services_.Run();
+}
+
 }  // namespace metrics
diff --git a/components/metrics/metrics_service_client.h b/components/metrics/metrics_service_client.h
index 858d1d87..2ce2017 100644
--- a/components/metrics/metrics_service_client.h
+++ b/components/metrics/metrics_service_client.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "base/callback_forward.h"
+#include "base/callback.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
 #include "components/metrics/metrics_reporting_default_state.h"
@@ -33,7 +33,8 @@
 // environment.
 class MetricsServiceClient {
  public:
-  virtual ~MetricsServiceClient() {}
+  MetricsServiceClient();
+  virtual ~MetricsServiceClient();
 
   // Returns the MetricsService instance that this client is associated with.
   // With the exception of testing contexts, the returned instance must be valid
@@ -120,6 +121,21 @@
 
   // Returns whether cellular logic is enabled for metrics reporting.
   virtual bool IsUMACellularUploadLogicEnabled();
+
+  // Returns if history sync is enabled on all active profiles.
+  virtual bool IsHistorySyncEnabledOnAllProfiles();
+
+  // Sets the callback to run MetricsServiceManager::UpdateRunningServices.
+  void SetUpdateRunningServicesCallback(const base::Closure& callback);
+
+ protected:
+  // Notify MetricsServiceManager to UpdateRunningServices using callback.
+  void UpdateRunningServices();
+
+ private:
+  base::Closure update_running_services_;
+
+  DISALLOW_COPY_AND_ASSIGN(MetricsServiceClient);
 };
 
 }  // namespace metrics
diff --git a/components/metrics_services_manager/metrics_services_manager.cc b/components/metrics_services_manager/metrics_services_manager.cc
index e1ec650..7b87f88 100644
--- a/components/metrics_services_manager/metrics_services_manager.cc
+++ b/components/metrics_services_manager/metrics_services_manager.cc
@@ -68,27 +68,40 @@
 metrics::MetricsServiceClient*
 MetricsServicesManager::GetMetricsServiceClient() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (!metrics_service_client_)
+  if (!metrics_service_client_) {
     metrics_service_client_ = client_->CreateMetricsServiceClient();
+    // base::Unretained is safe since |this| owns the metrics_service_client_.
+    metrics_service_client_->SetUpdateRunningServicesCallback(
+        base::Bind(&MetricsServicesManager::UpdateRunningServices,
+                   base::Unretained(this)));
+  }
   return metrics_service_client_.get();
 }
 
-void MetricsServicesManager::UpdatePermissions(bool may_record,
-                                               bool may_upload) {
+void MetricsServicesManager::UpdatePermissions(bool current_may_record,
+                                               bool current_may_upload) {
   DCHECK(thread_checker_.CalledOnValidThread());
+  // If the user has opted out of metrics, delete local UKM state.
+  if (may_record_ && !current_may_record) {
+    ukm::UkmService* ukm = GetUkmService();
+    if (ukm) {
+      ukm->Purge();
+      ukm->ResetClientId();
+    }
+  }
+
   // Stash the current permissions so that we can update the RapporServiceImpl
   // correctly when the Rappor preference changes.  The metrics recording
   // preference partially determines the initial rappor setting, and also
   // controls whether FINE metrics are sent.
-  may_record_ = may_record;
-  may_upload_ = may_upload;
+  may_record_ = current_may_record;
+  may_upload_ = current_may_upload;
   UpdateRunningServices();
 }
 
 void MetricsServicesManager::UpdateRunningServices() {
   DCHECK(thread_checker_.CalledOnValidThread());
   metrics::MetricsService* metrics = GetMetricsService();
-  ukm::UkmService* ukm = GetUkmService();
 
   if (client_->OnlyDoMetricsRecording()) {
     metrics->StartRecordingForTests();
@@ -102,23 +115,16 @@
   if (may_record_) {
     if (!metrics->recording_active())
       metrics->Start();
-
-    if (may_upload_) {
+    if (may_upload_)
       metrics->EnableReporting();
-#if !defined(OFFICIAL_BUILD)
-      // TODO(holte): Make UKM check sync state instead of official build.
-      if (ukm)
-        ukm->EnableReporting();
-#endif
-    } else {
+    else
       metrics->DisableReporting();
-      if (ukm)
-        ukm->DisableReporting();
-    }
   } else {
     metrics->Stop();
   }
 
+  UpdateUkmService();
+
   int recording_groups = 0;
 #if defined(GOOGLE_CHROME_BUILD)
   if (may_record_)
@@ -137,6 +143,24 @@
   GetRapporServiceImpl()->Update(recording_groups, may_upload_);
 }
 
+void MetricsServicesManager::UpdateUkmService() {
+  ukm::UkmService* ukm = GetUkmService();
+  if (!ukm)
+    return;
+  bool sync_enabled =
+      metrics_service_client_->IsHistorySyncEnabledOnAllProfiles();
+  if (may_record_ && sync_enabled) {
+    ukm->EnableRecording();
+    if (may_upload_)
+      ukm->EnableReporting();
+    else
+      ukm->DisableReporting();
+  } else {
+    ukm->DisableRecording();
+    ukm->DisableReporting();
+  }
+}
+
 void MetricsServicesManager::UpdateUploadPermissions(bool may_upload) {
   UpdatePermissions(client_->IsMetricsReportingEnabled(), may_upload);
 }
diff --git a/components/metrics_services_manager/metrics_services_manager.h b/components/metrics_services_manager/metrics_services_manager.h
index 4bfe18d7..6880845 100644
--- a/components/metrics_services_manager/metrics_services_manager.h
+++ b/components/metrics_services_manager/metrics_services_manager.h
@@ -79,7 +79,7 @@
 
   // Update the managed services when permissions for recording/uploading
   // metrics change.
-  void UpdatePermissions(bool may_record, bool may_upload);
+  void UpdatePermissions(bool current_may_record, bool current_may_upload);
 
   // Update the managed services when permissions for uploading metrics change.
   void UpdateUploadPermissions(bool may_upload);
@@ -98,6 +98,9 @@
   // Update which services are running to match current permissions.
   void UpdateRunningServices();
 
+  // Update the state of UkmService to match current permissions.
+  void UpdateUkmService();
+
   // The client passed in from the embedder.
   std::unique_ptr<MetricsServicesManagerClient> client_;
 
diff --git a/components/nacl/broker/nacl_broker_listener.cc b/components/nacl/broker/nacl_broker_listener.cc
index 6161d66..734e5e5 100644
--- a/components/nacl/broker/nacl_broker_listener.cc
+++ b/components/nacl/broker/nacl_broker_listener.cc
@@ -26,6 +26,7 @@
 #include "content/public/common/sandbox_init.h"
 #include "ipc/ipc_channel.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "sandbox/win/src/sandbox_policy.h"
@@ -133,13 +134,12 @@
     cmd_line->AppendSwitchASCII(
         mojo::edk::PlatformChannelPair::kMojoPlatformChannelHandleSwitch,
         base::UintToString(base::win::HandleToUint32(handles[0])));
-    const std::string mojo_child_token = mojo::edk::GenerateRandomToken();
-    const std::string mojo_channel_token = mojo::edk::GenerateRandomToken();
+
+    mojo::edk::PendingProcessConnection pending_process;
+    std::string token;
     mojo::ScopedMessagePipeHandle host_message_pipe =
-        mojo::edk::CreateParentMessagePipe(mojo_channel_token,
-                                           mojo_child_token);
-    cmd_line->AppendSwitchASCII(switches::kServiceRequestChannelToken,
-                                mojo_channel_token);
+        pending_process.CreateMessagePipe(&token);
+    cmd_line->AppendSwitchASCII(switches::kServiceRequestChannelToken, token);
     CHECK_EQ(MOJO_RESULT_OK,
              mojo::FuseMessagePipes(std::move(loader_message_pipe),
                                     std::move(host_message_pipe)));
@@ -149,9 +149,9 @@
         this, cmd_line, handles, &loader_process);
 
     if (result == sandbox::SBOX_ALL_OK) {
-      mojo::edk::ChildProcessLaunched(loader_process.Handle(),
-                                      std::move(parent_handle),
-                                      mojo_child_token);
+      pending_process.Connect(loader_process.Handle(),
+                              std::move(parent_handle));
+
       // Note: PROCESS_DUP_HANDLE is necessary here, because:
       // 1) The current process is the broker, which is the loader's parent.
       // 2) The browser is not the loader's parent, and so only gets the
@@ -165,8 +165,6 @@
           browser_process_.Handle(), &loader_handle_in_browser,
           PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE,
           FALSE, 0);
-    } else {
-      mojo::edk::ChildProcessLaunchFailed(mojo_child_token);
     }
   }
 
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc
index bbb41f5e..c140cda 100644
--- a/components/sessions/core/tab_restore_service_helper.cc
+++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -348,6 +348,11 @@
       base::trace_event::MemoryDumpManager::GetInstance()
           ->system_allocator_pool_name();
 
+  if (entries_.empty()) {
+    // Nothing to report
+    return true;
+  }
+
   std::string entries_dump_name = base::StringPrintf(
       "tab_restore/service_helper_0x%" PRIXPTR "/entries",
       reinterpret_cast<uintptr_t>(this));
diff --git a/components/translate/ios/browser/js_translate_manager_unittest.mm b/components/translate/ios/browser/js_translate_manager_unittest.mm
index 838a9f9..21e9a9d 100644
--- a/components/translate/ios/browser/js_translate_manager_unittest.mm
+++ b/components/translate/ios/browser/js_translate_manager_unittest.mm
@@ -47,7 +47,8 @@
   base::scoped_nsobject<JsTranslateManager> manager_;
 };
 
-TEST_F(JsTranslateManagerTest, PerformancePlaceholder) {
+// TODO(crbug.com/658619#c47): Test reported as flaky.
+TEST_F(JsTranslateManagerTest, DISABLED_PerformancePlaceholder) {
   [manager_ inject];
   EXPECT_TRUE(IsDefined(@"performance"));
   EXPECT_TRUE(IsDefined(@"performance.now"));
diff --git a/components/ukm/BUILD.gn b/components/ukm/BUILD.gn
index 4cd8a195..398d893e 100644
--- a/components/ukm/BUILD.gn
+++ b/components/ukm/BUILD.gn
@@ -36,11 +36,14 @@
   sources = [
     "observers/history_delete_observer.cc",
     "observers/history_delete_observer.h",
+    "observers/sync_disable_observer.cc",
+    "observers/sync_disable_observer.h",
   ]
 
   deps = [
     "//base",
     "//components/history/core/browser",
+    "//components/sync",
   ]
 }
 
@@ -64,10 +67,12 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "observers/sync_disable_observer_unittest.cc",
     "ukm_service_unittest.cc",
   ]
 
   deps = [
+    ":observers",
     ":test_support",
     ":ukm",
     "//base",
@@ -75,6 +80,7 @@
     "//components/metrics",
     "//components/metrics:test_support",
     "//components/prefs:test_support",
+    "//components/sync:test_support_driver",
     "//net:test_support",
     "//testing/gtest",
     "//third_party/zlib:compression_utils",
diff --git a/components/ukm/observers/DEPS b/components/ukm/observers/DEPS
index b1c70a4..a8ed862 100644
--- a/components/ukm/observers/DEPS
+++ b/components/ukm/observers/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
   "+components/history/core/browser",
+  "+components/sync",
 ]
diff --git a/components/ukm/observers/sync_disable_observer.cc b/components/ukm/observers/sync_disable_observer.cc
new file mode 100644
index 0000000..23ae995
--- /dev/null
+++ b/components/ukm/observers/sync_disable_observer.cc
@@ -0,0 +1,81 @@
+// 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/ukm/observers/sync_disable_observer.h"
+
+#include "base/stl_util.h"
+
+namespace ukm {
+
+SyncDisableObserver::SyncDisableObserver()
+    : sync_observer_(this), all_profiles_enabled_(false) {}
+
+SyncDisableObserver::~SyncDisableObserver() {}
+
+// static
+SyncDisableObserver::SyncState SyncDisableObserver::GetSyncState(
+    syncer::SyncService* sync_service) {
+  return SyncDisableObserver::SyncState{
+      sync_service->GetPreferredDataTypes().Has(
+          syncer::HISTORY_DELETE_DIRECTIVES),
+      sync_service->IsEngineInitialized(),
+      sync_service->IsUsingSecondaryPassphrase(),
+  };
+}
+
+void SyncDisableObserver::ObserveServiceForSyncDisables(
+    syncer::SyncService* sync_service) {
+  previous_states_[sync_service] = GetSyncState(sync_service);
+  sync_observer_.Add(sync_service);
+  UpdateAllProfileEnabled(false);
+}
+
+void SyncDisableObserver::UpdateAllProfileEnabled(bool must_purge) {
+  bool all_enabled = AreAllProfilesEnabled();
+  if (must_purge || (all_enabled != all_profiles_enabled_)) {
+    all_profiles_enabled_ = all_enabled;
+    OnSyncPrefsChanged(must_purge);
+  }
+}
+
+bool SyncDisableObserver::AreAllProfilesEnabled() {
+  if (previous_states_.empty())
+    return false;
+  for (const auto& kv : previous_states_) {
+    const SyncDisableObserver::SyncState& state = kv.second;
+    if (!state.history_enabled || !state.initialized ||
+        state.passphrase_protected)
+      return false;
+  }
+  return true;
+}
+
+void SyncDisableObserver::OnStateChanged(syncer::SyncService* sync) {
+  DCHECK(base::ContainsKey(previous_states_, sync));
+  SyncDisableObserver::SyncState state = GetSyncState(sync);
+  const SyncDisableObserver::SyncState& previous_state = previous_states_[sync];
+  bool must_purge =
+      // Trigger a purge if history sync was disabled.
+      (previous_state.history_enabled && !state.history_enabled) ||
+      // Trigger a purge if the user added a passphrase.  Since we can't detect
+      // the use of a passphrase while the engine is not initialized, we may
+      // miss the transition if the user adds a passphrase in this state.
+      (previous_state.initialized && state.initialized &&
+       !previous_state.passphrase_protected && state.passphrase_protected);
+  previous_states_[sync] = state;
+  UpdateAllProfileEnabled(must_purge);
+}
+
+void SyncDisableObserver::OnSyncShutdown(syncer::SyncService* sync) {
+  DCHECK(base::ContainsKey(previous_states_, sync));
+  sync_observer_.Remove(sync);
+  previous_states_.erase(sync);
+  UpdateAllProfileEnabled(false);
+}
+
+bool SyncDisableObserver::IsHistorySyncEnabledOnAllProfiles() {
+  return all_profiles_enabled_;
+}
+
+}  // namespace ukm
diff --git a/components/ukm/observers/sync_disable_observer.h b/components/ukm/observers/sync_disable_observer.h
new file mode 100644
index 0000000..931e5ba
--- /dev/null
+++ b/components/ukm/observers/sync_disable_observer.h
@@ -0,0 +1,78 @@
+// 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_UKM_OBSERVERS_SYNC_DISABLE_OBSERVER_H_
+#define COMPONENTS_UKM_OBSERVERS_SYNC_DISABLE_OBSERVER_H_
+
+#include <map>
+
+#include "base/scoped_observer.h"
+#include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_service_observer.h"
+
+namespace ukm {
+
+// Observes the state of a set of SyncServices for changes to history sync
+// preferences.  This is for used to trigger purging of local state when
+// sync is disabled on a profile and disabling recording when any non-syncing
+// profiles are active.
+class SyncDisableObserver : public syncer::SyncServiceObserver {
+ public:
+  SyncDisableObserver();
+  ~SyncDisableObserver() override;
+
+  // Starts observing a service for sync disables.
+  void ObserveServiceForSyncDisables(syncer::SyncService* sync_service);
+
+  // Returns if history sync is enabled on all active profiles.
+  virtual bool IsHistorySyncEnabledOnAllProfiles();
+
+ protected:
+  // Called after state changes and some profile has sync disabled.
+  // If |must_purge| is true, sync was disabled for some profile, and
+  // local data should be purged.
+  virtual void OnSyncPrefsChanged(bool must_purge) = 0;
+
+ private:
+  // syncer::SyncServiceObserver:
+  void OnStateChanged(syncer::SyncService* sync) override;
+  void OnSyncShutdown(syncer::SyncService* sync) override;
+
+  // Recomputes all_profiles_enabled_ state from previous_states_;
+  void UpdateAllProfileEnabled(bool must_purge);
+
+  // Returns true iff all profiles are enabled in previous_states_.
+  // If there are no profiles being observed, this returns false.
+  bool AreAllProfilesEnabled();
+
+  // Tracks observed history services, for cleanup.
+  ScopedObserver<syncer::SyncService, syncer::SyncServiceObserver>
+      sync_observer_;
+
+  // State data about sync services that we need to remember.
+  struct SyncState {
+    // If the user has history sync enabled.
+    bool history_enabled;
+    // Whether the sync service has been initialized.
+    bool initialized;
+    // Whether user data is hidden by a secondary passphrase.
+    // This is not valid if the state is not initialized.
+    bool passphrase_protected;
+  };
+
+  // Gets the current state of a SyncService.
+  static SyncState GetSyncState(syncer::SyncService* sync);
+
+  // The list of services that had sync enabled when we last checked.
+  std::map<syncer::SyncService*, SyncState> previous_states_;
+
+  // Tracks if sync was enabled on all profiles after the last state change.
+  bool all_profiles_enabled_;
+
+  DISALLOW_COPY_AND_ASSIGN(SyncDisableObserver);
+};
+
+}  // namespace ukm
+
+#endif  // COMPONENTS_UKM_OBSERVERS_SYNC_DISABLE_OBSERVER_H_
diff --git a/components/ukm/observers/sync_disable_observer_unittest.cc b/components/ukm/observers/sync_disable_observer_unittest.cc
new file mode 100644
index 0000000..4e4080e
--- /dev/null
+++ b/components/ukm/observers/sync_disable_observer_unittest.cc
@@ -0,0 +1,216 @@
+// 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/ukm/observers/sync_disable_observer.h"
+
+#include "base/observer_list.h"
+#include "components/sync/driver/fake_sync_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ukm {
+
+namespace {
+
+class MockSyncService : public syncer::FakeSyncService {
+ public:
+  MockSyncService() {}
+  ~MockSyncService() override { Shutdown(); }
+
+  void SetStatus(bool has_passphrase, bool enabled) {
+    initialized_ = true;
+    has_passphrase_ = has_passphrase;
+    preferred_data_types_ =
+        enabled ? syncer::ModelTypeSet(syncer::HISTORY_DELETE_DIRECTIVES)
+                : syncer::ModelTypeSet();
+    for (auto& observer : observers_) {
+      observer.OnStateChanged(this);
+    }
+  }
+
+  void Shutdown() {
+    for (auto& observer : observers_) {
+      observer.OnSyncShutdown(this);
+    }
+  }
+
+ private:
+  // syncer::FakeSyncService:
+  void AddObserver(syncer::SyncServiceObserver* observer) override {
+    observers_.AddObserver(observer);
+  }
+  void RemoveObserver(syncer::SyncServiceObserver* observer) override {
+    observers_.RemoveObserver(observer);
+  }
+  bool IsEngineInitialized() const override { return initialized_; }
+  bool IsUsingSecondaryPassphrase() const override { return has_passphrase_; }
+  syncer::ModelTypeSet GetPreferredDataTypes() const override {
+    return preferred_data_types_;
+  }
+
+  bool initialized_ = false;
+  bool has_passphrase_ = false;
+  syncer::ModelTypeSet preferred_data_types_;
+
+  // The list of observers of the SyncService state.
+  base::ObserverList<syncer::SyncServiceObserver> observers_;
+
+  DISALLOW_COPY_AND_ASSIGN(MockSyncService);
+};
+
+class TestSyncDisableObserver : public SyncDisableObserver {
+ public:
+  TestSyncDisableObserver() : purged_(false), notified_(false) {}
+  ~TestSyncDisableObserver() override {}
+
+  bool ResetPurged() {
+    bool was_purged = purged_;
+    purged_ = false;
+    return was_purged;
+  }
+
+  bool ResetNotified() {
+    bool notified = notified_;
+    notified_ = false;
+    return notified;
+  }
+
+ private:
+  // SyncDisableObserver:
+  void OnSyncPrefsChanged(bool must_purge) override {
+    notified_ = true;
+    purged_ = purged_ || must_purge;
+  }
+  bool purged_;
+  bool notified_;
+  DISALLOW_COPY_AND_ASSIGN(TestSyncDisableObserver);
+};
+
+class SyncDisableObserverTest : public testing::Test {
+ public:
+  SyncDisableObserverTest() {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SyncDisableObserverTest);
+};
+
+}  // namespace
+
+TEST_F(SyncDisableObserverTest, NoProfiles) {
+  TestSyncDisableObserver observer;
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, OneEnabled) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync;
+  sync.SetStatus(false, true);
+  observer.ObserveServiceForSyncDisables(&sync);
+  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_TRUE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, Passphrase) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync;
+  sync.SetStatus(true, true);
+  observer.ObserveServiceForSyncDisables(&sync);
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, HistoryDisabled) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync;
+  sync.SetStatus(false, false);
+  observer.ObserveServiceForSyncDisables(&sync);
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, MixedProfiles1) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync1;
+  sync1.SetStatus(false, false);
+  observer.ObserveServiceForSyncDisables(&sync1);
+  MockSyncService sync2;
+  sync2.SetStatus(false, true);
+  observer.ObserveServiceForSyncDisables(&sync2);
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, MixedProfiles2) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync1;
+  sync1.SetStatus(false, true);
+  observer.ObserveServiceForSyncDisables(&sync1);
+  EXPECT_TRUE(observer.ResetNotified());
+  MockSyncService sync2;
+  sync2.SetStatus(false, false);
+  observer.ObserveServiceForSyncDisables(&sync2);
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_TRUE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+  sync2.Shutdown();
+  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_TRUE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, TwoEnabled) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync1;
+  sync1.SetStatus(false, true);
+  observer.ObserveServiceForSyncDisables(&sync1);
+  EXPECT_TRUE(observer.ResetNotified());
+  MockSyncService sync2;
+  sync2.SetStatus(false, true);
+  observer.ObserveServiceForSyncDisables(&sync2);
+  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, OneAddRemove) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync;
+  observer.ObserveServiceForSyncDisables(&sync);
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+  sync.SetStatus(false, true);
+  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_TRUE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+  sync.Shutdown();
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_TRUE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+TEST_F(SyncDisableObserverTest, PurgeOnDisable) {
+  TestSyncDisableObserver observer;
+  MockSyncService sync;
+  sync.SetStatus(false, true);
+  observer.ObserveServiceForSyncDisables(&sync);
+  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_TRUE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+  sync.SetStatus(false, false);
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_TRUE(observer.ResetNotified());
+  EXPECT_TRUE(observer.ResetPurged());
+  sync.Shutdown();
+  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles());
+  EXPECT_FALSE(observer.ResetNotified());
+  EXPECT_FALSE(observer.ResetPurged());
+}
+
+}  // namespace ukm
diff --git a/components/ukm/test_ukm_service.cc b/components/ukm/test_ukm_service.cc
index 5b72405..d2f4c125 100644
--- a/components/ukm/test_ukm_service.cc
+++ b/components/ukm/test_ukm_service.cc
@@ -18,6 +18,7 @@
 
 TestUkmService::TestUkmService(PrefService* prefs_service)
     : UkmService(prefs_service, &test_metrics_service_client_) {
+  EnableRecording();
   DisableReporting();
 }
 
diff --git a/components/ukm/ukm_service.cc b/components/ukm/ukm_service.cc
index b7cdcab..4e0a66a8 100644
--- a/components/ukm/ukm_service.cc
+++ b/components/ukm/ukm_service.cc
@@ -69,17 +69,35 @@
   return kDefaultServerUrl;
 }
 
+// Generates a new client id and stores it in prefs.
+uint64_t GenerateClientId(PrefService* pref_service) {
+  uint64_t client_id = 0;
+  while (!client_id)
+    client_id = base::RandUint64();
+  pref_service->SetInt64(prefs::kUkmClientId, client_id);
+  return client_id;
+}
+
 uint64_t LoadOrGenerateClientId(PrefService* pref_service) {
   uint64_t client_id = pref_service->GetInt64(prefs::kUkmClientId);
-  if (!client_id) {
-    // Generate and store a new client id.
-    while (!client_id)
-      client_id = base::RandUint64();
-    pref_service->SetInt64(prefs::kUkmClientId, client_id);
-  }
+  if (!client_id)
+    client_id = GenerateClientId(pref_service);
   return client_id;
 }
 
+enum class DroppedSourceReason {
+  NOT_DROPPED = 0,
+  RECORDING_DISABLED = 1,
+  MAX_SOURCES_HIT = 2,
+  NUM_DROPPED_SOURCES_REASONS
+};
+
+void RecordDroppedSource(DroppedSourceReason reason) {
+  UMA_HISTOGRAM_ENUMERATION(
+      "UKM.Sources.Dropped", static_cast<int>(reason),
+      static_cast<int>(DroppedSourceReason::NUM_DROPPED_SOURCES_REASONS));
+}
+
 }  // namespace
 
 const base::Feature kUkmFeature = {"Ukm", base::FEATURE_DISABLED_BY_DEFAULT};
@@ -87,6 +105,7 @@
 UkmService::UkmService(PrefService* pref_service,
                        metrics::MetricsServiceClient* client)
     : pref_service_(pref_service),
+      recording_enabled_(false),
       client_(client),
       persisted_logs_(std::unique_ptr<ukm::PersistedLogsMetricsImpl>(
                           new ukm::PersistedLogsMetricsImpl()),
@@ -134,6 +153,14 @@
       base::TimeDelta::FromSeconds(kInitializationDelaySeconds));
 }
 
+void UkmService::EnableRecording() {
+  recording_enabled_ = true;
+}
+
+void UkmService::DisableRecording() {
+  recording_enabled_ = false;
+}
+
 void UkmService::EnableReporting() {
   DCHECK(thread_checker_.CalledOnValidThread());
   DVLOG(1) << "UkmService::EnableReporting";
@@ -169,6 +196,10 @@
   sources_.clear();
 }
 
+void UkmService::ResetClientId() {
+  client_id_ = GenerateClientId(pref_service_);
+}
+
 void UkmService::RegisterMetricsProvider(
     std::unique_ptr<metrics::MetricsProvider> provider) {
   metrics_providers_.push_back(std::move(provider));
@@ -208,6 +239,10 @@
 void UkmService::BuildAndStoreLog() {
   DCHECK(thread_checker_.CalledOnValidThread());
   DVLOG(1) << "UkmService::BuildAndStoreLog";
+  // Suppress generating a log if we have no new data to include.
+  if (sources_.empty())
+    return;
+
   Report report;
   report.set_client_id(client_id_);
 
@@ -233,6 +268,11 @@
 void UkmService::StartScheduledUpload() {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!log_upload_in_progress_);
+  if (persisted_logs_.empty()) {
+    // No logs to send, so early out and schedule the next rotation.
+    scheduler_->UploadFinished(true, /* has_unsent_logs */ false);
+    return;
+  }
   if (!persisted_logs_.has_staged_log())
     persisted_logs_.StageLog();
   // TODO(holte): Handle data usage on cellular, etc.
@@ -282,8 +322,12 @@
 }
 
 void UkmService::RecordSource(std::unique_ptr<UkmSource> source) {
+  if (!recording_enabled_) {
+    RecordDroppedSource(DroppedSourceReason::RECORDING_DISABLED);
+    return;
+  }
   if (sources_.size() >= kMaxSources) {
-    UMA_HISTOGRAM_BOOLEAN("UKM.Sources.MaxSourcesHit", true);
+    RecordDroppedSource(DroppedSourceReason::MAX_SOURCES_HIT);
     return;
   }
 
diff --git a/components/ukm/ukm_service.h b/components/ukm/ukm_service.h
index 181ad08..249871f 100644
--- a/components/ukm/ukm_service.h
+++ b/components/ukm/ukm_service.h
@@ -47,6 +47,10 @@
   // Initializes the UKM service.
   void Initialize();
 
+  // Enables/disables recording control if data is allowed to be collected.
+  void EnableRecording();
+  void DisableRecording();
+
   // Enables/disables transmission of accumulated logs. Logs that have already
   // been created will remain persisted to disk.
   void EnableReporting();
@@ -62,6 +66,9 @@
   // Deletes any unsent local data.
   void Purge();
 
+  // Resets the client id stored in prefs.
+  void ResetClientId();
+
   // Registers the specified |provider| to provide additional metrics into the
   // UKM log. Should be called during MetricsService initialization only.
   void RegisterMetricsProvider(
@@ -100,6 +107,9 @@
   // A weak pointer to the PrefService used to read and write preferences.
   PrefService* pref_service_;
 
+  // Whether recording new data is currently allowed.
+  bool recording_enabled_;
+
   // The UKM client id stored in prefs.
   uint64_t client_id_;
 
diff --git a/components/ukm/ukm_service_unittest.cc b/components/ukm/ukm_service_unittest.cc
index cc694e1..f6b91c0 100644
--- a/components/ukm/ukm_service_unittest.cc
+++ b/components/ukm/ukm_service_unittest.cc
@@ -41,6 +41,7 @@
   }
 
   Report GetPersistedReport() {
+    EXPECT_GE(GetPersistedLogCount(), 1);
     metrics::PersistedLogs result_persisted_logs(
         base::MakeUnique<ukm::PersistedLogsMetricsImpl>(), &prefs_,
         prefs::kUkmPersistedLogs,
@@ -60,6 +61,14 @@
     return report;
   }
 
+  std::unique_ptr<UkmSource> MakeSource(std::string url, int paint_msec) {
+    auto source = base::MakeUnique<UkmSource>();
+    source->set_committed_url(GURL(url));
+    source->set_first_contentful_paint(
+        base::TimeDelta::FromMilliseconds(paint_msec));
+    return source;
+  }
+
  protected:
   TestingPrefServiceSimple prefs_;
   metrics::TestMetricsServiceClient client_;
@@ -80,6 +89,7 @@
   EXPECT_TRUE(task_runner_->HasPendingTask());
   // Allow initialization to complete.
   task_runner_->RunUntilIdle();
+  service.EnableRecording();
   service.EnableReporting();
   EXPECT_TRUE(task_runner_->HasPendingTask());
   service.DisableReporting();
@@ -92,11 +102,14 @@
   EXPECT_EQ(GetPersistedLogCount(), 0);
   service.Initialize();
   task_runner_->RunUntilIdle();
+  service.EnableRecording();
   service.EnableReporting();
+  service.RecordSource(MakeSource("https://google.com", 300));
   // Should init, generate a log, and start an upload.
   task_runner_->RunPendingTasks();
   EXPECT_TRUE(client_.uploader()->is_uploading());
   // Flushes the generated log to disk and generates a new one.
+  service.RecordSource(MakeSource("https://google.com", 300));
   service.Flush();
   EXPECT_EQ(GetPersistedLogCount(), 2);
   service.Purge();
@@ -108,13 +121,10 @@
   EXPECT_EQ(GetPersistedLogCount(), 0);
   service.Initialize();
   task_runner_->RunUntilIdle();
+  service.EnableRecording();
   service.EnableReporting();
 
-  std::unique_ptr<UkmSource> source = base::WrapUnique(new UkmSource());
-  source->set_committed_url(GURL("https://google.com"));
-  source->set_first_contentful_paint(base::TimeDelta::FromMilliseconds(300));
-
-  service.RecordSource(std::move(source));
+  service.RecordSource(MakeSource("https://google.com", 300));
 
   service.Flush();
   EXPECT_EQ(GetPersistedLogCount(), 1);
@@ -140,9 +150,10 @@
   EXPECT_FALSE(provider->provide_system_profile_metrics_called());
 
   task_runner_->RunUntilIdle();
+  service.EnableRecording();
   service.EnableReporting();
 
-  service.RecordSource(base::WrapUnique(new UkmSource()));
+  service.RecordSource(MakeSource("https://google.com", 300));
   service.Flush();
   EXPECT_EQ(GetPersistedLogCount(), 1);
 
@@ -153,4 +164,28 @@
   EXPECT_TRUE(provider->provide_system_profile_metrics_called());
 }
 
+TEST_F(UkmServiceTest, LogsUploadedWithSourcesOnly) {
+  UkmService service(&prefs_, &client_);
+  EXPECT_EQ(GetPersistedLogCount(), 0);
+  service.Initialize();
+  task_runner_->RunUntilIdle();
+  service.EnableRecording();
+  service.EnableReporting();
+
+  EXPECT_TRUE(task_runner_->HasPendingTask());
+  // Neither rotation or Flush should generate logs
+  task_runner_->RunPendingTasks();
+  service.Flush();
+  EXPECT_EQ(GetPersistedLogCount(), 0);
+
+  service.RecordSource(MakeSource("https://google.com", 300));
+  // Includes a Source, so will persist.
+  service.Flush();
+  EXPECT_EQ(GetPersistedLogCount(), 1);
+
+  // Current log has no Sources.
+  service.Flush();
+  EXPECT_EQ(GetPersistedLogCount(), 1);
+}
+
 }  // namespace ukm
diff --git a/components/variations/proto/study.proto b/components/variations/proto/study.proto
index 2b2f6116..c627622 100644
--- a/components/variations/proto/study.proto
+++ b/components/variations/proto/study.proto
@@ -195,12 +195,13 @@
     DESKTOP = 0;
     PHONE   = 1;
     TABLET  = 2;
+    KIOSK   = 3;
   }
 
   // Filtering criteria specifying whether this study is applicable to a given
   // Chrome instance.
   //
-  // Next tag: 14
+  // Next tag: 15
   message Filter {
     // The start date of the study in Unix time format. (Seconds since midnight
     // January 1, 1970 UTC). See: http://en.wikipedia.org/wiki/Unix_time
@@ -253,10 +254,17 @@
     repeated string exclude_locale = 12;
 
     // List of form factors that will receive this study. If omitted, the study
-    // applies to all form factors.
+    // applies to all form factors, unless |exclude_form_factor| is specified.
+    // Mutually exclusive with |exclude_form_factor|.
     // Ex: [PHONE, TABLET]
     repeated FormFactor form_factor = 7;
 
+    // List of form factors that will be excluded from this study. If omitted,
+    // the study applies to all form factors unless |form_factor| is specified.
+    // Mutually exclusive with |form_factor|.
+    // Takes the same range of values as form_factor, e.g. [PHONE, TABLET].
+    repeated FormFactor exclude_form_factor = 14;
+
     // List of ChromeOS hardware classes that will receive this study. Each
     // entry is treated as a substring of the actual device hardware_class,
     // so "FOO" will match the client's hardware class "Device FOOBAR". If
diff --git a/components/variations/study_filtering.cc b/components/variations/study_filtering.cc
index 5109251..0712c206 100644
--- a/components/variations/study_filtering.cc
+++ b/components/variations/study_filtering.cc
@@ -59,15 +59,19 @@
 
 bool CheckStudyFormFactor(const Study_Filter& filter,
                           Study_FormFactor form_factor) {
-  // An empty form factor list matches all form factors.
-  if (filter.form_factor_size() == 0)
+  // Empty whitelist and blacklist signifies matching any form factor.
+  if (filter.form_factor_size() == 0 && filter.exclude_form_factor_size() == 0)
     return true;
 
-  for (int i = 0; i < filter.form_factor_size(); ++i) {
-    if (filter.form_factor(i) == form_factor)
-      return true;
-  }
-  return false;
+  // Allow the form_factor if it matches the whitelist.
+  // Note if both a whitelist and blacklist are specified, the blacklist is
+  // ignored. We do not expect both to be present for Chrome due to server-side
+  // checks.
+  if (filter.form_factor_size() > 0)
+    return base::ContainsValue(filter.form_factor(), form_factor);
+
+  // Omit if we match the blacklist.
+  return !base::ContainsValue(filter.exclude_form_factor(), form_factor);
 }
 
 bool CheckStudyHardwareClass(const Study_Filter& filter,
diff --git a/components/variations/study_filtering_unittest.cc b/components/variations/study_filtering_unittest.cc
index 98490f0..14f4f08 100644
--- a/components/variations/study_filtering_unittest.cc
+++ b/components/variations/study_filtering_unittest.cc
@@ -84,6 +84,7 @@
     Study_FormFactor_DESKTOP,
     Study_FormFactor_PHONE,
     Study_FormFactor_TABLET,
+    Study_FormFactor_KIOSK,
   };
 
   ASSERT_EQ(Study_FormFactor_FormFactor_ARRAYSIZE,
@@ -98,7 +99,8 @@
                             filter.form_factor_size() == 0;
       const bool result = internal::CheckStudyFormFactor(filter,
                                                          form_factors[j]);
-      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
+      EXPECT_EQ(expected, result) << "form_factor: case " << i << "," << j
+                                  << " failed!";
     }
 
     if (i < arraysize(form_factors)) {
@@ -116,7 +118,8 @@
                             filter.form_factor_size() == 0;
       const bool result = internal::CheckStudyFormFactor(filter,
                                                          form_factors[j]);
-      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
+      EXPECT_EQ(expected, result) << "form_factor: case " << i << "," << j
+                                  << " failed!";
     }
 
     if (i < arraysize(form_factors)) {
@@ -125,6 +128,45 @@
       form_factor_added[index] = true;
     }
   }
+
+  // Test exclude_form_factors, forward order.
+  filter.clear_form_factor();
+  bool form_factor_excluded[arraysize(form_factors)] = { 0 };
+  for (size_t i = 0; i <= arraysize(form_factors); ++i) {
+    for (size_t j = 0; j < arraysize(form_factors); ++j) {
+      const bool expected = filter.exclude_form_factor_size() == 0 ||
+                            !form_factor_excluded[j];
+      const bool result = internal::CheckStudyFormFactor(filter,
+                                                         form_factors[j]);
+      EXPECT_EQ(expected, result) << "exclude_form_factor: case " << i << ","
+                                  << j << " failed!";
+    }
+
+    if (i < arraysize(form_factors)) {
+      filter.add_exclude_form_factor(form_factors[i]);
+      form_factor_excluded[i] = true;
+    }
+  }
+
+  // Test exclude_form_factors, reverse order.
+  filter.clear_exclude_form_factor();
+  memset(&form_factor_excluded, 0, sizeof(form_factor_excluded));
+  for (size_t i = 0; i <= arraysize(form_factors); ++i) {
+    for (size_t j = 0; j < arraysize(form_factors); ++j) {
+      const bool expected = filter.exclude_form_factor_size() == 0 ||
+                            !form_factor_excluded[j];
+      const bool result = internal::CheckStudyFormFactor(filter,
+                                                         form_factors[j]);
+      EXPECT_EQ(expected, result) << "exclude_form_factor: case " << i << ","
+                                  << j << " failed!";
+    }
+
+    if (i < arraysize(form_factors)) {
+      const int index = arraysize(form_factors) - i - 1;
+      filter.add_exclude_form_factor(form_factors[index]);
+      form_factor_excluded[index] = true;
+    }
+  }
 }
 
 TEST(VariationsStudyFilteringTest, CheckStudyLocale) {
diff --git a/content/app/android/child_process_service_impl.cc b/content/app/android/child_process_service_impl.cc
index 6651317..ef6f171b 100644
--- a/content/app/android/child_process_service_impl.cc
+++ b/content/app/android/child_process_service_impl.cc
@@ -19,11 +19,11 @@
 #include "content/child/child_thread_impl.h"
 #include "content/public/common/content_descriptors.h"
 #include "gpu/ipc/common/android/scoped_surface_request_conduit.h"
-#include "gpu/ipc/common/android/surface_texture_peer.h"
 #include "gpu/ipc/common/gpu_surface_lookup.h"
 #include "ipc/ipc_descriptors.h"
 #include "jni/ChildProcessServiceImpl_jni.h"
 #include "ui/gl/android/scoped_java_surface.h"
+#include "ui/gl/android/surface_texture.h"
 
 using base::android::AttachCurrentThread;
 using base::android::CheckException;
@@ -36,8 +36,7 @@
 
 // TODO(sievers): Use two different implementations of this depending on if
 // we're in a renderer or gpu process.
-class ChildProcessSurfaceManager : public gpu::SurfaceTexturePeer,
-                                   public gpu::ScopedSurfaceRequestConduit,
+class ChildProcessSurfaceManager : public gpu::ScopedSurfaceRequestConduit,
                                    public gpu::GpuSurfaceLookup {
  public:
   ChildProcessSurfaceManager() {}
@@ -49,18 +48,6 @@
     service_impl_.Reset(service_impl);
   }
 
-  // Overridden from SurfaceTexturePeer:
-  void EstablishSurfaceTexturePeer(
-      base::ProcessHandle pid,
-      scoped_refptr<gl::SurfaceTexture> surface_texture,
-      int primary_id,
-      int secondary_id) override {
-    JNIEnv* env = base::android::AttachCurrentThread();
-    content::Java_ChildProcessServiceImpl_establishSurfaceTexturePeer(
-        env, service_impl_, pid, surface_texture->j_surface_texture(),
-        primary_id, secondary_id);
-  }
-
   // Overriden from ScopedSurfaceRequestConduit:
   void ForwardSurfaceTextureForSurfaceRequest(
       const base::UnguessableToken& request_token,
@@ -124,8 +111,6 @@
 
   g_child_process_surface_manager.Get().SetServiceImpl(service_impl);
 
-  gpu::SurfaceTexturePeer::InitInstance(
-      g_child_process_surface_manager.Pointer());
   gpu::GpuSurfaceLookup::InitInstance(
       g_child_process_surface_manager.Pointer());
   gpu::ScopedSurfaceRequestConduit::SetInstance(
diff --git a/content/browser/accessibility/accessibility_ui.cc b/content/browser/accessibility/accessibility_ui.cc
index 671a09a..3d618513 100644
--- a/content/browser/accessibility/accessibility_ui.cc
+++ b/content/browser/accessibility/accessibility_ui.cc
@@ -325,6 +325,10 @@
   std::unique_ptr<base::DictionaryValue> result(BuildTargetDescriptor(rvh));
   auto* web_contents =
       static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost(rvh));
+  // No matter the state of the current web_contents, we want to force the mode
+  // because we are about to show the accessibility tree
+  web_contents->SetAccessibilityMode(ACCESSIBILITY_MODE_FLAG_NATIVE_APIS |
+                                     ACCESSIBILITY_MODE_FLAG_WEB_CONTENTS);
   std::unique_ptr<AccessibilityTreeFormatter> formatter;
   if (g_show_internal_accessibility_tree)
     formatter.reset(new AccessibilityTreeFormatterBlink());
diff --git a/content/browser/android/child_process_launcher_android.cc b/content/browser/android/child_process_launcher_android.cc
index ceb9a28b..bd16a7c 100644
--- a/content/browser/android/child_process_launcher_android.cc
+++ b/content/browser/android/child_process_launcher_android.cc
@@ -37,60 +37,6 @@
 
 namespace content {
 
-namespace {
-
-// Pass a java surface object to the MediaPlayerAndroid object
-// identified by render process handle, render frame ID and player ID.
-static void SetSurfacePeer(
-    const base::android::JavaRef<jobject>& surface,
-    base::ProcessHandle render_process_handle,
-    int render_frame_id,
-    int player_id) {
-  int render_process_id = 0;
-  RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
-  while (!it.IsAtEnd()) {
-    if (it.GetCurrentValue()->GetHandle() == render_process_handle) {
-      render_process_id = it.GetCurrentValue()->GetID();
-      break;
-    }
-    it.Advance();
-  }
-  if (!render_process_id) {
-    DVLOG(1) << "Cannot find render process for render_process_handle "
-             << render_process_handle;
-    return;
-  }
-
-  RenderFrameHostImpl* frame =
-      RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
-  if (!frame) {
-    DVLOG(1) << "Cannot find frame for render_frame_id " << render_frame_id;
-    return;
-  }
-
-  BrowserMediaPlayerManager* player_manager =
-      MediaWebContentsObserverAndroid::FromWebContents(
-          WebContents::FromRenderFrameHost(frame))
-          ->GetMediaPlayerManager(frame);
-  if (!player_manager) {
-    DVLOG(1) << "Cannot find the media player manager for frame " << frame;
-    return;
-  }
-
-  media::MediaPlayerAndroid* player = player_manager->GetPlayer(player_id);
-  if (!player) {
-    DVLOG(1) << "Cannot find media player for player_id " << player_id;
-    return;
-  }
-
-  if (player != player_manager->GetFullscreenPlayer()) {
-    gl::ScopedJavaSurface scoped_surface(surface);
-    player->SetVideoSurface(std::move(scoped_surface));
-  }
-}
-
-}  // anonymous namespace
-
 // Called from ChildProcessLauncher.java when the ChildProcess was
 // started.
 // |client_context| is the pointer to StartChildProcessCallback which was
@@ -173,22 +119,6 @@
       static_cast<jint>(handle), static_cast<jboolean>(in_foreground));
 }
 
-void EstablishSurfacePeer(JNIEnv* env,
-                          const JavaParamRef<jclass>& clazz,
-                          jint pid,
-                          const JavaParamRef<jobject>& surface,
-                          jint primary_id,
-                          jint secondary_id) {
-  ScopedJavaGlobalRef<jobject> jsurface;
-  jsurface.Reset(env, surface);
-  if (jsurface.is_null())
-    return;
-
-  DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
-  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
-      &SetSurfacePeer, jsurface, pid, primary_id, secondary_id));
-}
-
 void CompleteScopedSurfaceRequest(JNIEnv* env,
                                   const JavaParamRef<jclass>& clazz,
                                   const JavaParamRef<jobject>& token,
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index 6da88a2..8e51064b 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -161,7 +161,7 @@
     const std::string& service_name)
     : data_(process_type),
       delegate_(delegate),
-      child_token_(mojo::edk::GenerateRandomToken()),
+      pending_connection_(new mojo::edk::PendingProcessConnection),
       channel_(nullptr),
       is_channel_connected_(false),
       notify_child_disconnected_(false),
@@ -179,10 +179,11 @@
 
   if (!service_name.empty()) {
     DCHECK_CURRENTLY_ON(BrowserThread::IO);
-    child_connection_.reset(new ChildConnection(
-        service_name, base::StringPrintf("%d", data_.id), child_token_,
-        ServiceManagerContext::GetConnectorForIOThread(),
-        base::ThreadTaskRunnerHandle::Get()));
+    child_connection_.reset(
+        new ChildConnection(service_name, base::StringPrintf("%d", data_.id),
+                            pending_connection_.get(),
+                            ServiceManagerContext::GetConnectorForIOThread(),
+                            base::ThreadTaskRunnerHandle::Get()));
   }
 
   // May be null during test execution.
@@ -256,7 +257,8 @@
 
   notify_child_disconnected_ = true;
   child_process_.reset(new ChildProcessLauncher(
-      std::move(delegate), std::move(cmd_line), data_.id, this, child_token_,
+      std::move(delegate), std::move(cmd_line), data_.id, this,
+      std::move(pending_connection_),
       base::Bind(&BrowserChildProcessHostImpl::OnMojoError,
                  weak_factory_.GetWeakPtr(),
                  base::ThreadTaskRunnerHandle::Get()),
diff --git a/content/browser/browser_child_process_host_impl.h b/content/browser/browser_child_process_host_impl.h
index 0b2906f..3c78e6a 100644
--- a/content/browser/browser_child_process_host_impl.h
+++ b/content/browser/browser_child_process_host_impl.h
@@ -22,6 +22,7 @@
 #include "content/public/browser/browser_child_process_host.h"
 #include "content/public/browser/child_process_data.h"
 #include "content/public/common/child_process_host_delegate.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 
 #if defined(OS_WIN)
 #include "base/win/object_watcher.h"
@@ -156,7 +157,7 @@
   BrowserChildProcessHostDelegate* delegate_;
   std::unique_ptr<ChildProcessHost> child_process_host_;
 
-  const std::string child_token_;
+  std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection_;
   std::unique_ptr<ChildConnection> child_connection_;
 
   std::unique_ptr<ChildProcessLauncher> child_process_;
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index bfab0fb..cfaddafe 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -786,7 +786,6 @@
       gpu::ScopedSurfaceRequestConduit::SetInstance(
           ScopedSurfaceRequestManager::GetInstance());
     }
-    BrowserMediaPlayerManager::InitSurfaceTexturePeer();
   }
 
   if (!parsed_command_line_.HasSwitch(
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc
index 6970d24..3700f47e 100644
--- a/content/browser/child_process_launcher.cc
+++ b/content/browser/child_process_launcher.cc
@@ -23,13 +23,14 @@
     std::unique_ptr<base::CommandLine> command_line,
     int child_process_id,
     Client* client,
-    const std::string& mojo_child_token,
+    std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection,
     const mojo::edk::ProcessErrorCallback& process_error_callback,
     bool terminate_on_shutdown)
     : client_(client),
       termination_status_(base::TERMINATION_STATUS_NORMAL_TERMINATION),
       exit_code_(RESULT_CODE_NORMAL_EXIT),
       starting_(true),
+      pending_connection_(std::move(pending_connection)),
       process_error_callback_(process_error_callback),
 #if defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER) ||  \
     defined(MEMORY_SANITIZER) || defined(THREAD_SANITIZER) || \
@@ -38,7 +39,6 @@
 #else
       terminate_child_on_shutdown_(terminate_on_shutdown),
 #endif
-      mojo_child_token_(mojo_child_token),
       weak_factory_(this) {
   DCHECK(CalledOnValidThread());
   CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_));
@@ -78,16 +78,21 @@
   starting_ = false;
   process_ = std::move(process);
 
+  // Take ownership of the pending connection here so it's destroyed when
+  // we go out of scope regardless of the outcome below.
+  std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection =
+      std::move(pending_connection_);
   if (process_.process.IsValid()) {
     // Set up Mojo IPC to the new process.
-    mojo::edk::ChildProcessLaunched(process_.process.Handle(),
-                                    std::move(server_handle),
-                                    mojo_child_token_,
-                                    process_error_callback_);
+    DCHECK(pending_connection);
+    pending_connection->Connect(process_.process.Handle(),
+                                std::move(server_handle),
+                                process_error_callback_);
     client_->OnProcessLaunched();
   } else {
-    mojo::edk::ChildProcessLaunchFailed(mojo_child_token_);
     termination_status_ = base::TERMINATION_STATUS_LAUNCH_FAILED;
+
+    // NOTE: May delete |this|.
     client_->OnProcessLaunchFailed(error_code);
   }
 }
diff --git a/content/browser/child_process_launcher.h b/content/browser/child_process_launcher.h
index 6a17aa02..0ff1baa 100644
--- a/content/browser/child_process_launcher.h
+++ b/content/browser/child_process_launcher.h
@@ -19,7 +19,7 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/result_codes.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
 
 namespace base {
@@ -80,7 +80,7 @@
       std::unique_ptr<base::CommandLine> cmd_line,
       int child_process_id,
       Client* client,
-      const std::string& mojo_child_token,
+      std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection,
       const mojo::edk::ProcessErrorCallback& process_error_callback,
       bool terminate_on_shutdown = true);
   ~ChildProcessLauncher();
@@ -146,14 +146,13 @@
   base::TerminationStatus termination_status_;
   int exit_code_;
   bool starting_;
+  std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection_;
   const mojo::edk::ProcessErrorCallback process_error_callback_;
 
   // Controls whether the child process should be terminated on browser
   // shutdown. Default behavior is to terminate the child.
   const bool terminate_child_on_shutdown_;
 
-  const std::string mojo_child_token_;
-
   scoped_refptr<internal::ChildProcessLauncherHelper> helper_;
 
   base::WeakPtrFactory<ChildProcessLauncher> weak_factory_;
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
index 26591467..fd58bcb 100644
--- a/content/browser/frame_host/frame_tree_node.cc
+++ b/content/browser/frame_host/frame_tree_node.cc
@@ -286,7 +286,7 @@
   replication_state_.feature_policy_header = parsed_header;
 }
 
-void FrameTreeNode::ResetFeaturePolicy() {
+void FrameTreeNode::ResetFeaturePolicyHeader() {
   replication_state_.feature_policy_header.clear();
 }
 
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h
index 503911b..7a4a0b9e2 100644
--- a/content/browser/frame_host/frame_tree_node.h
+++ b/content/browser/frame_host/frame_tree_node.h
@@ -161,12 +161,11 @@
   // Set the current name and notify proxies about the update.
   void SetFrameName(const std::string& name, const std::string& unique_name);
 
-  // Set the frame's feature policy from an HTTP header, clearing any existing
-  // policy.
+  // Set the frame's feature policy header, clearing any existing header.
   void SetFeaturePolicyHeader(const ParsedFeaturePolicyHeader& parsed_header);
 
-  // Clear any feature policy associated with the frame.
-  void ResetFeaturePolicy();
+  // Clear any feature policy header associated with the frame.
+  void ResetFeaturePolicyHeader();
 
   // Add CSP header to replication state and notify proxies about the update.
   void AddContentSecurityPolicy(const ContentSecurityPolicyHeader& header);
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index 99780593..94204144 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -618,7 +618,7 @@
   // <meta> elements - we need to reset CSP and Feature Policy.
   if (!is_navigation_within_page) {
     render_frame_host->frame_tree_node()->ResetContentSecurityPolicy();
-    render_frame_host->frame_tree_node()->ResetFeaturePolicy();
+    render_frame_host->frame_tree_node()->ResetFeaturePolicyHeader();
   }
 
   // When using --site-per-process, we notify the RFHM for all navigations,
@@ -688,6 +688,10 @@
   if (!params.url_is_unreachable)
     render_frame_host->set_last_successful_url(params.url);
 
+  // After setting the last committed origin, reset the feature policy in the
+  // RenderFrameHost to a blank policy based on the parent frame.
+  render_frame_host->ResetFeaturePolicy();
+
   // Send notification about committed provisional loads. This notification is
   // different from the NAV_ENTRY_COMMITTED notification which doesn't include
   // the actual URL navigated to and isn't sent for AUTO_SUBFRAME navigations.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 6c04e23..8e6dff68 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1850,6 +1850,8 @@
 void RenderFrameHostImpl::OnDidSetFeaturePolicyHeader(
     const ParsedFeaturePolicyHeader& parsed_header) {
   frame_tree_node()->SetFeaturePolicyHeader(parsed_header);
+  ResetFeaturePolicy();
+  feature_policy_->SetHeaderPolicy(parsed_header);
 }
 
 void RenderFrameHostImpl::OnDidAddContentSecurityPolicy(
@@ -3391,6 +3393,14 @@
   web_bluetooth_services_.erase(it);
 }
 
+void RenderFrameHostImpl::ResetFeaturePolicy() {
+  RenderFrameHostImpl* parent_frame_host = GetParent();
+  const FeaturePolicy* parent_policy =
+      parent_frame_host ? parent_frame_host->get_feature_policy() : nullptr;
+  feature_policy_ = FeaturePolicy::CreateFromParentPolicy(
+      parent_policy, last_committed_origin_);
+}
+
 void RenderFrameHostImpl::Create(
     const service_manager::Identity& remote_identity,
     media::mojom::InterfaceFactoryRequest request) {
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 80b1c538..162ed20 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -81,6 +81,7 @@
 class AppWebMessagePortMessageFilter;
 class AssociatedInterfaceProviderImpl;
 class CrossProcessFrameConnector;
+class FeaturePolicy;
 class FrameTree;
 class FrameTreeNode;
 class MediaInterfaceProxy;
@@ -595,6 +596,13 @@
   // in a non-loading state.
   void ResetLoadingState();
 
+  // Returns the feature policy which should be enforced on this RenderFrame.
+  FeaturePolicy* get_feature_policy() { return feature_policy_.get(); }
+
+  // Clears any existing policy and constructs a new policy for this frame,
+  // based on its parent frame.
+  void ResetFeaturePolicy();
+
   // Tells the renderer that this RenderFrame will soon be swapped out, and thus
   // not to create any new modal dialogs until it happens.  This must be done
   // separately so that the ScopedPageLoadDeferrers of any current dialogs are
@@ -1155,6 +1163,9 @@
   // See BindingsPolicy for details.
   int enabled_bindings_ = 0;
 
+  // Tracks the feature policy which has been set on this frame.
+  std::unique_ptr<FeaturePolicy> feature_policy_;
+
   // NOTE: This must be the last member.
   base::WeakPtrFactory<RenderFrameHostImpl> weak_ptr_factory_;
 
diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc
index 906f9d8..d73137b1 100644
--- a/content/browser/media/android/browser_media_player_manager.cc
+++ b/content/browser/media/android/browser_media_player_manager.cc
@@ -26,7 +26,6 @@
 #include "content/public/browser/web_contents_delegate.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_switches.h"
-#include "gpu/ipc/common/android/surface_texture_peer.h"
 #include "media/base/android/media_player_bridge.h"
 #include "media/base/android/media_url_interceptor.h"
 #include "media/base/media_content_type.h"
@@ -42,57 +41,6 @@
 
 namespace content {
 
-namespace {
-
-class BrowserSurfaceTexturePeer : public gpu::SurfaceTexturePeer {
- public:
-  static BrowserSurfaceTexturePeer* GetInstance();
-
- private:
-  friend struct base::DefaultSingletonTraits<BrowserSurfaceTexturePeer>;
-
-  BrowserSurfaceTexturePeer();
-  ~BrowserSurfaceTexturePeer() override;
-
-  void EstablishSurfaceTexturePeer(
-      base::ProcessHandle render_process_handle,
-      scoped_refptr<gl::SurfaceTexture> surface_texture,
-      int render_frame_id,
-      int player_id) override;
-
-  DISALLOW_COPY_AND_ASSIGN(BrowserSurfaceTexturePeer);
-};
-
-// static
-BrowserSurfaceTexturePeer* BrowserSurfaceTexturePeer::GetInstance() {
-  return base::Singleton<
-      BrowserSurfaceTexturePeer,
-      base::LeakySingletonTraits<BrowserSurfaceTexturePeer>>::get();
-}
-
-BrowserSurfaceTexturePeer::BrowserSurfaceTexturePeer() {
-  gpu::SurfaceTexturePeer::InitInstance(this);
-}
-
-BrowserSurfaceTexturePeer::~BrowserSurfaceTexturePeer() {
-  gpu::SurfaceTexturePeer::InitInstance(nullptr);
-}
-
-void BrowserSurfaceTexturePeer::EstablishSurfaceTexturePeer(
-    base::ProcessHandle render_process_handle,
-    scoped_refptr<gl::SurfaceTexture> surface_texture,
-    int render_frame_id,
-    int player_id) {
-  if (!surface_texture.get())
-    return;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
-      base::Bind(&BrowserMediaPlayerManager::SetSurfacePeer, surface_texture,
-                 render_process_handle, render_frame_id, player_id));
-}
-
-}  // namespace
-
 // Threshold on the number of media players per renderer before we start
 // attempting to release inactive media players.
 const int kMediaPlayerThreshold = 1;
@@ -118,61 +66,6 @@
 }
 
 // static
-void BrowserMediaPlayerManager::InitSurfaceTexturePeer() {
-  BrowserSurfaceTexturePeer::GetInstance();
-}
-
-// static
-void BrowserMediaPlayerManager::SetSurfacePeer(
-    scoped_refptr<gl::SurfaceTexture> surface_texture,
-    base::ProcessHandle render_process_handle,
-    int render_frame_id,
-    int player_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  int render_process_id = 0;
-  RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
-  while (!it.IsAtEnd()) {
-    if (it.GetCurrentValue()->GetHandle() == render_process_handle) {
-      render_process_id = it.GetCurrentValue()->GetID();
-      break;
-    }
-    it.Advance();
-  }
-  if (!render_process_id) {
-    DVLOG(1) << "Cannot find render process for render_process_handle "
-             << render_process_handle;
-    return;
-  }
-
-  RenderFrameHostImpl* frame =
-      RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
-  if (!frame) {
-    DVLOG(1) << "Cannot find frame for render_frame_id " << render_frame_id;
-    return;
-  }
-
-  BrowserMediaPlayerManager* player_manager =
-      MediaWebContentsObserverAndroid::FromWebContents(
-          WebContents::FromRenderFrameHost(frame))
-          ->GetMediaPlayerManager(frame);
-  if (!player_manager) {
-    DVLOG(1) << "Cannot find the media player manager for frame " << frame;
-    return;
-  }
-
-  media::MediaPlayerAndroid* player = player_manager->GetPlayer(player_id);
-  if (!player) {
-    DVLOG(1) << "Cannot find media player for player_id " << player_id;
-    return;
-  }
-
-  if (player != player_manager->GetFullscreenPlayer()) {
-    gl::ScopedJavaSurface scoped_surface(surface_texture.get());
-    player->SetVideoSurface(std::move(scoped_surface));
-  }
-}
-
-// static
 BrowserMediaPlayerManager* BrowserMediaPlayerManager::Create(
     RenderFrameHost* rfh) {
   if (g_factory)
diff --git a/content/browser/media/android/browser_media_player_manager.h b/content/browser/media/android/browser_media_player_manager.h
index 6d50830c..fe626c1 100644
--- a/content/browser/media/android/browser_media_player_manager.h
+++ b/content/browser/media/android/browser_media_player_manager.h
@@ -48,16 +48,6 @@
   static void RegisterMediaUrlInterceptor(
       media::MediaUrlInterceptor* media_url_interceptor);
 
-  // Init the SurfaceTexturePeer.
-  static void InitSurfaceTexturePeer();
-
-  // Pass a java surface object to the MediaPlayerAndroid object
-  // identified by render process handle, render frame ID and player ID.
-  static void SetSurfacePeer(scoped_refptr<gl::SurfaceTexture> surface_texture,
-                             base::ProcessHandle render_process_handle,
-                             int render_frame_id,
-                             int player_id);
-
   // Returns a new instance using the registered factory if available.
   static BrowserMediaPlayerManager* Create(RenderFrameHost* rfh);
 
diff --git a/content/browser/media/capture/cursor_renderer.h b/content/browser/media/capture/cursor_renderer.h
index 65a089e..a26e043 100644
--- a/content/browser/media/capture/cursor_renderer.h
+++ b/content/browser/media/capture/cursor_renderer.h
@@ -85,6 +85,7 @@
 
  private:
   friend class CursorRendererAuraTest;
+  friend class CursorRendererMacTest;
 
   const gfx::NativeView captured_view_;
 
diff --git a/content/browser/media/capture/cursor_renderer_mac.h b/content/browser/media/capture/cursor_renderer_mac.h
index 173edba..2da16c07 100644
--- a/content/browser/media/capture/cursor_renderer_mac.h
+++ b/content/browser/media/capture/cursor_renderer_mac.h
@@ -44,6 +44,8 @@
   SkBitmap GetLastKnownCursorImage(gfx::Point* hot_point) final;
 
  private:
+  friend class CursorRendererMacTest;
+
   // Called for mouse activity events.
   void OnMouseEvent();
 
diff --git a/content/browser/media/capture/cursor_renderer_mac_unittest.mm b/content/browser/media/capture/cursor_renderer_mac_unittest.mm
new file mode 100644
index 0000000..326e5ad
--- /dev/null
+++ b/content/browser/media/capture/cursor_renderer_mac_unittest.mm
@@ -0,0 +1,183 @@
+// 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/media/capture/cursor_renderer_mac.h"
+
+#include <Cocoa/Cocoa.h>
+
+#include "base/mac/scoped_nsobject.h"
+#include "base/memory/ptr_util.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "media/base/video_frame.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/mac/coordinate_conversion.h"
+#include "ui/gfx/test/ui_cocoa_test_helper.h"
+
+namespace content {
+
+const int kTestViewWidth = 800;
+const int kTestViewHeight = 600;
+
+class CursorRendererMacTest : public ui::CocoaTest {
+ public:
+  CursorRendererMacTest() {}
+  ~CursorRendererMacTest() override{};
+
+  void SetUp() override {
+    ui::CocoaTest::SetUp();
+    base::scoped_nsobject<NSView> view([[NSView alloc]
+        initWithFrame:NSMakeRect(0, 0, kTestViewWidth, kTestViewHeight)]);
+    view_ = view.get();
+    [[test_window() contentView] addSubview:view_];
+
+    cursor_renderer_.reset(new CursorRendererMac(view_));
+  }
+
+  void TearDown() override {
+    cursor_renderer_.reset();
+    ui::CocoaTest::TearDown();
+  }
+
+  void SetTickClock(base::SimpleTestTickClock* clock) {
+    cursor_renderer_->tick_clock_ = clock;
+  }
+
+  bool CursorDisplayed() { return cursor_renderer_->cursor_displayed_; }
+
+  void RenderCursorOnVideoFrame(media::VideoFrame* target) {
+    cursor_renderer_->RenderOnVideoFrame(target);
+  }
+
+  void SnapshotCursorState(gfx::Rect region_in_frame) {
+    cursor_renderer_->SnapshotCursorState(region_in_frame);
+  }
+
+  // Here the |point| is in Aura coordinates (the origin (0, 0) is at top-left
+  // of the view). To move the cursor to that point by Quartz Display service,
+  // it needs to be converted into Cocoa coordinates (the origin is at
+  // bottom-left of the main screen) first, and then info Quartz coordinates
+  // (the origin is at top-left of the main display).
+  void MoveMouseCursorWithinWindow(gfx::Point point) {
+    point.set_y(kTestViewHeight - point.y());
+    CGWarpMouseCursorPosition(gfx::ScreenPointToNSPoint(point));
+    cursor_renderer_->OnMouseEvent();
+  }
+
+  void MoveMouseCursorWithinWindow() {
+    CGWarpMouseCursorPosition(
+        gfx::ScreenPointToNSPoint(gfx::Point(50, kTestViewHeight - 50)));
+    cursor_renderer_->OnMouseEvent();
+
+    CGWarpMouseCursorPosition(
+        gfx::ScreenPointToNSPoint(gfx::Point(100, kTestViewHeight - 100)));
+    cursor_renderer_->OnMouseEvent();
+  }
+
+  void MoveMouseCursorOutsideWindow() {
+    CGWarpMouseCursorPosition(CGPointMake(1000, 200));
+    cursor_renderer_->OnMouseEvent();
+  }
+
+  // A very simple test of whether there are any non-zero pixels
+  // in the region |rect| within |frame|.
+  bool NonZeroPixelsInRegion(scoped_refptr<media::VideoFrame> frame,
+                             gfx::Rect rect) {
+    bool y_found = false, u_found = false, v_found = false;
+    for (int y = rect.y(); y < rect.bottom(); ++y) {
+      uint8_t* yplane = frame->data(media::VideoFrame::kYPlane) +
+                        y * frame->row_bytes(media::VideoFrame::kYPlane);
+      uint8_t* uplane = frame->data(media::VideoFrame::kUPlane) +
+                        (y / 2) * frame->row_bytes(media::VideoFrame::kUPlane);
+      uint8_t* vplane = frame->data(media::VideoFrame::kVPlane) +
+                        (y / 2) * frame->row_bytes(media::VideoFrame::kVPlane);
+      for (int x = rect.x(); x < rect.right(); ++x) {
+        if (yplane[x] != 0)
+          y_found = true;
+        if (uplane[x / 2])
+          u_found = true;
+        if (vplane[x / 2])
+          v_found = true;
+      }
+    }
+    return (y_found && u_found && v_found);
+  }
+
+ protected:
+  NSView* view_;
+  std::unique_ptr<CursorRendererMac> cursor_renderer_;
+};
+
+TEST_F(CursorRendererMacTest, CursorDuringMouseMovement) {
+  // Keep window activated.
+  [test_window() setPretendIsKeyWindow:YES];
+
+  EXPECT_FALSE(CursorDisplayed());
+
+  base::SimpleTestTickClock clock;
+  SetTickClock(&clock);
+
+  // Cursor displayed after mouse movement.
+  MoveMouseCursorWithinWindow();
+  EXPECT_TRUE(CursorDisplayed());
+
+  // Cursor not be displayed after idle period.
+  clock.SetNowTicks(base::TimeTicks::Now());
+  clock.Advance(base::TimeDelta::FromSeconds(5));
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_FALSE(CursorDisplayed());
+  clock.SetNowTicks(base::TimeTicks::Now());
+
+  // Cursor displayed with mouse movement following idle period.
+  MoveMouseCursorWithinWindow();
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_TRUE(CursorDisplayed());
+
+  // Cursor not displayed if mouse outside the window
+  MoveMouseCursorOutsideWindow();
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_FALSE(CursorDisplayed());
+}
+
+TEST_F(CursorRendererMacTest, CursorOnActiveWindow) {
+  EXPECT_FALSE(CursorDisplayed());
+
+  // Cursor displayed after mouse movement.
+  [test_window() setPretendIsKeyWindow:YES];
+  MoveMouseCursorWithinWindow();
+  EXPECT_TRUE(CursorDisplayed());
+
+  // Cursor not be displayed if window is not activated.
+  [test_window() setPretendIsKeyWindow:NO];
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_FALSE(CursorDisplayed());
+
+  // Cursor is displayed again if window is activated again.
+  [test_window() setPretendIsKeyWindow:YES];
+  MoveMouseCursorWithinWindow();
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_TRUE(CursorDisplayed());
+}
+
+TEST_F(CursorRendererMacTest, CursorRenderedOnFrame) {
+  // Keep window activated.
+  [test_window() setPretendIsKeyWindow:YES];
+
+  EXPECT_FALSE(CursorDisplayed());
+
+  gfx::Size size(kTestViewWidth, kTestViewHeight);
+  scoped_refptr<media::VideoFrame> frame =
+      media::VideoFrame::CreateZeroInitializedFrame(media::PIXEL_FORMAT_YV12,
+                                                    size, gfx::Rect(size), size,
+                                                    base::TimeDelta());
+
+  MoveMouseCursorWithinWindow(gfx::Point(60, 60));
+  SnapshotCursorState(gfx::Rect(size));
+  EXPECT_TRUE(CursorDisplayed());
+
+  EXPECT_FALSE(NonZeroPixelsInRegion(frame, gfx::Rect(50, 50, 70, 70)));
+  RenderCursorOnVideoFrame(frame.get());
+  EXPECT_TRUE(NonZeroPixelsInRegion(frame, gfx::Rect(50, 50, 70, 70)));
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 6f88159..8e4112c0 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -830,6 +830,7 @@
   // null, so we re-initialize it here.
   if (!channel_)
     InitializeChannelProxy();
+  DCHECK(pending_connection_);
 
   // Unpause the Channel briefly. This will be paused again below if we launch a
   // real child process. Note that messages may be sent in the short window
@@ -910,7 +911,7 @@
     // at this stage.
     child_process_launcher_.reset(new ChildProcessLauncher(
         base::MakeUnique<RendererSandboxedProcessLauncherDelegate>(),
-        std::move(cmd_line), GetID(), this, child_token_,
+        std::move(cmd_line), GetID(), this, std::move(pending_connection_),
         base::Bind(&RenderProcessHostImpl::OnMojoError, id_)));
     channel_->Pause();
 
@@ -933,9 +934,6 @@
 }
 
 void RenderProcessHostImpl::InitializeChannelProxy() {
-  // Generate a token used to identify the new child process.
-  child_token_ = mojo::edk::GenerateRandomToken();
-
   scoped_refptr<base::SingleThreadTaskRunner> io_task_runner =
       BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
 
@@ -960,10 +958,11 @@
   }
 
   // Establish a ServiceManager connection for the new render service instance.
+  pending_connection_.reset(new mojo::edk::PendingProcessConnection);
   child_connection_.reset(new ChildConnection(
       mojom::kRendererServiceName,
-      base::StringPrintf("%d_%d", id_, instance_id_++), child_token_, connector,
-      io_task_runner));
+      base::StringPrintf("%d_%d", id_, instance_id_++),
+      pending_connection_.get(), connector, io_task_runner));
 
   // Send an interface request to bootstrap the IPC::Channel. Note that this
   // request will happily sit on the pipe until the process is launched and
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index a7c2fa32..0ef85c8 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -33,6 +33,7 @@
 #include "ipc/ipc_channel_proxy.h"
 #include "ipc/ipc_platform_file.h"
 #include "media/media_features.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "mojo/public/cpp/bindings/associated_binding_set.h"
 #include "mojo/public/cpp/bindings/interface_ptr.h"
@@ -428,7 +429,7 @@
         BrowserThread::GetTaskRunnerForThread(BrowserThread::UI));
   }
 
-  std::string child_token_;
+  std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection_;
 
   std::unique_ptr<ChildConnection> child_connection_;
   int connection_filter_id_ =
diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc
index c64d2b7..082906f 100644
--- a/content/common/child_process_host_impl.cc
+++ b/content/common/child_process_host_impl.cc
@@ -121,16 +121,13 @@
 }
 
 std::string ChildProcessHostImpl::CreateChannelMojo(
-    const std::string& child_token) {
+    mojo::edk::PendingProcessConnection* connection) {
   DCHECK(channel_id_.empty());
-  channel_id_ = mojo::edk::GenerateRandomToken();
-  mojo::ScopedMessagePipeHandle host_handle =
-      mojo::edk::CreateParentMessagePipe(channel_id_, child_token);
-  channel_ = IPC::ChannelMojo::Create(std::move(host_handle),
-                                      IPC::Channel::MODE_SERVER, this);
+  channel_ =
+      IPC::ChannelMojo::Create(connection->CreateMessagePipe(&channel_id_),
+                               IPC::Channel::MODE_SERVER, this);
   if (!channel_ || !InitChannel())
     return std::string();
-
   return channel_id_;
 }
 
diff --git a/content/common/child_process_host_impl.h b/content/common/child_process_host_impl.h
index 5a315ca..ebeb8aa 100644
--- a/content/common/child_process_host_impl.h
+++ b/content/common/child_process_host_impl.h
@@ -64,7 +64,8 @@
   // ChildProcessHost implementation
   bool Send(IPC::Message* message) override;
   void ForceShutdown() override;
-  std::string CreateChannelMojo(const std::string& child_token) override;
+  std::string CreateChannelMojo(
+      mojo::edk::PendingProcessConnection* connection) override;
   void CreateChannelMojo() override;
   bool IsChannelOpening() override;
   void AddFilter(IPC::MessageFilter* filter) override;
diff --git a/content/common/feature_policy/feature_policy.cc b/content/common/feature_policy/feature_policy.cc
index a8204da..c4875a9c 100644
--- a/content/common/feature_policy/feature_policy.cc
+++ b/content/common/feature_policy/feature_policy.cc
@@ -4,8 +4,70 @@
 
 #include "content/common/feature_policy/feature_policy.h"
 
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
+
 namespace content {
 
+namespace {
+
+// Given a string name, return the matching feature struct, or nullptr if it is
+// not the name of a policy-controlled feature.
+blink::WebFeaturePolicyFeature FeatureForName(
+    const std::string& feature_name,
+    const FeaturePolicy::FeatureList& features) {
+  for (const auto& feature_mapping : features) {
+    if (feature_name == feature_mapping.second->feature_name)
+      return feature_mapping.first;
+  }
+  return blink::WebFeaturePolicyFeature::NotFound;
+}
+
+// Definitions of all features controlled by Feature Policy should appear here.
+const FeaturePolicy::Feature kDocumentCookie{
+    "cookie", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kDocumentDomain{
+    "domain", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kDocumentWrite{
+    "docwrite", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kFullscreenFeature{
+    "fullscreen", FeaturePolicy::FeatureDefault::EnableForSelf};
+const FeaturePolicy::Feature kGeolocationFeature{
+    "geolocation", FeaturePolicy::FeatureDefault::EnableForSelf};
+const FeaturePolicy::Feature kMidiFeature{
+    "midi", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kNotificationsFeature{
+    "notifications", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kPaymentFeature{
+    "payment", FeaturePolicy::FeatureDefault::EnableForSelf};
+const FeaturePolicy::Feature kPushFeature{
+    "push", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kSyncScript{
+    "sync-script", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kSyncXHR{
+    "sync-xhr", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kUsermedia{
+    "usermedia", FeaturePolicy::FeatureDefault::EnableForAll};
+const FeaturePolicy::Feature kVibrateFeature{
+    "vibrate", FeaturePolicy::FeatureDefault::EnableForSelf};
+const FeaturePolicy::Feature kWebRTC{
+    "webrtc", FeaturePolicy::FeatureDefault::EnableForAll};
+
+// Extracts a Whitelist from a ParsedFeaturePolicyDeclaration.
+std::unique_ptr<FeaturePolicy::Whitelist> WhitelistFromDeclaration(
+    const ParsedFeaturePolicyDeclaration& parsed_declaration) {
+  std::unique_ptr<FeaturePolicy::Whitelist> result =
+      base::WrapUnique(new FeaturePolicy::Whitelist());
+  if (parsed_declaration.matches_all_origins)
+    result->AddAll();
+  for (const auto& origin : parsed_declaration.origins)
+    result->Add(origin);
+  return result;
+}
+
+}  // namespace
+
 ParsedFeaturePolicyDeclaration::ParsedFeaturePolicyDeclaration()
     : matches_all_origins(false) {}
 
@@ -22,4 +84,121 @@
 
 ParsedFeaturePolicyDeclaration::~ParsedFeaturePolicyDeclaration() {}
 
+FeaturePolicy::Whitelist::Whitelist() : matches_all_origins_(false) {}
+
+FeaturePolicy::Whitelist::~Whitelist() = default;
+
+void FeaturePolicy::Whitelist::Add(const url::Origin& origin) {
+  origins_.push_back(origin);
+}
+
+void FeaturePolicy::Whitelist::AddAll() {
+  matches_all_origins_ = true;
+}
+
+bool FeaturePolicy::Whitelist::Contains(const url::Origin& origin) const {
+  if (matches_all_origins_)
+    return true;
+  for (const auto& targetOrigin : origins_) {
+    if (targetOrigin.IsSameOriginWith(origin))
+      return true;
+  }
+  return false;
+}
+
+// static
+std::unique_ptr<FeaturePolicy> FeaturePolicy::CreateFromParentPolicy(
+    const FeaturePolicy* parent_policy,
+    const url::Origin& origin) {
+  return CreateFromParentPolicy(parent_policy, origin, GetDefaultFeatureList());
+}
+
+bool FeaturePolicy::IsFeatureEnabledForOrigin(
+    blink::WebFeaturePolicyFeature feature,
+    const url::Origin& origin) const {
+  DCHECK(base::ContainsKey(feature_list_, feature));
+  const FeaturePolicy::Feature* feature_definition = feature_list_.at(feature);
+  DCHECK(base::ContainsKey(inherited_policies_, feature));
+  if (!inherited_policies_.at(feature))
+    return false;
+  auto whitelist = whitelists_.find(feature);
+  if (whitelist != whitelists_.end())
+    return whitelist->second->Contains(origin);
+  if (feature_definition->default_policy ==
+      FeaturePolicy::FeatureDefault::EnableForAll) {
+    return true;
+  }
+  if (feature_definition->default_policy ==
+      FeaturePolicy::FeatureDefault::EnableForSelf) {
+    return origin_.IsSameOriginWith(origin);
+  }
+  return false;
+}
+
+bool FeaturePolicy::IsFeatureEnabled(
+    blink::WebFeaturePolicyFeature feature) const {
+  return IsFeatureEnabledForOrigin(feature, origin_);
+}
+
+void FeaturePolicy::SetHeaderPolicy(
+    const ParsedFeaturePolicyHeader& parsed_header) {
+  DCHECK(whitelists_.empty());
+  for (const ParsedFeaturePolicyDeclaration& parsed_declaration :
+       parsed_header) {
+    blink::WebFeaturePolicyFeature feature =
+        FeatureForName(parsed_declaration.feature_name, feature_list_);
+    if (feature == blink::WebFeaturePolicyFeature::NotFound)
+      continue;
+    whitelists_[feature] = WhitelistFromDeclaration(parsed_declaration);
+  }
+}
+
+FeaturePolicy::FeaturePolicy(url::Origin origin,
+                             const FeatureList& feature_list)
+    : origin_(origin), feature_list_(feature_list) {}
+
+FeaturePolicy::FeaturePolicy(url::Origin origin)
+    : origin_(origin), feature_list_(GetDefaultFeatureList()) {}
+
+FeaturePolicy::~FeaturePolicy() {}
+
+// static
+std::unique_ptr<FeaturePolicy> FeaturePolicy::CreateFromParentPolicy(
+    const FeaturePolicy* parent_policy,
+    const url::Origin& origin,
+    const FeaturePolicy::FeatureList& features) {
+  std::unique_ptr<FeaturePolicy> new_policy =
+      base::WrapUnique(new FeaturePolicy(origin, features));
+  for (const auto& feature : features) {
+    if (!parent_policy ||
+        parent_policy->IsFeatureEnabledForOrigin(feature.first, origin)) {
+      new_policy->inherited_policies_[feature.first] = true;
+    } else {
+      new_policy->inherited_policies_[feature.first] = false;
+    }
+  }
+  return new_policy;
+}
+
+// static
+const FeaturePolicy::FeatureList& FeaturePolicy::GetDefaultFeatureList() {
+  CR_DEFINE_STATIC_LOCAL(
+      FeatureList, default_feature_list,
+      ({{blink::WebFeaturePolicyFeature::DocumentCookie, &kDocumentCookie},
+        {blink::WebFeaturePolicyFeature::DocumentDomain, &kDocumentDomain},
+        {blink::WebFeaturePolicyFeature::DocumentWrite, &kDocumentWrite},
+        {blink::WebFeaturePolicyFeature::Fullscreen, &kFullscreenFeature},
+        {blink::WebFeaturePolicyFeature::Geolocation, &kGeolocationFeature},
+        {blink::WebFeaturePolicyFeature::MidiFeature, &kMidiFeature},
+        {blink::WebFeaturePolicyFeature::Notifications, &kNotificationsFeature},
+        {blink::WebFeaturePolicyFeature::Payment, &kPaymentFeature},
+        {blink::WebFeaturePolicyFeature::Push, &kPushFeature},
+        {blink::WebFeaturePolicyFeature::SyncScript, &kSyncScript},
+        {blink::WebFeaturePolicyFeature::SyncXHR, &kSyncXHR},
+        {blink::WebFeaturePolicyFeature::Usermedia, &kUsermedia},
+        {blink::WebFeaturePolicyFeature::Vibrate, &kVibrateFeature},
+        {blink::WebFeaturePolicyFeature::WebRTC, &kWebRTC}}));
+  return default_feature_list;
+}
+
 }  // namespace content
diff --git a/content/common/feature_policy/feature_policy.h b/content/common/feature_policy/feature_policy.h
index b49e1a4..44f9e11f 100644
--- a/content/common/feature_policy/feature_policy.h
+++ b/content/common/feature_policy/feature_policy.h
@@ -5,14 +5,77 @@
 #ifndef CONTENT_COMMON_FEATURE_POLICY_FEATURE_POLICY_H_
 #define CONTENT_COMMON_FEATURE_POLICY_FEATURE_POLICY_H_
 
+#include <map>
+#include <memory>
 #include <string>
 #include <vector>
 
+#include "base/macros.h"
 #include "content/common/content_export.h"
+#include "third_party/WebKit/public/platform/WebFeaturePolicy.h"
 #include "url/origin.h"
 
 namespace content {
 
+// Feature Policy is a mechanism for controlling the availability of web
+// platform features in a frame, including all embedded frames. It can be used
+// to remove features, automatically refuse API permission requests, or modify
+// the behaviour of features. (The specific changes which are made depend on the
+// feature; see the specification for details).
+//
+// Policies can be defined in the HTTP header stream, with the |Feature-Policy|
+// HTTP header, or can be set by the |allow| attributes on the iframe element
+// which embeds the document.
+//
+// See https://wicg.github.io/FeaturePolicy/
+//
+// Key concepts:
+//
+// Features
+// --------
+// Features which can be controlled by policy are defined by instances of the
+// FeaturePolicy::Feature struct. The features are referenced by the
+// |WebFeaturePolicyFeature| enum, declared in |WebFeaturePolicy.h|.
+//
+// Whitelists
+// ----------
+// Whitelists are collections of origins, although two special terms can be used
+// when declaring them:
+//   "self" refers to the orgin of the frame which is declaring the policy.
+//   "*" refers to all origins; any origin will match a whitelist which contains
+//     it.
+//
+// Declarations
+// ------------
+// A feature policy declaration is a mapping of a feature name to a whitelist.
+// A set of declarations is a declared policy.
+//
+// Inherited Policy
+// ----------------
+// In addition to the declared policy (which may be empty), every frame has
+// an inherited policy, which is determined by the context in which it is
+// embedded, or by the defaults for each feature in the case of the top-level
+// document.
+//
+// Defaults
+// --------
+// Each defined feature has a default policy, which determines whether the
+// feature is available when no policy has been declared, ans determines how the
+// feature is inherited across origin boundaries.
+//
+// If the default policy  is in effect for a frame, then it controls how the
+// feature is inherited by any cross-origin iframes embedded by the frame. (See
+// the comments below in FeaturePolicy::DefaultPolicy for specifics)
+//
+// Policy Inheritance
+// ------------------
+// Policies in effect for a frame are inherited by any child frames it embeds.
+// Unless another policy is declared in the child, all same-origin children will
+// receive the same set of enables features as the parent frame. Whether or not
+// features are inherited by cross-origin iframes without an explicit policy is
+// determined by the feature's default policy. (Again, see the comments in
+// FeaturePolicy::DefaultPolicy for details)
+
 // This struct holds feature policy whitelist data that needs to be replicated
 // between a RenderFrame and any of its associated RenderFrameProxies. A list of
 // these form a ParsedFeaturePolicyHeader.
@@ -33,6 +96,114 @@
 
 using ParsedFeaturePolicyHeader = std::vector<ParsedFeaturePolicyDeclaration>;
 
+class CONTENT_EXPORT FeaturePolicy {
+ public:
+  // Represents a collection of origins which make up a whitelist in a feature
+  // policy. This collection may be set to match every origin (corresponding to
+  // the "*" syntax in the policy string, in which case the Contains() method
+  // will always return true.
+  class Whitelist final {
+   public:
+    Whitelist();
+    ~Whitelist();
+
+    // Adds a single origin to the whitelist.
+    void Add(const url::Origin& origin);
+
+    // Adds all origins to the whitelist.
+    void AddAll();
+
+    // Returns true if the given origin has been added to the whitelist.
+    bool Contains(const url::Origin& origin) const;
+
+   private:
+    bool matches_all_origins_;
+    std::vector<url::Origin> origins_;
+  };
+
+  // The FeaturePolicy::FeatureDefault enum defines the default enable state for
+  // a feature when neither it nor any parent frame have declared an explicit
+  // policy. The three possibilities map directly to Feature Policy Whitelist
+  // semantics.
+  enum class FeatureDefault {
+    // Equivalent to []. If this default policy is in effect for a frame, then
+    // the feature will not be enabled for that frame or any of its children.
+    DisableForAll,
+
+    // Equivalent to ["self"]. If this default policy is in effect for a frame,
+    // then the feature will be enabled for that frame, and any same-origin
+    // child frames, but not for any cross-origin child frames.
+    EnableForSelf,
+
+    // Equivalent to ["*"]. If in effect for a frame, then the feature is
+    // enabled for that frame and all of its children.
+    EnableForAll
+  };
+
+  // The FeaturePolicy::Feature struct is used to define all features under
+  // control of Feature Policy. There should only be one instance of this struct
+  // for any given feature (declared below).
+  struct Feature {
+    // The name of the feature, as it should appear in a policy string
+    const char* const feature_name;
+
+    // Controls whether the feature should be available in the platform by
+    // default, in the absence of any declared policy.
+    FeatureDefault default_policy;
+  };
+
+  using FeatureList =
+      std::map<blink::WebFeaturePolicyFeature, const FeaturePolicy::Feature*>;
+
+  ~FeaturePolicy();
+
+  static std::unique_ptr<FeaturePolicy> CreateFromParentPolicy(
+      const FeaturePolicy* parent_policy,
+      const url::Origin& origin);
+
+  // Returns whether or not the given feature is enabled by this policy.
+  bool IsFeatureEnabledForOrigin(blink::WebFeaturePolicyFeature feature,
+                                 const url::Origin& origin) const;
+
+  // Returns whether or not the given feature is enabled for the origin of the
+  // document that owns the policy.
+  bool IsFeatureEnabled(blink::WebFeaturePolicyFeature feature) const;
+
+  // Sets the declared policy from the parsed Feature-Policy HTTP header.
+  // Unrecognized features will be ignored.
+  void SetHeaderPolicy(const ParsedFeaturePolicyHeader& parsed_header);
+
+ private:
+  friend class FeaturePolicyTest;
+
+  explicit FeaturePolicy(url::Origin origin);
+  FeaturePolicy(url::Origin origin, const FeatureList& feature_list);
+  static std::unique_ptr<FeaturePolicy> CreateFromParentPolicy(
+      const FeaturePolicy* parent_policy,
+      const url::Origin& origin,
+      const FeatureList& features);
+
+  // Returns the list of features which can be controlled by Feature Policy.
+  static const FeatureList& GetDefaultFeatureList();
+
+  url::Origin origin_;
+
+  // Map of feature names to declared whitelists. Any feature which is missing
+  // from this map should use the inherited policy.
+  std::map<blink::WebFeaturePolicyFeature, std::unique_ptr<Whitelist>>
+      whitelists_;
+
+  // Records whether or not each feature was enabled for this frame by its
+  // parent frame.
+  // TODO(iclelland): Generate, instead of this map, a set of bool flags, one
+  // for each feature, as all features are supposed to be represented here.
+  std::map<blink::WebFeaturePolicyFeature, bool> inherited_policies_;
+
+  const FeatureList& feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(FeaturePolicy);
+};
+
 }  // namespace content
 
 #endif  // CONTENT_COMMON_FEATURE_POLICY_FEATURE_POLICY_H_
diff --git a/content/common/feature_policy/feature_policy_unittest.cc b/content/common/feature_policy/feature_policy_unittest.cc
new file mode 100644
index 0000000..8426bd0
--- /dev/null
+++ b/content/common/feature_policy/feature_policy_unittest.cc
@@ -0,0 +1,644 @@
+// 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 "content/common/feature_policy/feature_policy.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace content {
+
+namespace {
+
+// This is an example of a feature which should be enabled by default in all
+// frames.
+const FeaturePolicy::Feature kDefaultOnFeatureDfn{
+    "default-on", FeaturePolicy::FeatureDefault::EnableForAll};
+
+// This is an example of a feature which should be enabled in top-level frames,
+// and same-origin child-frames, but must be delegated to all cross-origin
+// frames explicitly.
+const FeaturePolicy::Feature kDefaultSelfFeatureDfn{
+    "default-self", FeaturePolicy::FeatureDefault::EnableForSelf};
+
+// This is an example of a feature which should be disabled by default, both in
+// top-level and nested frames.
+const FeaturePolicy::Feature kDefaultOffFeatureDfn{
+    "default-off", FeaturePolicy::FeatureDefault::DisableForAll};
+
+// Define the three new features for testing
+blink::WebFeaturePolicyFeature kDefaultOnFeature =
+    static_cast<blink::WebFeaturePolicyFeature>(
+        static_cast<int>(blink::WebFeaturePolicyFeature::LAST_FEATURE) + 1);
+
+blink::WebFeaturePolicyFeature kDefaultSelfFeature =
+    static_cast<blink::WebFeaturePolicyFeature>(
+        static_cast<int>(blink::WebFeaturePolicyFeature::LAST_FEATURE) + 2);
+
+blink::WebFeaturePolicyFeature kDefaultOffFeature =
+    static_cast<blink::WebFeaturePolicyFeature>(
+        static_cast<int>(blink::WebFeaturePolicyFeature::LAST_FEATURE) + 3);
+
+}  // namespace
+
+class FeaturePolicyTest : public ::testing::Test {
+ protected:
+  FeaturePolicyTest()
+      : feature_list_({{kDefaultOnFeature, &kDefaultOnFeatureDfn},
+                       {kDefaultSelfFeature, &kDefaultSelfFeatureDfn},
+                       {kDefaultOffFeature, &kDefaultOffFeatureDfn}}) {}
+
+  ~FeaturePolicyTest() override {}
+
+  std::unique_ptr<FeaturePolicy> CreateFromParentPolicy(
+      const FeaturePolicy* parent,
+      const url::Origin& origin) {
+    return FeaturePolicy::CreateFromParentPolicy(parent, origin, feature_list_);
+  }
+
+  url::Origin origin_a_ = url::Origin(GURL("https://example.com/"));
+  url::Origin origin_b_ = url::Origin(GURL("https://example.net/"));
+  url::Origin origin_c_ = url::Origin(GURL("https://example.org/"));
+
+ private:
+  // Contains the list of controlled features, so that we are guaranteed to
+  // have at least one of each kind of default behaviour represented.
+  FeaturePolicy::FeatureList feature_list_;
+};
+
+TEST_F(FeaturePolicyTest, TestInitialPolicy) {
+  // +-------------+
+  // |(1)Origin A  |
+  // |No Policy    |
+  // +-------------+
+  // Default-on and top-level-only features should be enabled in top-level
+  // frame. Default-off features should be disabled.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy1->IsFeatureEnabled(kDefaultOffFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestInitialSameOriginChildPolicy) {
+  // +-----------------+
+  // |(1)Origin A      |
+  // |No Policy        |
+  // | +-------------+ |
+  // | |(2)Origin A  | |
+  // | |No Policy    | |
+  // | +-------------+ |
+  // +-----------------+
+  // Default-on and Default-self features should be enabled in a same-origin
+  // child frame. Default-off features should be disabled.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_a_);
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultOffFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestInitialCrossOriginChildPolicy) {
+  // +-----------------+
+  // |(1)Origin A      |
+  // |No Policy        |
+  // | +-------------+ |
+  // | |(2)Origin B  | |
+  // | |No Policy    | |
+  // | +-------------+ |
+  // +-----------------+
+  // Default-on features should be enabled in child frame. Default-self and
+  // Default-off features should be disabled.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultOffFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestCrossOriginChildCannotEnableFeature) {
+  // +---------------------------------------+
+  // |(1) Origin A                           |
+  // |No Policy                              |
+  // | +-----------------------------------+ |
+  // | |(2) Origin B                       | |
+  // | |Policy: {"default-self": ["self"]} | |
+  // | +-----------------------------------+ |
+  // +---------------------------------------+
+  // Default-self feature should be disabled in cross origin frame, even if no
+  // policy was specified in the parent frame.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy({{{"default-self", false, {origin_b_}}}});
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestFrameSelfInheritance) {
+  // +------------------------------------------+
+  // |(1) Origin A                              |
+  // |Policy: {"default-self": ["self"]}        |
+  // | +-----------------+  +-----------------+ |
+  // | |(2) Origin A     |  |(4) Origin B     | |
+  // | |No Policy        |  |No Policy        | |
+  // | | +-------------+ |  | +-------------+ | |
+  // | | |(3)Origin A  | |  | |(5)Origin B  | | |
+  // | | |No Policy    | |  | |No Policy    | | |
+  // | | +-------------+ |  | +-------------+ | |
+  // | +-----------------+  +-----------------+ |
+  // +------------------------------------------+
+  // Feature should be enabled at the top-level, and through the chain of
+  // same-origin frames 2 and 3. It should be disabled in frames 4 and 5, as
+  // they are at a different origin.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_a_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_a_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_a_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy5 =
+      CreateFromParentPolicy(policy4.get(), origin_b_);
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy4->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy5->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestReflexiveFrameSelfInheritance) {
+  // +-----------------------------------+
+  // |(1) Origin A                       |
+  // |Policy: {"default-self": ["self"]} |
+  // | +-----------------+               |
+  // | |(2) Origin B     |               |
+  // | |No Policy        |               |
+  // | | +-------------+ |               |
+  // | | |(3)Origin A  | |               |
+  // | | |No Policy    | |               |
+  // | | +-------------+ |               |
+  // | +-----------------+               |
+  // +-----------------------------------+
+  // Feature which is enabled at top-level should be disabled in frame 3, as
+  // it is embedded by frame 2, for which the feature is not enabled.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_a_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_a_);
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestSelectiveFrameInheritance) {
+  // +------------------------------------------+
+  // |(1) Origin A                              |
+  // |Policy: {"default-self": ["Origin B"]}    |
+  // | +-----------------+  +-----------------+ |
+  // | |(2) Origin B     |  |(3) Origin C     | |
+  // | |No Policy        |  |No Policy        | |
+  // | |                 |  | +-------------+ | |
+  // | |                 |  | |(4)Origin B  | | |
+  // | |                 |  | |No Policy    | | |
+  // | |                 |  | +-------------+ | |
+  // | +-----------------+  +-----------------+ |
+  // +------------------------------------------+
+  // Feature should be enabled in second level Origin B frame, but disabled in
+  // Frame 4, because it is embedded by frame 3, where the feature is not
+  // enabled.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy1.get(), origin_c_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy3.get(), origin_b_);
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy4->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestPolicyCanBlockSelf) {
+  // +----------------------------+
+  // |(1)Origin A                 |
+  // |Policy: {"default-on": []}  |
+  // +----------------------------+
+  // Default-on feature should be disabled in top-level frame.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy(
+      {{{"default-on", false, std::vector<url::Origin>()}}});
+  EXPECT_FALSE(policy1->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestParentPolicyBlocksSameOriginChildPolicy) {
+  // +----------------------------+
+  // |(1)Origin A                 |
+  // |Policy: {"default-on": []}  |
+  // | +-------------+            |
+  // | |(2)Origin A  |            |
+  // | |No Policy    |            |
+  // | +-------------+            |
+  // +----------------------------+
+  // Feature should be disabled in child frame.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy(
+      {{{"default-on", false, std::vector<url::Origin>()}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_a_);
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestChildPolicyCanBlockSelf) {
+  // +--------------------------------+
+  // |(1)Origin A                     |
+  // |No Policy                       |
+  // | +----------------------------+ |
+  // | |(2)Origin B                 | |
+  // | |Policy: {"default-on": []}  | |
+  // | +----------------------------+ |
+  // +--------------------------------+
+  // Default-on feature should be disabled by cross-origin child frame.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy(
+      {{{"default-on", false, std::vector<url::Origin>()}}});
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestChildPolicyCanBlockChildren) {
+  // +--------------------------------------+
+  // |(1)Origin A                           |
+  // |No Policy                             |
+  // | +----------------------------------+ |
+  // | |(2)Origin B                       | |
+  // | |Policy: {"default-on": ["self"]}  | |
+  // | | +-------------+                  | |
+  // | | |(3)Origin C  |                  | |
+  // | | |No Policy    |                  | |
+  // | | +-------------+                  | |
+  // | +----------------------------------+ |
+  // +--------------------------------------+
+  // Default-on feature should be enabled in frames 1 and 2; disabled in frame
+  // 3 by child frame policy.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy({{{"default-on", false, {origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestParentPolicyBlocksCrossOriginChildPolicy) {
+  // +----------------------------+
+  // |(1)Origin A                 |
+  // |Policy: {"default-on": []}  |
+  // | +-------------+            |
+  // | |(2)Origin B  |            |
+  // | |No Policy    |            |
+  // | +-------------+            |
+  // +----------------------------+
+  // Default-on feature should be disabled in cross-origin child frame.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy(
+      {{{"default-on", false, std::vector<url::Origin>()}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestEnableForAllOrigins) {
+  // +--------------------------------+
+  // |(1) Origin A                    |
+  // |Policy: {"default-self": ["*"]} |
+  // | +-----------------+            |
+  // | |(2) Origin B     |            |
+  // | |No Policy        |            |
+  // | | +-------------+ |            |
+  // | | |(3)Origin A  | |            |
+  // | | |No Policy    | |            |
+  // | | +-------------+ |            |
+  // | +-----------------+            |
+  // +--------------------------------+
+  // Feature should be enabled in top and second level; disabled in frame 3.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy(
+      {{{"default-self", true, std::vector<url::Origin>()}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_a_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestDefaultOnEnablesForAllAncestors) {
+  // +---------------------------------------+
+  // |(1) Origin A                           |
+  // |Policy: {"default-on": ["Origin B"]}   |
+  // | +-----------------------------------+ |
+  // | |(2) Origin B                       | |
+  // | |No Policy                          | |
+  // | | +-------------+   +-------------+ | |
+  // | | |(3)Origin B  |   |(4)Origin C  | | |
+  // | | |No Policy    |   |No Policy    | | |
+  // | | +-------------+   +-------------+ | |
+  // | +-----------------------------------+ |
+  // +---------------------------------------+
+  // Feature should be disabled in frame 1; enabled in frames 2, 3 and 4.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-on", false, {origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  EXPECT_FALSE(policy1->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy3->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy4->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestDefaultSelfRespectsSameOriginEmbedding) {
+  // +---------------------------------------+
+  // |(1) Origin A                           |
+  // |Policy: {"default-self": ["Origin B"]} |
+  // | +-----------------------------------+ |
+  // | |(2) Origin B                       | |
+  // | |No Policy                          | |
+  // | | +-------------+   +-------------+ | |
+  // | | |(3)Origin B  |   |(4)Origin C  | | |
+  // | | |No Policy    |   |No Policy    | | |
+  // | | +-------------+   +-------------+ | |
+  // | +-----------------------------------+ |
+  // +---------------------------------------+
+  // Feature should be disabled in frames 1 and 4; enabled in frames 2 and 3.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  EXPECT_FALSE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy4->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestDefaultOffMustBeDelegatedToAllCrossOriginFrames) {
+  // +------------------------------------------------------------+
+  // |(1) Origin A                                                |
+  // |Policy: {"default-off": ["Origin B"]}                       |
+  // | +--------------------------------------------------------+ |
+  // | |(2) Origin B                                            | |
+  // | |Policy: {"default-off": ["self"]}                       | |
+  // | | +-------------+   +----------------------------------+ | |
+  // | | |(3)Origin B  |   |(4)Origin C                       | | |
+  // | | |No Policy    |   |Policy: {"default-off": ["self"]} | | |
+  // | | +-------------+   +----------------------------------+ | |
+  // | +--------------------------------------------------------+ |
+  // +------------------------------------------------------------+
+  // Feature should be disabled in frames 1, 3 and 4; enabled in frame 2 only.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-off", false, {origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy({{{"default-off", false, {origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  policy4->SetHeaderPolicy({{{"default-off", false, {origin_c_}}}});
+  EXPECT_FALSE(policy1->IsFeatureEnabled(kDefaultOffFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultOffFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultOffFeature));
+  EXPECT_FALSE(policy4->IsFeatureEnabled(kDefaultOffFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestReenableForAllOrigins) {
+  // +------------------------------------+
+  // |(1) Origin A                        |
+  // |Policy: {"default-self": ["*"]}     |
+  // | +--------------------------------+ |
+  // | |(2) Origin B                    | |
+  // | |Policy: {"default-self": ["*"]} | |
+  // | | +-------------+                | |
+  // | | |(3)Origin A  |                | |
+  // | | |No Policy    |                | |
+  // | | +-------------+                | |
+  // | +--------------------------------+ |
+  // +------------------------------------+
+  // Feature should be enabled in all frames.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy(
+      {{{"default-self", true, std::vector<url::Origin>()}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy(
+      {{{"default-self", true, std::vector<url::Origin>()}}});
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_a_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestBlockedFrameCannotReenable) {
+  // +--------------------------------------+
+  // |(1)Origin A                           |
+  // |Policy: {"default-self": ["self"]}    |
+  // | +----------------------------------+ |
+  // | |(2)Origin B                       | |
+  // | |Policy: {"default-self": ["*"]}   | |
+  // | | +-------------+  +-------------+ | |
+  // | | |(3)Origin A  |  |(4)Origin C  | | |
+  // | | |No Policy    |  |No Policy    | | |
+  // | | +-------------+  +-------------+ | |
+  // | +----------------------------------+ |
+  // +--------------------------------------+
+  // Feature should be enabled at the top level; disabled in all other frames.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_a_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy(
+      {{{"default-self", true, std::vector<url::Origin>()}}});
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_a_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy4->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestEnabledFrameCanDelegate) {
+  // +---------------------------------------------------+
+  // |(1) Origin A                                       |
+  // |Policy: {"default-self": ["self", "Origin B"]}     |
+  // | +-----------------------------------------------+ |
+  // | |(2) Origin B                                   | |
+  // | |Policy: {"default-self": ["self", "Origin C"]} | |
+  // | | +-------------+                               | |
+  // | | |(3)Origin C  |                               | |
+  // | | |No Policy    |                               | |
+  // | | +-------------+                               | |
+  // | +-----------------------------------------------+ |
+  // +---------------------------------------------------+
+  // Feature should be enabled in all frames.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_a_, origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy({{{"default-self", false, {origin_b_, origin_c_}}}});
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestEnabledFrameCanDelegateByDefault) {
+  // +-----------------------------------------------+
+  // |(1) Origin A                                   |
+  // |Policy: {"default-on": ["self", "Origin B"]}   |
+  // | +--------------------+ +--------------------+ |
+  // | |(2) Origin B        | | (4) Origin C       | |
+  // | |No Policy           | | No Policy          | |
+  // | | +-------------+    | |                    | |
+  // | | |(3)Origin C  |    | |                    | |
+  // | | |No Policy    |    | |                    | |
+  // | | +-------------+    | |                    | |
+  // | +--------------------+ +--------------------+ |
+  // +-----------------------------------------------+
+  // Feature should be enabled in frames 1, 2, and 3, and disabled in frame 4.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-on", false, {origin_a_, origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy1.get(), origin_c_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy3->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_FALSE(policy4->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestNonNestedFeaturesDontDelegateByDefault) {
+  // +-----------------------------------------------+
+  // |(1) Origin A                                   |
+  // |Policy: {"default-self": ["self", "Origin B"]} |
+  // | +--------------------+ +--------------------+ |
+  // | |(2) Origin B        | | (4) Origin C       | |
+  // | |No Policy           | | No Policy          | |
+  // | | +-------------+    | |                    | |
+  // | | |(3)Origin C  |    | |                    | |
+  // | | |No Policy    |    | |                    | |
+  // | | +-------------+    | |                    | |
+  // | +--------------------+ +--------------------+ |
+  // +-----------------------------------------------+
+  // Feature should be enabled in frames 1 and 2, and disabled in frames 3 and
+  // 4.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_a_, origin_b_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  std::unique_ptr<FeaturePolicy> policy4 =
+      CreateFromParentPolicy(policy1.get(), origin_c_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy4->IsFeatureEnabled(kDefaultSelfFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestFeaturesAreIndependent) {
+  // +-----------------------------------------------+
+  // |(1) Origin A                                   |
+  // |Policy: {"default-self": ["self", "Origin B"], |
+  // |         "default-on": ["self"]}               |
+  // | +-------------------------------------------+ |
+  // | |(2) Origin B                               | |
+  // | |Policy: {"default-self": ["*"],            | |
+  // | |         "default-on": ["*"]}              | |
+  // | | +-------------+                           | |
+  // | | |(3)Origin C  |                           | |
+  // | | |No Policy    |                           | |
+  // | | +-------------+                           | |
+  // | +-------------------------------------------+ |
+  // +-----------------------------------------------+
+  // Default-self feature should be enabled in all frames; Default-on feature
+  // should be enabled in frame 1, and disabled in frames 2 and 3.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-self", false, {origin_a_, origin_b_}},
+                             {"default-on", false, {origin_a_}}}});
+  std::unique_ptr<FeaturePolicy> policy2 =
+      CreateFromParentPolicy(policy1.get(), origin_b_);
+  policy2->SetHeaderPolicy(
+      {{{"default-self", true, std::vector<url::Origin>()},
+        {"default-on", true, std::vector<url::Origin>()}}});
+  std::unique_ptr<FeaturePolicy> policy3 =
+      CreateFromParentPolicy(policy2.get(), origin_c_);
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_TRUE(policy1->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy2->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy2->IsFeatureEnabled(kDefaultOnFeature));
+  EXPECT_TRUE(policy3->IsFeatureEnabled(kDefaultSelfFeature));
+  EXPECT_FALSE(policy3->IsFeatureEnabled(kDefaultOnFeature));
+}
+
+TEST_F(FeaturePolicyTest, TestFeatureEnabledForOrigin) {
+  // +-----------------------------------------------+
+  // |(1) Origin A                                   |
+  // |Policy: {"default-off": ["self", "Origin B"]}  |
+  // +-----------------------------------------------+
+  // Features should be enabled by the policy in frame 1 for origins A and B,
+  // and disabled for origin C.
+  std::unique_ptr<FeaturePolicy> policy1 =
+      CreateFromParentPolicy(nullptr, origin_a_);
+  policy1->SetHeaderPolicy({{{"default-off", false, {origin_a_, origin_b_}}}});
+  EXPECT_TRUE(
+      policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_));
+  EXPECT_TRUE(
+      policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_));
+  EXPECT_FALSE(
+      policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_));
+}
+
+}  // namespace content
diff --git a/content/common/service_manager/child_connection.cc b/content/common/service_manager/child_connection.cc
index 58cca53..42faac05 100644
--- a/content/common/service_manager/child_connection.cc
+++ b/content/common/service_manager/child_connection.cc
@@ -123,20 +123,16 @@
 ChildConnection::ChildConnection(
     const std::string& service_name,
     const std::string& instance_id,
-    const std::string& child_token,
+    mojo::edk::PendingProcessConnection* process_connection,
     service_manager::Connector* connector,
     scoped_refptr<base::SequencedTaskRunner> io_task_runner)
-    : child_token_(child_token),
-      context_(new IOThreadContext),
+    : context_(new IOThreadContext),
       child_identity_(service_name,
                       service_manager::mojom::kInheritUserID,
                       instance_id),
-      service_token_(mojo::edk::GenerateRandomToken()),
       weak_factory_(this) {
-  mojo::ScopedMessagePipeHandle service_pipe =
-      mojo::edk::CreateParentMessagePipe(service_token_, child_token_);
-
-  context_->Initialize(child_identity_, connector, std::move(service_pipe),
+  context_->Initialize(child_identity_, connector,
+                       process_connection->CreateMessagePipe(&service_token_),
                        io_task_runner);
   remote_interfaces_.Forward(
       base::Bind(&CallBinderOnTaskRunner,
@@ -146,14 +142,6 @@
 
 ChildConnection::~ChildConnection() {
   context_->ShutDown();
-
-  if (process_handle_ == base::kNullProcessHandle) {
-    // The process handle was never set, so we have to assume the process was
-    // not successfully launched. Note that ChildProcessLauncher may also call
-    // call ChildProcessLaunchFailed for the same token, so this is (harmlessly)
-    // redundant in some cases.
-    mojo::edk::ChildProcessLaunchFailed(child_token_);
-  }
 }
 
 void ChildConnection::SetProcessHandle(base::ProcessHandle handle) {
diff --git a/content/common/service_manager/child_connection.h b/content/common/service_manager/child_connection.h
index 1e34ac0..01ece56 100644
--- a/content/common/service_manager/child_connection.h
+++ b/content/common/service_manager/child_connection.h
@@ -14,6 +14,7 @@
 #include "base/process/process_handle.h"
 #include "base/sequenced_task_runner.h"
 #include "content/common/content_export.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "services/service_manager/public/cpp/identity.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "services/service_manager/public/interfaces/connector.mojom.h"
@@ -35,7 +36,7 @@
   // connector to use to establish the connection.
   ChildConnection(const std::string& name,
                   const std::string& instance_id,
-                  const std::string& child_token,
+                  mojo::edk::PendingProcessConnection* process_connection,
                   service_manager::Connector* connector,
                   scoped_refptr<base::SequencedTaskRunner> io_task_runner);
   ~ChildConnection();
@@ -61,10 +62,9 @@
  private:
   class IOThreadContext;
 
-  const std::string child_token_;
   scoped_refptr<IOThreadContext> context_;
   service_manager::Identity child_identity_;
-  const std::string service_token_;
+  std::string service_token_;
   base::ProcessHandle process_handle_ = base::kNullProcessHandle;
 
   service_manager::InterfaceProvider remote_interfaces_;
diff --git a/content/common/service_manager/service_manager_connection_impl.cc b/content/common/service_manager/service_manager_connection_impl.cc
index 4e511907..26f75d97 100644
--- a/content/common/service_manager/service_manager_connection_impl.cc
+++ b/content/common/service_manager/service_manager_connection_impl.cc
@@ -213,11 +213,10 @@
   void RemoveConnectionFilterOnIOThread(int filter_id) {
     base::AutoLock lock(lock_);
     auto it = connection_filters_.find(filter_id);
-    // TODO(crbug.com/687247): This DCHECK is hit when the browser is shut down
-    // by the service manager (e.g. in response to an ash crash under mash).
-    // Figure out why.
-    DCHECK(it != connection_filters_.end());
-    connection_filters_.erase(it);
+    // During shutdown the connection filters might have been cleared already
+    // by ClearConnectionFiltersOnIOThread() above, so this id might not exist.
+    if (it != connection_filters_.end())
+      connection_filters_.erase(it);
   }
 
   void OnBrowserConnectionLost() {
diff --git a/content/common/site_isolation_policy.cc b/content/common/site_isolation_policy.cc
index a1607c84..b3db97e 100644
--- a/content/common/site_isolation_policy.cc
+++ b/content/common/site_isolation_policy.cc
@@ -5,13 +5,26 @@
 #include "content/common/site_isolation_policy.h"
 
 #include "base/command_line.h"
+#include "base/feature_list.h"
+#include "content/public/common/content_client.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 
 namespace content {
 
 // static
 bool SiteIsolationPolicy::AreCrossProcessFramesPossible() {
+// Before turning this on for Android, input event routing needs to be
+// completed there, and perf regressions in https://crbug.com/690229 need to be
+// investigated.
+#if defined(OS_ANDROID)
+  return UseDedicatedProcessesForAllSites() ||
+         IsTopDocumentIsolationEnabled() ||
+         GetContentClient()->IsSupplementarySiteIsolationModeEnabled() ||
+         base::FeatureList::IsEnabled(::features::kGuestViewCrossProcessFrames);
+#else
   return true;
+#endif
 }
 
 // static
diff --git a/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java b/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
index 7df71bb..e6a8443 100644
--- a/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
+++ b/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
@@ -362,48 +362,6 @@
         }
     }
 
-    /**
-     * Called from native code to share a surface texture with another child process.
-     * Through using the callback object the browser is used as a proxy to route the
-     * call to the correct process.
-     *
-     * @param pid Process handle of the child process to share the SurfaceTexture with.
-     * @param surfaceObject The Surface or SurfaceTexture to share with the other child process.
-     * @param primaryID Used to route the call to the correct client instance.
-     * @param secondaryID Used to route the call to the correct client instance.
-     */
-    @SuppressWarnings("unused")
-    @CalledByNative
-    private void establishSurfaceTexturePeer(
-            int pid, Object surfaceObject, int primaryID, int secondaryID) {
-        if (mCallback == null) {
-            Log.e(TAG, "No callback interface has been provided.");
-            return;
-        }
-
-        Surface surface = null;
-        boolean needRelease = false;
-        if (surfaceObject instanceof Surface) {
-            surface = (Surface) surfaceObject;
-        } else if (surfaceObject instanceof SurfaceTexture) {
-            surface = new Surface((SurfaceTexture) surfaceObject);
-            needRelease = true;
-        } else {
-            Log.e(TAG, "Not a valid surfaceObject: %s", surfaceObject);
-            return;
-        }
-        try {
-            mCallback.establishSurfacePeer(pid, surface, primaryID, secondaryID);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Unable to call establishSurfaceTexturePeer: %s", e);
-            return;
-        } finally {
-            if (needRelease) {
-                surface.release();
-            }
-        }
-    }
-
     @SuppressWarnings("unused")
     @CalledByNative
     private void forwardSurfaceTextureForSurfaceRequest(
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
index 9b7d6b2..1a8996c8 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -847,25 +847,6 @@
     private static IChildProcessCallback createCallback(
             final int childProcessId, final int callbackType) {
         return new IChildProcessCallback.Stub() {
-            /**
-             * This is called by the remote service regularly to tell us about new values. Note that
-             * IPC calls are dispatched through a thread pool running in each process, so the code
-             * executing here will NOT be running in our main thread -- so, to update the UI, we
-             * need to use a Handler.
-             */
-            @Override
-            public void establishSurfacePeer(
-                    int pid, Surface surface, int primaryID, int secondaryID) {
-                // Do not allow a malicious renderer to connect to a producer. This is only used
-                // from stream textures managed by the GPU process.
-                if (callbackType != CALLBACK_FOR_GPU_PROCESS) {
-                    Log.e(TAG, "Illegal callback for non-GPU process.");
-                    return;
-                }
-
-                nativeEstablishSurfacePeer(pid, surface, primaryID, secondaryID);
-            }
-
             @Override
             public void forwardSurfaceForSurfaceRequest(
                     UnguessableToken requestToken, Surface surface) {
@@ -998,8 +979,6 @@
     }
 
     private static native void nativeOnChildProcessStarted(long clientContext, int pid);
-    private static native void nativeEstablishSurfacePeer(
-            int pid, Surface surface, int primaryID, int secondaryID);
     private static native void nativeCompleteScopedSurfaceRequest(
             UnguessableToken requestToken, Surface surface);
     private static native boolean nativeIsSingleProcess();
diff --git a/content/public/android/java/src/org/chromium/content/common/IChildProcessCallback.aidl b/content/public/android/java/src/org/chromium/content/common/IChildProcessCallback.aidl
index 85bebb93..4285e3d9 100644
--- a/content/public/android/java/src/org/chromium/content/common/IChildProcessCallback.aidl
+++ b/content/public/android/java/src/org/chromium/content/common/IChildProcessCallback.aidl
@@ -9,10 +9,6 @@
 
 interface IChildProcessCallback {
 
-  // Conduit to pass a Surface from the sandboxed renderer to the plugin.
-  void establishSurfacePeer(
-      int pid, in Surface surface, int primaryID, int secondaryID);
-
   void forwardSurfaceForSurfaceRequest(
       in UnguessableToken requestToken, in Surface surface);
 
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn
index 9e84aa7..9980e59 100644
--- a/content/public/common/BUILD.gn
+++ b/content/public/common/BUILD.gn
@@ -248,6 +248,7 @@
     ":service_names",
     "//content/common",
     "//content/public/common:interfaces",
+    "//mojo/edk/system",
     "//mojo/public/cpp/bindings",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/interfaces",
diff --git a/content/public/common/child_process_host.h b/content/public/common/child_process_host.h
index c82774e..6a541cb 100644
--- a/content/public/common/child_process_host.h
+++ b/content/public/common/child_process_host.h
@@ -11,6 +11,7 @@
 #include "build/build_config.h"
 #include "content/common/content_export.h"
 #include "ipc/ipc_channel_proxy.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 
 namespace base {
 class FilePath;
@@ -85,7 +86,8 @@
   //
   // DEPRECATED: Don't use this. Instead implement GetRemoteInterfaces() in the
   // delegate and use the CreateChannelMojo() version below.
-  virtual std::string CreateChannelMojo(const std::string& child_token) = 0;
+  virtual std::string CreateChannelMojo(
+      mojo::edk::PendingProcessConnection* connection) = 0;
 
   // Creates the IPC channel over a Mojo message pipe. The pipe connection is
   // brokered through the Service Manager like any other service connection.
diff --git a/content/public/common/window_container_type.cc b/content/public/common/window_container_type.cc
index 265e371..1cd71e6d 100644
--- a/content/public/common/window_container_type.cc
+++ b/content/public/common/window_container_type.cc
@@ -7,16 +7,6 @@
 #include <stddef.h>
 
 #include "base/strings/string_util.h"
-#include "third_party/WebKit/public/platform/WebString.h"
-#include "third_party/WebKit/public/platform/WebVector.h"
-#include "third_party/WebKit/public/web/WebWindowFeatures.h"
-
-namespace {
-
-const char kBackground[] = "background";
-const char kPersistent[] = "persistent";
-
-}  // namespace
 
 const WindowContainerType WINDOW_CONTAINER_TYPE_NORMAL =
     content::mojom::WindowContainerType::NORMAL;
@@ -24,29 +14,3 @@
     content::mojom::WindowContainerType::BACKGROUND;
 const WindowContainerType WINDOW_CONTAINER_TYPE_PERSISTENT =
     content::mojom::WindowContainerType::PERSISTENT;
-
-WindowContainerType WindowFeaturesToContainerType(
-    const blink::WebWindowFeatures& window_features) {
-  bool background = false;
-  bool persistent = false;
-
-  for (size_t i = 0; i < window_features.additionalFeatures.size(); ++i) {
-    blink::WebString feature = window_features.additionalFeatures[i];
-    if (feature.containsOnlyASCII()) {
-      std::string featureASCII = feature.ascii();
-      if (base::LowerCaseEqualsASCII(featureASCII, kBackground))
-        background = true;
-      else if (base::LowerCaseEqualsASCII(featureASCII, kPersistent))
-        persistent = true;
-    }
-  }
-
-  if (background) {
-    if (persistent)
-      return WINDOW_CONTAINER_TYPE_PERSISTENT;
-    else
-      return WINDOW_CONTAINER_TYPE_BACKGROUND;
-  } else {
-    return WINDOW_CONTAINER_TYPE_NORMAL;
-  }
-}
diff --git a/content/public/common/window_container_type.h b/content/public/common/window_container_type.h
index 06f0267..99d2b46 100644
--- a/content/public/common/window_container_type.h
+++ b/content/public/common/window_container_type.h
@@ -8,12 +8,6 @@
 #include "content/common/content_export.h"
 #include "content/public/common/window_container_type.mojom.h"
 
-namespace blink {
-
-struct WebWindowFeatures;
-
-}
-
 using WindowContainerType = content::mojom::WindowContainerType;
 
 // TODO(rockot): Remove these duplicate definitions by updating all references
@@ -26,8 +20,4 @@
 extern const WindowContainerType CONTENT_EXPORT
 WINDOW_CONTAINER_TYPE_PERSISTENT;
 
-// Conversion function:
-WindowContainerType WindowFeaturesToContainerType(
-    const blink::WebWindowFeatures& window_features);
-
 #endif  // CONTENT_PUBLIC_COMMON_WINDOW_CONTAINER_TYPE_H_
diff --git a/content/renderer/gpu/stream_texture_host_android.cc b/content/renderer/gpu/stream_texture_host_android.cc
index 120a472..f9f2036 100644
--- a/content/renderer/gpu/stream_texture_host_android.cc
+++ b/content/renderer/gpu/stream_texture_host_android.cc
@@ -58,13 +58,6 @@
     listener_->OnFrameAvailable();
 }
 
-void StreamTextureHost::EstablishPeer(int player_id, int frame_id) {
-  if (channel_) {
-    channel_->Send(
-        new GpuStreamTextureMsg_EstablishPeer(route_id_, frame_id, player_id));
-  }
-}
-
 void StreamTextureHost::SetStreamTextureSize(const gfx::Size& size) {
   if (channel_)
     channel_->Send(new GpuStreamTextureMsg_SetSize(route_id_, size));
diff --git a/content/renderer/gpu/stream_texture_host_android.h b/content/renderer/gpu/stream_texture_host_android.h
index 80eb463..51082d8f 100644
--- a/content/renderer/gpu/stream_texture_host_android.h
+++ b/content/renderer/gpu/stream_texture_host_android.h
@@ -9,7 +9,6 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "gpu/ipc/common/android/surface_texture_peer.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_message.h"
 
@@ -49,7 +48,6 @@
   bool OnMessageReceived(const IPC::Message& message) override;
   void OnChannelError() override;
 
-  void EstablishPeer(int player_id, int frame_id);
   void SetStreamTextureSize(const gfx::Size& size);
   void ForwardStreamTextureForSurfaceRequest(
       const base::UnguessableToken& request_token);
diff --git a/content/renderer/media/android/stream_texture_factory.cc b/content/renderer/media/android/stream_texture_factory.cc
index 57fff3d..b875954 100644
--- a/content/renderer/media/android/stream_texture_factory.cc
+++ b/content/renderer/media/android/stream_texture_factory.cc
@@ -68,10 +68,6 @@
     received_frame_cb_.Run();
 }
 
-void StreamTextureProxy::EstablishPeer(int player_id, int frame_id) {
-  host_->EstablishPeer(player_id, frame_id);
-}
-
 void StreamTextureProxy::SetStreamTextureSize(const gfx::Size& size) {
   host_->SetStreamTextureSize(size);
 }
diff --git a/content/renderer/media/android/stream_texture_factory.h b/content/renderer/media/android/stream_texture_factory.h
index 1d90785..41870332 100644
--- a/content/renderer/media/android/stream_texture_factory.h
+++ b/content/renderer/media/android/stream_texture_factory.h
@@ -53,12 +53,6 @@
   // Set the streamTexture size.
   void SetStreamTextureSize(const gfx::Size& size);
 
-  // Send an IPC message to the browser process to request a java surface
-  // object for the given route_id. After the the surface is created,
-  // it will be passed back to the WebMediaPlayerAndroid object identified by
-  // the player_id.
-  void EstablishPeer(int player_id, int frame_id);
-
   // Sends an IPC to the GPU process.
   // Asks the StreamTexture to forward its SurfaceTexture to the
   // ScopedSurfaceRequestManager, using the gpu::ScopedSurfaceRequestConduit.
diff --git a/content/renderer/mus/renderer_window_tree_client.cc b/content/renderer/mus/renderer_window_tree_client.cc
index a6dec993..0e9f0b64 100644
--- a/content/renderer/mus/renderer_window_tree_client.cc
+++ b/content/renderer/mus/renderer_window_tree_client.cc
@@ -165,6 +165,7 @@
 void RendererWindowTreeClient::OnWindowInputEvent(
     uint32_t event_id,
     ui::Id window_id,
+    int64_t display_id,
     std::unique_ptr<ui::Event> event,
     bool matches_pointer_watcher) {
   NOTREACHED();
@@ -172,7 +173,8 @@
 
 void RendererWindowTreeClient::OnPointerEventObserved(
     std::unique_ptr<ui::Event> event,
-    uint32_t window_id) {
+    uint32_t window_id,
+    int64_t display_id) {
   NOTREACHED();
 }
 
diff --git a/content/renderer/mus/renderer_window_tree_client.h b/content/renderer/mus/renderer_window_tree_client.h
index b1615e5..48fb20e 100644
--- a/content/renderer/mus/renderer_window_tree_client.h
+++ b/content/renderer/mus/renderer_window_tree_client.h
@@ -105,10 +105,12 @@
       const base::Optional<std::vector<uint8_t>>& new_data) override;
   void OnWindowInputEvent(uint32_t event_id,
                           ui::Id window_id,
+                          int64_t display_id,
                           std::unique_ptr<ui::Event> event,
                           bool matches_pointer_watcher) override;
   void OnPointerEventObserved(std::unique_ptr<ui::Event> event,
-                              uint32_t window_id) override;
+                              uint32_t window_id,
+                              int64_t display_id) override;
   void OnWindowFocused(ui::Id focused_window_id) override;
   void OnWindowPredefinedCursorChanged(ui::Id window_id,
                                        ui::mojom::Cursor cursor) override;
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc
index af28029..6331ece 100644
--- a/content/renderer/render_thread_impl_browsertest.cc
+++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -44,6 +44,7 @@
 #include "ipc/ipc.mojom.h"
 #include "ipc/ipc_channel_mojo.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/scheduler/renderer/renderer_scheduler.h"
 #include "ui/gfx/buffer_format_util.h"
@@ -179,8 +180,9 @@
 
     InitializeMojo();
     shell_context_.reset(new TestServiceManagerContext);
+    mojo::edk::PendingProcessConnection process_connection;
     child_connection_.reset(new ChildConnection(
-        mojom::kRendererServiceName, "test", mojo::edk::GenerateRandomToken(),
+        mojom::kRendererServiceName, "test", &process_connection,
         ServiceManagerConnection::GetForProcess()->GetConnector(),
         io_task_runner));
 
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 0788677..b5e2741 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -531,6 +531,37 @@
   ui::LatencyInfo latency_info_;
 };
 
+const char kWindowFeatureBackground[] = "background";
+const char kWindowFeaturePersistent[] = "persistent";
+
+WindowContainerType WindowFeaturesToContainerType(
+    const blink::WebWindowFeatures& window_features) {
+  bool background = false;
+  bool persistent = false;
+
+  for (size_t i = 0; i < window_features.additionalFeatures.size(); ++i) {
+    blink::WebString feature = window_features.additionalFeatures[i];
+    if (feature.containsOnlyASCII()) {
+      std::string featureASCII = feature.ascii();
+      if (base::LowerCaseEqualsASCII(featureASCII, kWindowFeatureBackground)) {
+        background = true;
+      } else if (base::LowerCaseEqualsASCII(featureASCII,
+                                            kWindowFeaturePersistent)) {
+        persistent = true;
+      }
+    }
+  }
+
+  if (background) {
+    if (persistent)
+      return WINDOW_CONTAINER_TYPE_PERSISTENT;
+    else
+      return WINDOW_CONTAINER_TYPE_BACKGROUND;
+  } else {
+    return WINDOW_CONTAINER_TYPE_NORMAL;
+  }
+}
+
 }  // namespace
 
 RenderViewImpl::RenderViewImpl(CompositorDependencies* compositor_deps,
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 4c248de..56837a4 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1317,6 +1317,7 @@
     "../common/database_connections_unittest.cc",
     "../common/database_identifier_unittest.cc",
     "../common/dom_storage/dom_storage_map_unittest.cc",
+    "../common/feature_policy/feature_policy_unittest.cc",
     "../common/fileapi/file_system_util_unittest.cc",
     "../common/host_shared_bitmap_manager_unittest.cc",
     "../common/indexed_db/indexed_db_key_unittest.cc",
@@ -1640,6 +1641,9 @@
     if (use_aura) {
       sources += [ "../browser/media/capture/cursor_renderer_aura_unittest.cc" ]
     }
+    if (is_mac) {
+      sources += [ "../browser/media/capture/cursor_renderer_mac_unittest.mm" ]
+    }
     if (is_chromeos) {
       sources +=
           [ "../browser/media/capture/desktop_capture_device_aura_unittest.cc" ]
diff --git a/content/test/content_test_suite.cc b/content/test/content_test_suite.cc
index 734c5b0..ab0f2b5 100644
--- a/content/test/content_test_suite.cc
+++ b/content/test/content_test_suite.cc
@@ -95,9 +95,6 @@
   testing::TestEventListeners& listeners =
       testing::UnitTest::GetInstance()->listeners();
   listeners.Append(new TestInitializationListener);
-#if defined(OS_ANDROID)
-  content::BrowserMediaPlayerManager::InitSurfaceTexturePeer();
-#endif
 }
 
 }  // namespace content
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py
index e335b3ee..c59911e 100644
--- a/content/test/gpu/gpu_tests/pixel_expectations.py
+++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -36,7 +36,7 @@
 
     self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker',
               ['mac', ('nvidia', 0xfe9)], bug=652931)
-    self.Flaky('Pixel_CSSFilterEffects',
+    self.Fail('Pixel_CSSFilterEffects',
         ['mac', ('nvidia', 0xfe9)], bug=690277)
 
     # TODO(kbr): flakily timing out on this configuration.
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
index f613d150..87ece49f 100644
--- a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
@@ -590,20 +590,10 @@
     # Nexus 9
     self.Fail('deqp/data/gles2/shaders/functions.html',
         ['android', 'nvidia'], bug=478572)
-    self.Skip('conformance/extensions/oes-texture-float-with-video.html',
-        ['android', 'nvidia'], bug=499555) # flaky
     self.Fail('conformance/glsl/bugs/multiplication-assignment.html',
         ['android', 'nvidia'], bug=606096)
-    self.Fail('conformance/glsl/constructors/glsl-construct-mat2.html',
-        ['android', 'nvidia'], bug=606096)
-    self.Fail('conformance/glsl/constructors/glsl-construct-mat3.html',
-        ['android', 'nvidia'], bug=606096)
-    self.Fail('conformance/glsl/constructors/glsl-construct-mat4.html',
-        ['android', 'nvidia'], bug=606096)
     self.Fail('WebglExtension_WEBGL_compressed_texture_atc',
         ['android', ('nvidia', 'NVIDIA Tegra')])
-    self.Fail('deqp/data/gles2/shaders/conversions.html',
-        ['android', ('nvidia', 'NVIDIA Tegra')], bug=478572)
 
     # Pixel C
     self.Fail('conformance/glsl/bugs/constant-precision-qualifier.html',
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn
index 396041e..12a0794e 100644
--- a/gpu/ipc/common/BUILD.gn
+++ b/gpu/ipc/common/BUILD.gn
@@ -106,8 +106,6 @@
     sources += [
       "android/scoped_surface_request_conduit.cc",
       "android/scoped_surface_request_conduit.h",
-      "android/surface_texture_peer.cc",
-      "android/surface_texture_peer.h",
     ]
   }
 
diff --git a/gpu/ipc/common/android/surface_texture_peer.cc b/gpu/ipc/common/android/surface_texture_peer.cc
deleted file mode 100644
index 397c5ba..0000000
--- a/gpu/ipc/common/android/surface_texture_peer.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "gpu/ipc/common/android/surface_texture_peer.h"
-
-#include "base/logging.h"
-
-namespace gpu {
-
-namespace {
-SurfaceTexturePeer* g_instance_ = nullptr;
-}  // namespace
-
-SurfaceTexturePeer::SurfaceTexturePeer() {}
-
-SurfaceTexturePeer::~SurfaceTexturePeer() {}
-
-// static
-SurfaceTexturePeer* SurfaceTexturePeer::GetInstance() {
-  DCHECK(g_instance_);
-  return g_instance_;
-}
-
-// static
-void SurfaceTexturePeer::InitInstance(SurfaceTexturePeer* instance) {
-  DCHECK(!g_instance_);
-  g_instance_ = instance;
-}
-
-}  // namespace gpu
diff --git a/gpu/ipc/common/android/surface_texture_peer.h b/gpu/ipc/common/android/surface_texture_peer.h
deleted file mode 100644
index bbfc78d0..0000000
--- a/gpu/ipc/common/android/surface_texture_peer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_
-#define GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_
-
-#include "base/macros.h"
-#include "base/process/process.h"
-#include "gpu/gpu_export.h"
-#include "ui/gl/android/surface_texture.h"
-
-namespace gpu {
-
-class GPU_EXPORT SurfaceTexturePeer {
- public:
-  static SurfaceTexturePeer* GetInstance();
-
-  static void InitInstance(SurfaceTexturePeer* instance);
-
-  // Establish the producer end for the given surface texture in another
-  // process.
-  virtual void EstablishSurfaceTexturePeer(
-      base::ProcessHandle pid,
-      scoped_refptr<gl::SurfaceTexture> surface_texture,
-      int primary_id,
-      int secondary_id) = 0;
-
- protected:
-  SurfaceTexturePeer();
-  virtual ~SurfaceTexturePeer();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SurfaceTexturePeer);
-};
-
-}  // namespace gpu
-
-#endif  // GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_
diff --git a/gpu/ipc/common/gpu_messages.h b/gpu/ipc/common/gpu_messages.h
index b1d6fdc4..f66974b 100644
--- a/gpu/ipc/common/gpu_messages.h
+++ b/gpu/ipc/common/gpu_messages.h
@@ -37,9 +37,7 @@
 #include "ui/gfx/swap_result.h"
 #include "url/ipc/url_param_traits.h"
 
-#if defined(OS_ANDROID)
-#include "gpu/ipc/common/android/surface_texture_peer.h"
-#elif defined(OS_MACOSX)
+#if defined(OS_MACOSX)
 #include "ui/base/cocoa/remote_layer_api.h"
 #include "ui/gfx/mac/io_surface.h"
 #endif
@@ -124,13 +122,6 @@
 
 #if defined(OS_ANDROID)
 //------------------------------------------------------------------------------
-// Stream Texture Messages
-// Tells the GPU process create and send the java surface texture object to
-// the renderer process through the binder thread.
-IPC_MESSAGE_ROUTED2(GpuStreamTextureMsg_EstablishPeer,
-                    int32_t, /* primary_id */
-                    int32_t /* secondary_id */)
-
 // Tells the StreamTexture to send its SurfaceTexture to the browser process,
 // via the ScopedSurfaceRequestConduit.
 IPC_MESSAGE_ROUTED1(GpuStreamTextureMsg_ForwardForSurfaceRequest,
diff --git a/gpu/ipc/service/stream_texture_android.cc b/gpu/ipc/service/stream_texture_android.cc
index d107005..173dab82 100644
--- a/gpu/ipc/service/stream_texture_android.cc
+++ b/gpu/ipc/service/stream_texture_android.cc
@@ -12,7 +12,6 @@
 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
 #include "gpu/command_buffer/service/texture_manager.h"
 #include "gpu/ipc/common/android/scoped_surface_request_conduit.h"
-#include "gpu/ipc/common/android/surface_texture_peer.h"
 #include "gpu/ipc/common/gpu_messages.h"
 #include "gpu/ipc/service/gpu_channel.h"
 #include "ui/gfx/geometry/size.h"
@@ -198,7 +197,6 @@
     IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_StartListening, OnStartListening)
     IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_ForwardForSurfaceRequest,
                         OnForwardForSurfaceRequest)
-    IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_EstablishPeer, OnEstablishPeer)
     IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_SetSize, OnSetSize)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
@@ -212,16 +210,6 @@
   has_listener_ = true;
 }
 
-void StreamTexture::OnEstablishPeer(int32_t primary_id, int32_t secondary_id) {
-  if (!owner_stub_)
-    return;
-
-  base::ProcessHandle process = owner_stub_->channel()->GetClientPID();
-
-  SurfaceTexturePeer::GetInstance()->EstablishSurfaceTexturePeer(
-      process, surface_texture_, primary_id, secondary_id);
-}
-
 void StreamTexture::OnForwardForSurfaceRequest(
     const base::UnguessableToken& request_token) {
   if (!owner_stub_)
diff --git a/gpu/ipc/service/stream_texture_android.h b/gpu/ipc/service/stream_texture_android.h
index b7ad291..d350c46 100644
--- a/gpu/ipc/service/stream_texture_android.h
+++ b/gpu/ipc/service/stream_texture_android.h
@@ -79,7 +79,6 @@
 
   // IPC message handlers:
   void OnStartListening();
-  void OnEstablishPeer(int32_t primary_id, int32_t secondary_id);
   void OnForwardForSurfaceRequest(const base::UnguessableToken& request_token);
   void OnSetSize(const gfx::Size& size) { size_ = size; }
 
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index 82ba1a2..93a5c48 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -25,6 +25,7 @@
   ]
   deps = [
     "//base",
+    "//components/browser_sync",
     "//components/crash/core/common",
     "//components/keyed_service/core",
     "//components/keyed_service/ios",
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h
index 365e8be..20ff345 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h
@@ -19,6 +19,7 @@
 #include "components/metrics/profiler/tracking_synchronizer_observer.h"
 #include "components/omnibox/browser/omnibox_event_global_tracker.h"
 #include "components/ukm/observers/history_delete_observer.h"
+#include "components/ukm/observers/sync_disable_observer.h"
 #include "ios/web/public/web_state/global_web_state_observer.h"
 
 class IOSChromeStabilityMetricsProvider;
@@ -45,6 +46,7 @@
     : public metrics::MetricsServiceClient,
       public metrics::TrackingSynchronizerObserver,
       public ukm::HistoryDeleteObserver,
+      public ukm::SyncDisableObserver,
       public web::GlobalWebStateObserver {
  public:
   ~IOSChromeMetricsServiceClient() override;
@@ -76,9 +78,12 @@
   base::string16 GetRegistryBackupKey() override;
   void OnRendererProcessCrash() override;
 
-  // ukm::HistoryDeleteObserver
+  // ukm::HistoryDeleteObserver:
   void OnHistoryDeleted() override;
 
+  // ukm::SyncDisableObserver:
+  void OnSyncPrefsChanged(bool must_purge) override;
+
   // web::GlobalWebStateObserver:
   void WebStateDidStartLoading(web::WebState* web_state) override;
   void WebStateDidStopLoading(web::WebState* web_state) override;
@@ -118,8 +123,8 @@
   // there was recent activity.
   void RegisterForNotifications();
 
-  // Register to observe history delete events on a browser state.
-  void RegisterForHistoryDeletions(ios::ChromeBrowserState* browser_state);
+  // Register to observe events on a browser state's services.
+  void RegisterForBrowserStateEvents(ios::ChromeBrowserState* browser_state);
 
   // Called when a tab is parented.
   void OnTabParented(web::WebState* web_state);
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
index 7cbd896..71d8b80 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -20,6 +20,7 @@
 #include "base/rand_util.h"
 #include "base/strings/string16.h"
 #include "base/threading/platform_thread.h"
+#include "components/browser_sync/profile_sync_service.h"
 #include "components/crash/core/common/crash_keys.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/keyed_service/core/service_access_type.h"
@@ -54,6 +55,7 @@
 #include "ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider.h"
 #include "ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h"
 #include "ios/chrome/browser/signin/ios_chrome_signin_status_metrics_provider_delegate.h"
+#include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
 #include "ios/chrome/browser/sync/ios_chrome_sync_client.h"
 #include "ios/chrome/browser/tab_parenting_global_observer.h"
 #include "ios/chrome/browser/tabs/tab_model_list.h"
@@ -327,16 +329,20 @@
           ->GetChromeBrowserStateManager()
           ->GetLoadedBrowserStates();
   for (ios::ChromeBrowserState* browser_state : loaded_browser_states) {
-    RegisterForHistoryDeletions(browser_state);
+    RegisterForBrowserStateEvents(browser_state);
   }
 }
 
-void IOSChromeMetricsServiceClient::RegisterForHistoryDeletions(
+void IOSChromeMetricsServiceClient::RegisterForBrowserStateEvents(
     ios::ChromeBrowserState* browser_state) {
   history::HistoryService* history_service =
       ios::HistoryServiceFactory::GetForBrowserState(
           browser_state, ServiceAccessType::IMPLICIT_ACCESS);
   ObserveServiceForDeletions(history_service);
+  browser_sync::ProfileSyncService* sync =
+      IOSChromeProfileSyncServiceFactory::GetInstance()->GetForBrowserState(
+          browser_state);
+  ObserveServiceForSyncDisables(static_cast<syncer::SyncService*>(sync));
 }
 
 void IOSChromeMetricsServiceClient::OnTabParented(web::WebState* web_state) {
@@ -357,3 +363,14 @@
   if (ukm_service_)
     ukm_service_->Purge();
 }
+
+void IOSChromeMetricsServiceClient::OnSyncPrefsChanged(bool must_purge) {
+  if (!ukm_service_)
+    return;
+  if (must_purge) {
+    ukm_service_->Purge();
+    ukm_service_->ResetClientId();
+  }
+  // Signal service manager to enable/disable UKM based on new state.
+  UpdateRunningServices();
+}
diff --git a/mojo/edk/embedder/BUILD.gn b/mojo/edk/embedder/BUILD.gn
index c652e517..b3fa007 100644
--- a/mojo/edk/embedder/BUILD.gn
+++ b/mojo/edk/embedder/BUILD.gn
@@ -12,6 +12,7 @@
     "named_platform_channel_pair.h",
     "named_platform_handle.h",
     "named_platform_handle_utils.h",
+    "pending_process_connection.h",
     "platform_channel_pair.h",
     "platform_handle.h",
     "platform_handle_utils.h",
@@ -39,6 +40,7 @@
     "embedder_internal.h",
     "entrypoints.cc",
     "entrypoints.h",
+    "pending_process_connection.cc",
     "scoped_ipc_support.cc",
     "scoped_ipc_support.h",
 
diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc
index 17cfe7d..d581e65 100644
--- a/mojo/edk/embedder/embedder.cc
+++ b/mojo/edk/embedder/embedder.cc
@@ -42,27 +42,6 @@
 void SetMaxMessageSize(size_t bytes) {
 }
 
-void ChildProcessLaunched(base::ProcessHandle child_process,
-                          ScopedPlatformHandle server_pipe,
-                          const std::string& child_token) {
-  ChildProcessLaunched(child_process, std::move(server_pipe),
-                       child_token, ProcessErrorCallback());
-}
-
-void ChildProcessLaunched(base::ProcessHandle child_process,
-                          ScopedPlatformHandle server_pipe,
-                          const std::string& child_token,
-                          const ProcessErrorCallback& process_error_callback) {
-  CHECK(internal::g_core);
-  internal::g_core->AddChild(child_process, std::move(server_pipe),
-                             child_token, process_error_callback);
-}
-
-void ChildProcessLaunchFailed(const std::string& child_token) {
-  CHECK(internal::g_core);
-  internal::g_core->ChildLaunchFailed(child_token);
-}
-
 void SetParentPipeHandle(ScopedPlatformHandle pipe) {
   CHECK(internal::g_core);
   internal::g_core->InitChild(std::move(pipe));
@@ -155,11 +134,6 @@
 }
 #endif
 
-ScopedMessagePipeHandle CreateParentMessagePipe(
-    const std::string& token, const std::string& child_token) {
-  return internal::g_core->CreateParentMessagePipe(token, child_token);
-}
-
 ScopedMessagePipeHandle CreateChildMessagePipe(const std::string& token) {
   return internal::g_core->CreateChildMessagePipe(token);
 }
diff --git a/mojo/edk/embedder/embedder.h b/mojo/edk/embedder/embedder.h
index b7ceaa92..97258e52 100644
--- a/mojo/edk/embedder/embedder.h
+++ b/mojo/edk/embedder/embedder.h
@@ -16,6 +16,7 @@
 #include "base/memory/shared_memory_handle.h"
 #include "base/process/process_handle.h"
 #include "base/task_runner.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
 #include "mojo/edk/system/system_impl_export.h"
 #include "mojo/public/cpp/system/message_pipe.h"
@@ -27,8 +28,6 @@
 namespace mojo {
 namespace edk {
 
-using ProcessErrorCallback = base::Callback<void(const std::string& error)>;
-
 // Basic configuration/initialization ------------------------------------------
 
 // |Init()| sets up the basic Mojo system environment, making the |Mojo...()|
@@ -38,30 +37,9 @@
 // Allows changing the default max message size. Must be called before Init.
 MOJO_SYSTEM_IMPL_EXPORT void SetMaxMessageSize(size_t bytes);
 
-// Called in the parent process for each child process that is launched.
-MOJO_SYSTEM_IMPL_EXPORT void ChildProcessLaunched(
-    base::ProcessHandle child_process,
-    ScopedPlatformHandle server_pipe,
-    const std::string& child_token);
-
-// Called in the parent process for each child process that is launched.
-// |process_error_callback| is called if the system becomes aware of some
-// internal error related to this process, e.g., if the system is notified of a
-// bad message from this process via the |MojoNotifyBadMessage()| API.
-MOJO_SYSTEM_IMPL_EXPORT void ChildProcessLaunched(
-    base::ProcessHandle child_process,
-    ScopedPlatformHandle server_pipe,
-    const std::string& child_token,
-    const ProcessErrorCallback& error_callback);
-
-// Called in the parent process when a child process fails to launch.
-// Exactly one of ChildProcessLaunched() or ChildProcessLaunchFailed() must be
-// called per child process launch attempt.
-MOJO_SYSTEM_IMPL_EXPORT void ChildProcessLaunchFailed(
-    const std::string& child_token);
-
-// Should be called as early as possible in the child process with the handle
-// that the parent received from ChildProcessLaunched.
+// Should be called as early as possible in a child process with a handle to the
+// other end of a pipe provided in the parent to
+// PendingProcessConnection::Connect.
 MOJO_SYSTEM_IMPL_EXPORT void SetParentPipeHandle(ScopedPlatformHandle pipe);
 
 // Same as above but extracts the pipe handle from the command line. See
@@ -170,25 +148,14 @@
     base::PortProvider* port_provider);
 #endif
 
-// Creates a message pipe from a token. A child embedder must also have this
-// token and call CreateChildMessagePipe() with it in order for the pipe to get
-// connected. |child_token| identifies the child process and should be the same
-// as the token passed into ChildProcessLaunched(). If they are different, the
-// returned message pipe will not be signaled of peer closure if the child
-// process dies before establishing connection to the pipe.
-MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
-CreateParentMessagePipe(const std::string& token,
-                        const std::string& child_token);
-
-// Creates a message pipe from a token in a child process. The parent must also
-// have this token and call CreateParentMessagePipe() with it in order for the
-// pipe to get connected.
+// Creates a message pipe from a token in a child process. This token must have
+// been acquired by a corresponding call to
+// PendingProcessConnection::CreateMessagePipe.
 MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
 CreateChildMessagePipe(const std::string& token);
 
-// Generates a random ASCII token string for use with CreateParentMessagePipe()
-// and CreateChildMessagePipe() above. The generated token is suitably random so
-// as to not have to worry about collisions with other generated tokens.
+// Generates a random ASCII token string for use with various APIs that expect
+// a globally unique token string.
 MOJO_SYSTEM_IMPL_EXPORT std::string GenerateRandomToken();
 
 // Sets system properties that can be read by the MojoGetProperty() API. See the
diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/embedder/embedder_unittest.cc
index f0fe440..2eb6beb 100644
--- a/mojo/edk/embedder/embedder_unittest.cc
+++ b/mojo/edk/embedder/embedder_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/files/file.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/shared_memory.h"
 #include "base/message_loop/message_loop.h"
 #include "base/path_service.h"
@@ -26,6 +27,7 @@
 #include "mojo/edk/embedder/embedder.h"
 #include "mojo/edk/embedder/named_platform_handle.h"
 #include "mojo/edk/embedder/named_platform_handle_utils.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/edk/embedder/test_embedder.h"
 #include "mojo/edk/system/test_utils.h"
@@ -189,13 +191,12 @@
 }
 
 TEST_F(EmbedderTest, PipeSetup) {
-  std::string child_token = GenerateRandomToken();
-  std::string pipe_token = GenerateRandomToken();
-
-  ScopedMessagePipeHandle parent_mp =
-      CreateParentMessagePipe(pipe_token, child_token);
-  ScopedMessagePipeHandle child_mp =
-      CreateChildMessagePipe(pipe_token);
+  // Ensures that a pending process connection's message pipe can be claimed by
+  // the host process itself.
+  PendingProcessConnection process;
+  std::string pipe_token;
+  ScopedMessagePipeHandle parent_mp = process.CreateMessagePipe(&pipe_token);
+  ScopedMessagePipeHandle child_mp = CreateChildMessagePipe(pipe_token);
 
   const std::string kHello = "hello";
   WriteMessage(parent_mp.get().value(), kHello);
@@ -206,13 +207,10 @@
 TEST_F(EmbedderTest, PipeSetup_LaunchDeath) {
   PlatformChannelPair pair;
 
-  std::string child_token = GenerateRandomToken();
-  std::string pipe_token = GenerateRandomToken();
-
-  ScopedMessagePipeHandle parent_mp =
-      CreateParentMessagePipe(pipe_token, child_token);
-  ChildProcessLaunched(base::GetCurrentProcessHandle(), pair.PassServerHandle(),
-                       child_token);
+  PendingProcessConnection process;
+  std::string pipe_token;
+  ScopedMessagePipeHandle parent_mp = process.CreateMessagePipe(&pipe_token);
+  process.Connect(base::GetCurrentProcessHandle(), pair.PassServerHandle());
 
   // Close the remote end, simulating child death before the child connects to
   // the reserved port.
@@ -227,13 +225,14 @@
 TEST_F(EmbedderTest, PipeSetup_LaunchFailure) {
   PlatformChannelPair pair;
 
-  std::string child_token = GenerateRandomToken();
-  std::string pipe_token = GenerateRandomToken();
+  auto process = base::MakeUnique<PendingProcessConnection>();
+  std::string pipe_token;
+  ScopedMessagePipeHandle parent_mp = process->CreateMessagePipe(&pipe_token);
 
-  ScopedMessagePipeHandle parent_mp =
-      CreateParentMessagePipe(pipe_token, child_token);
+  // Ensure that if a PendingProcessConnection goes away before Connect() is
+  // called, any message pipes associated with it detect peer closure.
+  process.reset();
 
-  ChildProcessLaunchFailed(child_token);
   EXPECT_EQ(MOJO_RESULT_OK, MojoWait(parent_mp.get().value(),
                                      MOJO_HANDLE_SIGNAL_PEER_CLOSED,
                                      MOJO_DEADLINE_INDEFINITE,
diff --git a/mojo/edk/embedder/named_platform_channel_pair.h b/mojo/edk/embedder/named_platform_channel_pair.h
index 71688861..5a83ae3 100644
--- a/mojo/edk/embedder/named_platform_channel_pair.h
+++ b/mojo/edk/embedder/named_platform_channel_pair.h
@@ -41,7 +41,7 @@
   ~NamedPlatformChannelPair();
 
   // Note: It is NOT acceptable to use this handle as a generic pipe channel. It
-  // MUST be passed to mojo::edk::ChildProcessLaunched() only.
+  // MUST be passed to PendingProcessConnection::Connect() only.
   ScopedPlatformHandle PassServerHandle();
 
   // To be called in the child process, after the parent process called
diff --git a/mojo/edk/embedder/pending_process_connection.cc b/mojo/edk/embedder/pending_process_connection.cc
new file mode 100644
index 0000000..8ab58727
--- /dev/null
+++ b/mojo/edk/embedder/pending_process_connection.cc
@@ -0,0 +1,50 @@
+// 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 "mojo/edk/embedder/pending_process_connection.h"
+
+#include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/embedder_internal.h"
+#include "mojo/edk/system/core.h"
+
+namespace mojo {
+namespace edk {
+
+PendingProcessConnection::PendingProcessConnection()
+    : process_token_(GenerateRandomToken()) {
+  DCHECK(internal::g_core);
+}
+
+PendingProcessConnection::~PendingProcessConnection() {
+  if (has_message_pipes_ && !connected_) {
+    DCHECK(internal::g_core);
+    internal::g_core->ChildLaunchFailed(process_token_);
+  }
+}
+
+ScopedMessagePipeHandle PendingProcessConnection::CreateMessagePipe(
+    std::string* token) {
+  has_message_pipes_ = true;
+  DCHECK(internal::g_core);
+  *token = GenerateRandomToken();
+  return internal::g_core->CreateParentMessagePipe(*token, process_token_);
+}
+
+void PendingProcessConnection::Connect(
+    base::ProcessHandle process,
+    ScopedPlatformHandle channel,
+    const ProcessErrorCallback& error_callback) {
+  // It's now safe to avoid cleanup in the destructor, as the lifetime of any
+  // associated resources is effectively bound to the |channel| passed to
+  // AddChild() below.
+  DCHECK(!connected_);
+  connected_ = true;
+
+  DCHECK(internal::g_core);
+  internal::g_core->AddChild(process, std::move(channel), process_token_,
+                             error_callback);
+}
+
+}  // namespace edk
+}  // namespace mojo
diff --git a/mojo/edk/embedder/pending_process_connection.h b/mojo/edk/embedder/pending_process_connection.h
new file mode 100644
index 0000000..1f5cad9
--- /dev/null
+++ b/mojo/edk/embedder/pending_process_connection.h
@@ -0,0 +1,123 @@
+// 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 MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
+#define MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
+
+#include <string>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/process/process_handle.h"
+#include "mojo/edk/embedder/scoped_platform_handle.h"
+#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace mojo {
+namespace edk {
+
+using ProcessErrorCallback = base::Callback<void(const std::string& error)>;
+
+// Represents a potential connection to an external process. Use this object
+// to make other processes reachable from this one via Mojo IPC. Typical usage
+// might look something like:
+//
+//     PendingProcessConnection connection;
+//
+//     std::string pipe_token;
+//     ScopedMessagePipeHandle pipe = connection.CreateMessagePipe(&pipe_token);
+//
+//     // New pipes to the process are fully functional and can be used right
+//     // away, even if the process doesn't exist yet.
+//     GoDoSomethingInteresting(std::move(pipe));
+//
+//     ScopedPlatformChannelPair channel;
+//
+//     // Give the pipe token to the child process via command-line.
+//     child_command_line.AppendSwitchASCII("yer-pipe", pipe_token);
+//
+//     // Magic child process launcher which gives one end of the pipe to the
+//     // new process.
+//     LaunchProcess(child_command_line, channel.PassClientHandle());
+//
+//     // Some time later...
+//     connection.Connect(new_process, channel.PassServerHandle());
+//
+// If at any point during the above process, |connection| is destroyed before
+// Connect() can be called, |pipe| will imminently behave as if its peer has
+// been closed.
+//
+// Otherwise, if the remote process in this example eventually calls:
+//
+//     mojo::edk::SetParentPipeHandle(std::move(client_channel_handle));
+//
+//     std::string token = command_line.GetSwitchValueASCII("yer-pipe");
+//     ScopedMessagePipeHandle pipe = mojo::edk::CreateChildMessagePipe(token);
+//
+// it will be connected to this process, and its |pipe| will be connected to
+// this process's |pipe|.
+//
+// If the remote process exits or otherwise closes its client channel handle
+// before calling CreateChildMessagePipe for a given message pipe token,
+// this process's end of the corresponding message pipe will imminently behave
+// as if its peer has been closed.
+//
+class MOJO_SYSTEM_IMPL_EXPORT PendingProcessConnection {
+ public:
+  PendingProcessConnection();
+  ~PendingProcessConnection();
+
+  // Creates a message pipe associated with a new globally unique string value
+  // which will be placed in |*token|.
+  //
+  // The other end of the new pipe is obtainable in the remote process (or in
+  // this process, to facilitate "single-process mode" in some applications) by
+  // passing the new |*token| value to mojo::edk::CreateChildMessagePipe. It's
+  // the caller's responsibility to communicate the value of |*token| to the
+  // remote process by any means available, e.g. a command-line argument on
+  // process launch, or some other out-of-band communication channel for an
+  // existing process.
+  //
+  // NOTES: This may be called any number of times to create multiple message
+  // pipes to the same remote process. This call ALWAYS succeeds, returning
+  // a valid message pipe handle and populating |*token| with a new unique
+  // string value.
+  ScopedMessagePipeHandle CreateMessagePipe(std::string* token);
+
+  // Connects to the process. This must be called at most once, with the process
+  // handle in |process|.
+  //
+  // |channel| is the platform handle of an OS pipe which can be used to
+  // communicate with the connected process. The other end of that pipe must
+  // ultimately be passed to mojo::edk::SetParentPipeHandle in the remote
+  // process, and getting that end of the pipe into the other process is the
+  // embedder's responsibility.
+  //
+  // If this method is not called by the time the PendingProcessConnection is
+  // destroyed, it's assumed that the process is unavailable (e.g. process
+  // launch failed or the process has otherwise been terminated early), and
+  // any associated resources, such as remote endpoints of messages pipes
+  // created by CreateMessagePipe above) will be cleaned up at that time.
+  void Connect(
+      base::ProcessHandle process,
+      ScopedPlatformHandle channel,
+      const ProcessErrorCallback& error_callback = ProcessErrorCallback());
+
+ private:
+  // A GUID representing a potential new process to be connected to this one.
+  const std::string process_token_;
+
+  // Indicates whether this object has been used to create new message pipes.
+  bool has_message_pipes_ = false;
+
+  // Indicates whether Connect() has been called yet.
+  bool connected_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(PendingProcessConnection);
+};
+
+}  // namespace edk
+}  // namespace mojo
+
+#endif  // MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
diff --git a/mojo/edk/test/multiprocess_test_helper.cc b/mojo/edk/test/multiprocess_test_helper.cc
index f5f9ce61a1..8eaccf0 100644
--- a/mojo/edk/test/multiprocess_test_helper.cc
+++ b/mojo/edk/test/multiprocess_test_helper.cc
@@ -26,6 +26,7 @@
 #include "mojo/edk/embedder/embedder.h"
 #include "mojo/edk/embedder/named_platform_handle.h"
 #include "mojo/edk/embedder/named_platform_handle_utils.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -114,11 +115,6 @@
     command_line.AppendSwitchNative(kMojoNamedPipeName, named_pipe.name);
   }
 
-  std::string pipe_token = mojo::edk::GenerateRandomToken();
-  if (launch_type == LaunchType::CHILD ||
-      launch_type == LaunchType::NAMED_CHILD)
-    command_line.AppendSwitchASCII(kMojoPrimordialPipeToken, pipe_token);
-
   if (!switch_string.empty()) {
     CHECK(!command_line.HasSwitch(switch_string));
     if (!switch_value.empty())
@@ -151,11 +147,13 @@
     server_handle = CreateServerHandle(named_pipe);
   }
 
+  PendingProcessConnection process;
   ScopedMessagePipeHandle pipe;
-  std::string child_token = mojo::edk::GenerateRandomToken();
   if (launch_type == LaunchType::CHILD ||
       launch_type == LaunchType::NAMED_CHILD) {
-    pipe = CreateParentMessagePipe(pipe_token, child_token);
+    std::string pipe_token;
+    pipe = process.CreateMessagePipe(&pipe_token);
+    command_line.AppendSwitchASCII(kMojoPrimordialPipeToken, pipe_token);
   } else if (launch_type == LaunchType::PEER ||
              launch_type == LaunchType::NAMED_PEER) {
     peer_token_ = mojo::edk::GenerateRandomToken();
@@ -170,8 +168,8 @@
   if (launch_type == LaunchType::CHILD ||
       launch_type == LaunchType::NAMED_CHILD) {
     DCHECK(server_handle.is_valid());
-    ChildProcessLaunched(test_child_.Handle(), std::move(server_handle),
-                         child_token, process_error_callback_);
+    process.Connect(test_child_.Handle(), std::move(server_handle),
+                    process_error_callback_);
   }
 
   CHECK(test_child_.IsValid());
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc
index 2d8c53e..e188c4b 100644
--- a/mojo/public/cpp/bindings/lib/multiplex_router.cc
+++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc
@@ -174,26 +174,23 @@
 
   void OnHandleReady(MojoResult result) {
     DCHECK(task_runner_->BelongsToCurrentThread());
-    scoped_refptr<InterfaceEndpoint> self_protector(this);
     scoped_refptr<MultiplexRouter> router_protector(router_);
 
     // Because we never close |sync_message_event_{sender,receiver}_| before
     // destruction or set a deadline, |result| should always be MOJO_RESULT_OK.
     DCHECK_EQ(MOJO_RESULT_OK, result);
-    bool reset_sync_watcher = false;
-    {
-      MayAutoLock locker(router_->lock_.get());
 
-      bool more_to_process = router_->ProcessFirstSyncMessageForEndpoint(id_);
+    MayAutoLock locker(router_->lock_.get());
+    scoped_refptr<InterfaceEndpoint> self_protector(this);
 
-      if (!more_to_process)
-        ResetSyncMessageSignal();
+    bool more_to_process = router_->ProcessFirstSyncMessageForEndpoint(id_);
 
-      // Currently there are no queued sync messages and the peer has closed so
-      // there won't be incoming sync messages in the future.
-      reset_sync_watcher = !more_to_process && peer_closed_;
-    }
-    if (reset_sync_watcher) {
+    if (!more_to_process)
+      ResetSyncMessageSignal();
+
+    // Currently there are no queued sync messages and the peer has closed so
+    // there won't be incoming sync messages in the future.
+    if (!more_to_process && peer_closed_) {
       // If a SyncWatch() call (or multiple ones) of this interface endpoint is
       // on the call stack, resetting the sync watcher will allow it to exit
       // when the call stack unwinds to that frame.
diff --git a/net/base/host_port_pair.cc b/net/base/host_port_pair.cc
index 68fb0b6..b40cb7c 100644
--- a/net/base/host_port_pair.cc
+++ b/net/base/host_port_pair.cc
@@ -49,10 +49,6 @@
   return host_port_pair;
 }
 
-size_t HostPortPair::EstimateMemoryUsage(const HostPortPair& pair) {
-  return base::trace_event::EstimateMemoryUsage(pair.host());
-}
-
 std::string HostPortPair::ToString() const {
   std::string ret(HostForURL());
   ret += ':';
@@ -79,4 +75,8 @@
   return host_;
 }
 
+size_t HostPortPair::EstimateMemoryUsage() const {
+  return base::trace_event::EstimateMemoryUsage(host_);
+}
+
 }  // namespace net
diff --git a/net/base/host_port_pair.h b/net/base/host_port_pair.h
index ebb2dd1..a5ee6bd 100644
--- a/net/base/host_port_pair.h
+++ b/net/base/host_port_pair.h
@@ -34,9 +34,6 @@
   // ToString().
   static HostPortPair FromString(const std::string& str);
 
-  // Returns the estimate of dynamically allocated memory in bytes.
-  static size_t EstimateMemoryUsage(const HostPortPair& pair);
-
   // TODO(willchan): Define a functor instead.
   // Comparator function so this can be placed in a std::map.
   bool operator<(const HostPortPair& other) const {
@@ -71,6 +68,9 @@
   // Returns |host_|, adding IPv6 brackets if needed.
   std::string HostForURL() const;
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   // If |host_| represents an IPv6 address, this string will not contain
   // brackets around the address.
diff --git a/net/http2/hpack/decoder/hpack_decoder_string_buffer.cc b/net/http2/hpack/decoder/hpack_decoder_string_buffer.cc
index e38f42db..e00c155b 100644
--- a/net/http2/hpack/decoder/hpack_decoder_string_buffer.cc
+++ b/net/http2/hpack/decoder/hpack_decoder_string_buffer.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "base/trace_event/memory_usage_estimator.h"
 #include "net/http2/tools/http2_bug_tracker.h"
 
 using base::StringPiece;
@@ -224,6 +225,10 @@
   out << "}";
 }
 
+size_t HpackDecoderStringBuffer::EstimateMemoryUsage() const {
+  return base::trace_event::EstimateMemoryUsage(buffer_);
+}
+
 std::ostream& operator<<(std::ostream& out, const HpackDecoderStringBuffer& v) {
   v.OutputDebugStringTo(out);
   return out;
diff --git a/net/http2/hpack/decoder/hpack_decoder_string_buffer.h b/net/http2/hpack/decoder/hpack_decoder_string_buffer.h
index 8544941..2f60068 100644
--- a/net/http2/hpack/decoder/hpack_decoder_string_buffer.h
+++ b/net/http2/hpack/decoder/hpack_decoder_string_buffer.h
@@ -62,6 +62,9 @@
   Backing backing_for_testing() const { return backing_; }
   void OutputDebugStringTo(std::ostream& out) const;
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   // Storage for the string being buffered, if buffering is necessary
   // (e.g. if Huffman encoded, buffer_ is storage for the decoded string).
diff --git a/net/http2/hpack/decoder/hpack_whole_entry_buffer.cc b/net/http2/hpack/decoder/hpack_whole_entry_buffer.cc
index 8bb212f..429938f 100644
--- a/net/http2/hpack/decoder/hpack_whole_entry_buffer.cc
+++ b/net/http2/hpack/decoder/hpack_whole_entry_buffer.cc
@@ -5,6 +5,7 @@
 #include "net/http2/hpack/decoder/hpack_whole_entry_buffer.h"
 
 #include "base/logging.h"
+#include "base/trace_event/memory_usage_estimator.h"
 
 using base::StringPiece;
 
@@ -32,6 +33,11 @@
   value_.BufferStringIfUnbuffered();
 }
 
+size_t HpackWholeEntryBuffer::EstimateMemoryUsage() const {
+  return base::trace_event::EstimateMemoryUsage(name_) +
+         base::trace_event::EstimateMemoryUsage(value_);
+}
+
 void HpackWholeEntryBuffer::OnIndexedHeader(size_t index) {
   DVLOG(2) << "HpackWholeEntryBuffer::OnIndexedHeader: index=" << index;
   listener_->OnIndexedHeader(index);
diff --git a/net/http2/hpack/decoder/hpack_whole_entry_buffer.h b/net/http2/hpack/decoder/hpack_whole_entry_buffer.h
index 8ab5d693..d7f7e84 100644
--- a/net/http2/hpack/decoder/hpack_whole_entry_buffer.h
+++ b/net/http2/hpack/decoder/hpack_whole_entry_buffer.h
@@ -60,6 +60,9 @@
   // no further callbacks will be made to the listener.
   bool error_detected() const { return error_detected_; }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
   // Implement the HpackEntryDecoderListener methods.
 
   void OnIndexedHeader(size_t index) override;
diff --git a/net/http2/hpack/decoder/http2_hpack_decoder.cc b/net/http2/hpack/decoder/http2_hpack_decoder.cc
index 390d8287..607bec1 100644
--- a/net/http2/hpack/decoder/http2_hpack_decoder.cc
+++ b/net/http2/hpack/decoder/http2_hpack_decoder.cc
@@ -5,6 +5,7 @@
 #include "net/http2/hpack/decoder/http2_hpack_decoder.h"
 
 #include "base/logging.h"
+#include "base/trace_event/memory_usage_estimator.h"
 #include "net/http2/decoder/decode_status.h"
 
 using base::StringPiece;
@@ -116,6 +117,10 @@
   return error_detected_;
 }
 
+size_t Http2HpackDecoder::EstimateMemoryUsage() const {
+  return base::trace_event::EstimateMemoryUsage(entry_buffer_);
+}
+
 void Http2HpackDecoder::ReportError(StringPiece error_message) {
   DVLOG(3) << "Http2HpackDecoder::ReportError is new="
            << (!error_detected_ ? "true" : "false")
diff --git a/net/http2/hpack/decoder/http2_hpack_decoder.h b/net/http2/hpack/decoder/http2_hpack_decoder.h
index fff1320..d053c3a 100644
--- a/net/http2/hpack/decoder/http2_hpack_decoder.h
+++ b/net/http2/hpack/decoder/http2_hpack_decoder.h
@@ -95,6 +95,9 @@
   // Was an error detected?
   bool error_detected();
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   friend class test::Http2HpackDecoderPeer;
 
diff --git a/net/proxy/proxy_server.cc b/net/proxy/proxy_server.cc
index 76fa0d6..ed81ebb 100644
--- a/net/proxy/proxy_server.cc
+++ b/net/proxy/proxy_server.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/strings/string_util.h"
+#include "base/trace_event/memory_usage_estimator.h"
 #include "net/base/url_util.h"
 #include "net/http/http_util.h"
 
@@ -209,6 +210,10 @@
   return GetSchemeFromURIInternal(scheme);
 }
 
+size_t ProxyServer::EstimateMemoryUsage() const {
+  return base::trace_event::EstimateMemoryUsage(host_port_pair_);
+}
+
 // static
 ProxyServer ProxyServer::FromSchemeHostAndPort(
     Scheme scheme,
diff --git a/net/proxy/proxy_server.h b/net/proxy/proxy_server.h
index 12ec217..bc63164 100644
--- a/net/proxy/proxy_server.h
+++ b/net/proxy/proxy_server.h
@@ -155,6 +155,9 @@
            std::tie(other.scheme_, other.host_port_pair_);
   }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   // Creates a ProxyServer given a scheme, and host/port string. If parsing the
   // host/port string fails, the returned instance will be invalid.
diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc
index 58ce8e4..60a70d08 100644
--- a/net/quic/chromium/quic_stream_factory.cc
+++ b/net/quic/chromium/quic_stream_factory.cc
@@ -207,7 +207,7 @@
 
 // Returns the estimate of dynamically allocated memory of |server_id|.
 size_t EstimateServerIdMemoryUsage(const QuicServerId& server_id) {
-  return HostPortPair::EstimateMemoryUsage(server_id.host_port_pair());
+  return base::trace_event::EstimateMemoryUsage(server_id.host_port_pair());
 }
 
 }  // namespace
@@ -1093,7 +1093,7 @@
 }
 
 size_t QuicStreamFactory::QuicSessionKey::EstimateMemoryUsage() const {
-  return HostPortPair::EstimateMemoryUsage(destination_) +
+  return base::trace_event::EstimateMemoryUsage(destination_) +
          EstimateServerIdMemoryUsage(server_id_);
 }
 
diff --git a/net/spdy/buffered_spdy_framer.cc b/net/spdy/buffered_spdy_framer.cc
index 2ca4b24..332b06b 100644
--- a/net/spdy/buffered_spdy_framer.cc
+++ b/net/spdy/buffered_spdy_framer.cc
@@ -10,6 +10,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -306,4 +307,15 @@
   return spdy_framer_.GetHighestPriority();
 }
 
+size_t BufferedSpdyFramer::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(spdy_framer_) +
+         SpdyEstimateMemoryUsage(coalescer_) +
+         SpdyEstimateMemoryUsage(control_frame_fields_) +
+         SpdyEstimateMemoryUsage(goaway_fields_);
+}
+
+size_t BufferedSpdyFramer::GoAwayFields::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(debug_data);
+}
+
 }  // namespace net
diff --git a/net/spdy/buffered_spdy_framer.h b/net/spdy/buffered_spdy_framer.h
index 7ab4fa3..fa0ead923 100644
--- a/net/spdy/buffered_spdy_framer.h
+++ b/net/spdy/buffered_spdy_framer.h
@@ -230,6 +230,9 @@
 
   int frames_received() const { return frames_received_; }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   SpdyFramer spdy_framer_;
   BufferedSpdyFramerVisitorInterface* visitor_;
@@ -258,6 +261,9 @@
     SpdyStreamId last_accepted_stream_id;
     SpdyErrorCode error_code;
     std::string debug_data;
+
+    // Returns the estimate of dynamically allocated memory in bytes.
+    size_t EstimateMemoryUsage() const;
   };
   std::unique_ptr<GoAwayFields> goaway_fields_;
 
diff --git a/net/spdy/header_coalescer.cc b/net/spdy/header_coalescer.cc
index 24bd9cb..497c0799 100644
--- a/net/spdy/header_coalescer.cc
+++ b/net/spdy/header_coalescer.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/strings/string_util.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -70,4 +71,8 @@
   return std::move(headers_);
 }
 
+size_t HeaderCoalescer::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(headers_);
+}
+
 }  // namespace net
diff --git a/net/spdy/header_coalescer.h b/net/spdy/header_coalescer.h
index fe30a28..f615139 100644
--- a/net/spdy/header_coalescer.h
+++ b/net/spdy/header_coalescer.h
@@ -26,6 +26,9 @@
   SpdyHeaderBlock release_headers();
   bool error_seen() const { return error_seen_; }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   SpdyHeaderBlock headers_;
   bool headers_valid_ = true;
diff --git a/net/spdy/hpack/hpack_decoder.cc b/net/spdy/hpack/hpack_decoder.cc
index 575a5c1..78e1f181 100644
--- a/net/spdy/hpack/hpack_decoder.cc
+++ b/net/spdy/hpack/hpack_decoder.cc
@@ -9,6 +9,7 @@
 #include "base/logging.h"
 #include "net/spdy/hpack/hpack_constants.h"
 #include "net/spdy/hpack/hpack_entry.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_flags.h"
 
 namespace net {
@@ -116,6 +117,14 @@
   max_decode_buffer_size_bytes_ = max_decode_buffer_size_bytes;
 }
 
+size_t HpackDecoder::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(header_table_) +
+         SpdyEstimateMemoryUsage(headers_block_buffer_) +
+         SpdyEstimateMemoryUsage(decoded_block_) +
+         SpdyEstimateMemoryUsage(key_buffer_) +
+         SpdyEstimateMemoryUsage(value_buffer_);
+}
+
 bool HpackDecoder::HandleHeaderRepresentation(StringPiece name,
                                               StringPiece value) {
   size_updates_allowed_ = false;
diff --git a/net/spdy/hpack/hpack_decoder.h b/net/spdy/hpack/hpack_decoder.h
index 172892f..76d18b7 100644
--- a/net/spdy/hpack/hpack_decoder.h
+++ b/net/spdy/hpack/hpack_decoder.h
@@ -78,6 +78,8 @@
   void set_max_decode_buffer_size_bytes(
       size_t max_decode_buffer_size_bytes) override;
 
+  size_t EstimateMemoryUsage() const override;
+
  private:
   // Adds the header representation to |decoded_block_|, applying the
   // following rules:
diff --git a/net/spdy/hpack/hpack_decoder2.cc b/net/spdy/hpack/hpack_decoder2.cc
index 03b1c2e..14ff94e990f 100644
--- a/net/spdy/hpack/hpack_decoder2.cc
+++ b/net/spdy/hpack/hpack_decoder2.cc
@@ -12,6 +12,7 @@
 #include "net/http2/decoder/decode_buffer.h"
 #include "net/http2/decoder/decode_status.h"
 #include "net/spdy/hpack/hpack_entry.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 using base::StringPiece;
 
@@ -159,6 +160,12 @@
   max_decode_buffer_size_bytes_ = max_decode_buffer_size_bytes;
 }
 
+size_t HpackDecoder2::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(header_table_) +
+         SpdyEstimateMemoryUsage(decoded_block_) +
+         SpdyEstimateMemoryUsage(name_) + SpdyEstimateMemoryUsage(value_);
+}
+
 void HpackDecoder2::OnIndexedHeader(size_t index) {
   DVLOG(2) << "HpackDecoder2::OnIndexedHeader: index=" << index;
   DCHECK(!error_detected_);
diff --git a/net/spdy/hpack/hpack_decoder2.h b/net/spdy/hpack/hpack_decoder2.h
index 6dd207c..614ac01 100644
--- a/net/spdy/hpack/hpack_decoder2.h
+++ b/net/spdy/hpack/hpack_decoder2.h
@@ -56,6 +56,7 @@
       override;
   void set_max_decode_buffer_size_bytes(
       size_t max_decode_buffer_size_bytes) override;
+  size_t EstimateMemoryUsage() const override;
 
  protected:
   // Override the HpackEntryDecoderListener methods:
diff --git a/net/spdy/hpack/hpack_decoder3.cc b/net/spdy/hpack/hpack_decoder3.cc
index 5c6fbb8..6929980 100644
--- a/net/spdy/hpack/hpack_decoder3.cc
+++ b/net/spdy/hpack/hpack_decoder3.cc
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "net/http2/decoder/decode_buffer.h"
 #include "net/http2/decoder/decode_status.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 using base::StringPiece;
 
@@ -107,6 +108,10 @@
   hpack_decoder_.set_max_string_size_bytes(max_decode_buffer_size_bytes);
 }
 
+size_t HpackDecoder3::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(hpack_decoder_);
+}
+
 HpackDecoder3::ListenerAdapter::ListenerAdapter() : handler_(nullptr) {}
 HpackDecoder3::ListenerAdapter::~ListenerAdapter() {}
 
diff --git a/net/spdy/hpack/hpack_decoder3.h b/net/spdy/hpack/hpack_decoder3.h
index 0d64251..a83fdf2f 100644
--- a/net/spdy/hpack/hpack_decoder3.h
+++ b/net/spdy/hpack/hpack_decoder3.h
@@ -50,6 +50,7 @@
       override;
   void set_max_decode_buffer_size_bytes(
       size_t max_decode_buffer_size_bytes) override;
+  size_t EstimateMemoryUsage() const override;
 
  private:
   class NET_EXPORT_PRIVATE ListenerAdapter
diff --git a/net/spdy/hpack/hpack_decoder_interface.h b/net/spdy/hpack/hpack_decoder_interface.h
index 1103e31..375e221 100644
--- a/net/spdy/hpack/hpack_decoder_interface.h
+++ b/net/spdy/hpack/hpack_decoder_interface.h
@@ -66,6 +66,9 @@
   // of individual transport buffers.
   virtual void set_max_decode_buffer_size_bytes(
       size_t max_decode_buffer_size_bytes) = 0;
+
+  // Returns the estimate of dynamically allocated memory in bytes.
+  virtual size_t EstimateMemoryUsage() const = 0;
 };
 
 }  // namespace net
diff --git a/net/spdy/hpack/hpack_encoder.cc b/net/spdy/hpack/hpack_encoder.cc
index 0ec5e8f..de04d74 100644
--- a/net/spdy/hpack/hpack_encoder.cc
+++ b/net/spdy/hpack/hpack_encoder.cc
@@ -13,6 +13,7 @@
 #include "net/spdy/hpack/hpack_header_table.h"
 #include "net/spdy/hpack/hpack_huffman_table.h"
 #include "net/spdy/hpack/hpack_output_stream.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -132,6 +133,12 @@
   should_emit_table_size_ = true;
 }
 
+size_t HpackEncoder::EstimateMemoryUsage() const {
+  // |huffman_table_| is a singleton. It's accounted for in spdy_session_pool.cc
+  return SpdyEstimateMemoryUsage(header_table_) +
+         SpdyEstimateMemoryUsage(output_stream_);
+}
+
 void HpackEncoder::EncodeRepresentations(RepresentationIterator* iter,
                                          string* output) {
   MaybeEmitTableSize();
diff --git a/net/spdy/hpack/hpack_encoder.h b/net/spdy/hpack/hpack_encoder.h
index f2d95e3..0d5f2d5 100644
--- a/net/spdy/hpack/hpack_encoder.h
+++ b/net/spdy/hpack/hpack_encoder.h
@@ -101,6 +101,9 @@
 
   void DisableCompression() { enable_compression_ = false; }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   friend class test::HpackEncoderPeer;
 
diff --git a/net/spdy/hpack/hpack_huffman_table.cc b/net/spdy/hpack/hpack_huffman_table.cc
index 0e3ca1b..2d361db 100644
--- a/net/spdy/hpack/hpack_huffman_table.cc
+++ b/net/spdy/hpack/hpack_huffman_table.cc
@@ -12,6 +12,7 @@
 #include "base/numerics/safe_conversions.h"
 #include "net/spdy/hpack/hpack_input_stream.h"
 #include "net/spdy/hpack/hpack_output_stream.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -318,4 +319,11 @@
   return false;
 }
 
+size_t HpackHuffmanTable::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(decode_tables_) +
+         SpdyEstimateMemoryUsage(decode_entries_) +
+         SpdyEstimateMemoryUsage(code_by_id_) +
+         SpdyEstimateMemoryUsage(length_by_id_);
+}
+
 }  // namespace net
diff --git a/net/spdy/hpack/hpack_huffman_table.h b/net/spdy/hpack/hpack_huffman_table.h
index 96c3950..386e2aa 100644
--- a/net/spdy/hpack/hpack_huffman_table.h
+++ b/net/spdy/hpack/hpack_huffman_table.h
@@ -94,6 +94,9 @@
   bool GenericDecodeString(HpackInputStream* in,
                            std::string* out) const;
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   // Expects symbols ordered on length & ID ascending.
   void BuildDecodeTables(const std::vector<Symbol>& symbols);
diff --git a/net/spdy/hpack/hpack_output_stream.cc b/net/spdy/hpack/hpack_output_stream.cc
index 6337d7d..a93965d 100644
--- a/net/spdy/hpack/hpack_output_stream.cc
+++ b/net/spdy/hpack/hpack_output_stream.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -92,4 +93,8 @@
   }
 }
 
+size_t HpackOutputStream::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(buffer_);
+}
+
 }  // namespace net
diff --git a/net/spdy/hpack/hpack_output_stream.h b/net/spdy/hpack/hpack_output_stream.h
index 41dfd7d..965cea7 100644
--- a/net/spdy/hpack/hpack_output_stream.h
+++ b/net/spdy/hpack/hpack_output_stream.h
@@ -59,6 +59,9 @@
   // Size in bytes of stream's internal buffer.
   size_t size() const { return buffer_.size(); }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   // The internal bit buffer.
   std::string buffer_;
diff --git a/net/spdy/hpack/hpack_static_table.cc b/net/spdy/hpack/hpack_static_table.cc
index 5588ebe..626bd92 100644
--- a/net/spdy/hpack/hpack_static_table.cc
+++ b/net/spdy/hpack/hpack_static_table.cc
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "net/spdy/hpack/hpack_constants.h"
 #include "net/spdy/hpack/hpack_entry.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -39,4 +40,10 @@
   return !static_entries_.empty();
 }
 
+size_t HpackStaticTable::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(static_entries_) +
+         SpdyEstimateMemoryUsage(static_index_) +
+         SpdyEstimateMemoryUsage(static_name_index_);
+}
+
 }  // namespace net
diff --git a/net/spdy/hpack/hpack_static_table.h b/net/spdy/hpack/hpack_static_table.h
index 9239134..328ad29 100644
--- a/net/spdy/hpack/hpack_static_table.h
+++ b/net/spdy/hpack/hpack_static_table.h
@@ -42,6 +42,9 @@
     return static_name_index_;
   }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   HpackHeaderTable::EntryTable static_entries_;
   HpackHeaderTable::UnorderedEntrySet static_index_;
diff --git a/net/spdy/http2_frame_decoder_adapter.cc b/net/spdy/http2_frame_decoder_adapter.cc
index 475ef17..64d6b6d 100644
--- a/net/spdy/http2_frame_decoder_adapter.cc
+++ b/net/spdy/http2_frame_decoder_adapter.cc
@@ -28,6 +28,7 @@
 #include "net/http2/http2_structures.h"
 #include "net/spdy/hpack/hpack_decoder_interface.h"
 #include "net/spdy/hpack/hpack_header_table.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_alt_svc_wire_format.h"
 #include "net/spdy/spdy_bug_tracker.h"
 #include "net/spdy/spdy_frame_builder.h"
@@ -143,6 +144,12 @@
     return latched_probable_http_response_;
   }
 
+  size_t EstimateMemoryUsage() const override {
+    // Skip |frame_decoder_|, |frame_header_| and |hpack_first_frame_header_| as
+    // they don't allocate.
+    return SpdyEstimateMemoryUsage(alt_svc_origin_) +
+           SpdyEstimateMemoryUsage(alt_svc_value_);
+  }
   // ===========================================================================
   // Implementations of the methods declared by Http2FrameDecoderListener.
 
diff --git a/net/spdy/http2_priority_dependencies.cc b/net/spdy/http2_priority_dependencies.cc
index 9cbfba07..b4731647 100644
--- a/net/spdy/http2_priority_dependencies.cc
+++ b/net/spdy/http2_priority_dependencies.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "net/spdy/http2_priority_dependencies.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -157,4 +158,10 @@
   entry_by_stream_id_.erase(emit);
 }
 
+size_t Http2PriorityDependencies::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(id_priority_lists_);
+  // TODO(xunjieli): https://crbug.com/690015. Include |entry_by_stream_id_|
+  // when memory_usage_estimator.h supports std::list::iterator.
+}
+
 }  // namespace net
diff --git a/net/spdy/http2_priority_dependencies.h b/net/spdy/http2_priority_dependencies.h
index d356a79..5a5aed3 100644
--- a/net/spdy/http2_priority_dependencies.h
+++ b/net/spdy/http2_priority_dependencies.h
@@ -47,6 +47,9 @@
   std::vector<DependencyUpdate> OnStreamUpdate(SpdyStreamId id,
                                                SpdyPriority new_priority);
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   // The requirements for the internal data structure for this class are:
   //     a) Constant time insertion of entries at the end of the list,
diff --git a/net/spdy/spdy_buffer.cc b/net/spdy/spdy_buffer.cc
index 28e807d..1c2d6ede 100644
--- a/net/spdy/spdy_buffer.cc
+++ b/net/spdy/spdy_buffer.cc
@@ -11,6 +11,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "net/base/io_buffer.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_protocol.h"
 
 namespace net {
@@ -97,6 +98,11 @@
   return new SharedFrameIOBuffer(shared_frame_, offset_);
 }
 
+size_t SpdyBuffer::EstimateMemoryUsage() const {
+  // TODO(xunjieli): Estimate |consume_callbacks_|. https://crbug.com/669108.
+  return SpdyEstimateMemoryUsage(shared_frame_->data);
+}
+
 void SpdyBuffer::ConsumeHelper(size_t consume_size,
                                ConsumeSource consume_source) {
   DCHECK_GE(consume_size, 1u);
diff --git a/net/spdy/spdy_buffer.h b/net/spdy/spdy_buffer.h
index 0d9ffbf..c2271a5 100644
--- a/net/spdy/spdy_buffer.h
+++ b/net/spdy/spdy_buffer.h
@@ -83,6 +83,9 @@
   // http://crbug.com/249725 .)
   IOBuffer* GetIOBufferForRemainingData();
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   void ConsumeHelper(size_t consume_size, ConsumeSource consume_source);
 
diff --git a/net/spdy/spdy_buffer_producer.cc b/net/spdy/spdy_buffer_producer.cc
index 46d766b..039638c 100644
--- a/net/spdy/spdy_buffer_producer.cc
+++ b/net/spdy/spdy_buffer_producer.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_buffer.h"
 #include "net/spdy/spdy_protocol.h"
 
@@ -26,4 +27,8 @@
   return std::move(buffer_);
 }
 
+size_t SimpleBufferProducer::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(buffer_);
+}
+
 }  // namespace net
diff --git a/net/spdy/spdy_buffer_producer.h b/net/spdy/spdy_buffer_producer.h
index 8d09f7b..5b18c187 100644
--- a/net/spdy/spdy_buffer_producer.h
+++ b/net/spdy/spdy_buffer_producer.h
@@ -27,6 +27,9 @@
 
   virtual ~SpdyBufferProducer();
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  virtual size_t EstimateMemoryUsage() const = 0;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(SpdyBufferProducer);
 };
@@ -40,6 +43,8 @@
 
   std::unique_ptr<SpdyBuffer> ProduceBuffer() override;
 
+  size_t EstimateMemoryUsage() const override;
+
  private:
   std::unique_ptr<SpdyBuffer> buffer_;
 
diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc
index 85135d56..90200d8 100644
--- a/net/spdy/spdy_framer.cc
+++ b/net/spdy/spdy_framer.cc
@@ -28,6 +28,7 @@
 #include "net/spdy/hpack/hpack_decoder2.h"
 #include "net/spdy/hpack/hpack_decoder3.h"
 #include "net/spdy/http2_frame_decoder_adapter.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_bitmasks.h"
 #include "net/spdy/spdy_bug_tracker.h"
 #include "net/spdy/spdy_flags.h"
@@ -563,6 +564,10 @@
   len_ = 0;
 }
 
+size_t SpdyFramer::CharBuffer::EstimateMemoryUsage() const {
+  return capacity_;
+}
+
 SpdyFramer::SpdySettingsScratch::SpdySettingsScratch()
     : buffer(8), last_setting_id(-1) {}
 
@@ -571,6 +576,10 @@
   last_setting_id = -1;
 }
 
+size_t SpdyFramer::SpdySettingsScratch::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(buffer);
+}
+
 SpdyFrameType SpdyFramer::ValidateFrameHeader(bool is_control_frame,
                                               uint8_t frame_type_field,
                                               size_t payload_length_field) {
@@ -2352,6 +2361,15 @@
   GetHpackEncoder()->SetHeaderTableDebugVisitor(std::move(visitor));
 }
 
+size_t SpdyFramer::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(current_frame_buffer_) +
+         SpdyEstimateMemoryUsage(settings_scratch_) +
+         SpdyEstimateMemoryUsage(altsvc_scratch_) +
+         SpdyEstimateMemoryUsage(hpack_encoder_) +
+         SpdyEstimateMemoryUsage(hpack_decoder_) +
+         SpdyEstimateMemoryUsage(decoder_adapter_);
+}
+
 void SpdyFramer::UpdateHeaderEncoderTableSize(uint32_t value) {
   GetHpackEncoder()->ApplyHeaderTableSizeSetting(value);
 }
diff --git a/net/spdy/spdy_framer.h b/net/spdy/spdy_framer.h
index 9bbfd2c..59f35f1 100644
--- a/net/spdy/spdy_framer.h
+++ b/net/spdy/spdy_framer.h
@@ -528,6 +528,9 @@
     return GetHpackDecoder();
   }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  protected:
   friend class BufferedSpdyFramer;
   friend class HttpNetworkLayer;  // This is temporary for the server.
@@ -553,6 +556,8 @@
     const char* data() const { return buffer_.get(); }
     size_t len() const { return len_; }
 
+    size_t EstimateMemoryUsage() const;
+
    private:
     std::unique_ptr<char[]> buffer_;
     size_t capacity_;
@@ -563,6 +568,7 @@
   struct SpdySettingsScratch {
     SpdySettingsScratch();
     void Reset();
+    size_t EstimateMemoryUsage() const;
 
     // Buffer contains up to one complete key/value pair.
     CharBuffer buffer;
diff --git a/net/spdy/spdy_framer_decoder_adapter.cc b/net/spdy/spdy_framer_decoder_adapter.cc
index 6343069..603f2a0c 100644
--- a/net/spdy/spdy_framer_decoder_adapter.cc
+++ b/net/spdy/spdy_framer_decoder_adapter.cc
@@ -11,6 +11,7 @@
 #include "base/format_macros.h"
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 #if defined(COMPILER_GCC)
 #define PRETTY_THIS base::StringPrintf("%s@%p ", __PRETTY_FUNCTION__, this)
@@ -231,6 +232,10 @@
   bool probable_http_response() const override {
     return framer_.probable_http_response();
   }
+  size_t EstimateMemoryUsage() const override {
+    // Skip |visitor_adapter_| because it doesn't allocate.
+    return SpdyEstimateMemoryUsage(framer_);
+  }
 
  private:
   SpdyFramer framer_;
diff --git a/net/spdy/spdy_framer_decoder_adapter.h b/net/spdy/spdy_framer_decoder_adapter.h
index 293b6c3..84f709dd 100644
--- a/net/spdy/spdy_framer_decoder_adapter.h
+++ b/net/spdy/spdy_framer_decoder_adapter.h
@@ -75,6 +75,9 @@
   // has responded with an HTTP/1.1 (or earlier) response.
   virtual bool probable_http_response() const = 0;
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  virtual size_t EstimateMemoryUsage() const = 0;
+
  private:
   SpdyFramerVisitorInterface* visitor_ = nullptr;
   SpdyFramerDebugVisitorInterface* debug_visitor_ = nullptr;
diff --git a/net/spdy/spdy_header_block.cc b/net/spdy/spdy_header_block.cc
index 6cbd6ba6..a51532cf 100644
--- a/net/spdy/spdy_header_block.cc
+++ b/net/spdy/spdy_header_block.cc
@@ -15,6 +15,7 @@
 #include "net/base/arena.h"
 #include "net/http/http_log_util.h"
 #include "net/log/net_log_capture_mode.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 using base::StringPiece;
 using std::dec;
@@ -89,6 +90,11 @@
 
   size_t bytes_allocated() const { return arena_.status().bytes_allocated(); }
 
+  // TODO(xunjieli): https://crbug.com/669108. Merge this with bytes_allocated()
+  size_t EstimateMemoryUsage() const {
+    return arena_.status().bytes_allocated();
+  }
+
  private:
   UnsafeArena arena_;
 };
@@ -299,6 +305,12 @@
   iter->second.Append(GetStorage()->Write(value));
 }
 
+size_t SpdyHeaderBlock::EstimateMemoryUsage() const {
+  // TODO(xunjieli): https://crbug.com/669108. Also include |block_| when EMU()
+  // supports linked_hash_map.
+  return SpdyEstimateMemoryUsage(storage_);
+}
+
 void SpdyHeaderBlock::AppendHeader(const StringPiece key,
                                    const StringPiece value) {
   auto storage = GetStorage();
diff --git a/net/spdy/spdy_header_block.h b/net/spdy/spdy_header_block.h
index fe8827f5..e09b33d 100644
--- a/net/spdy/spdy_header_block.h
+++ b/net/spdy/spdy_header_block.h
@@ -218,6 +218,9 @@
     bool valid_;
   };
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   friend class test::SpdyHeaderBlockPeer;
 
diff --git a/net/spdy/spdy_protocol.h b/net/spdy/spdy_protocol.h
index 3c2187c..523ad57 100644
--- a/net/spdy/spdy_protocol.h
+++ b/net/spdy/spdy_protocol.h
@@ -862,6 +862,9 @@
     return buffer;
   }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const { return owns_buffer_ ? size_ : 0; }
+
  protected:
   char* frame_;
 
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 2e3a31a..aa8397a 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -46,6 +46,7 @@
 #include "net/log/net_log_with_source.h"
 #include "net/proxy/proxy_server.h"
 #include "net/socket/ssl_client_socket.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_buffer_producer.h"
 #include "net/spdy/spdy_frame_builder.h"
 #include "net/spdy/spdy_http_utils.h"
@@ -582,6 +583,10 @@
   return stream;
 }
 
+size_t SpdyStreamRequest::EstimateMemoryUsage() const {
+  return base::trace_event::EstimateItemMemoryUsage(url_);
+}
+
 void SpdyStreamRequest::OnRequestCompleteSuccess(
     const base::WeakPtr<SpdyStream>& stream) {
   DCHECK(session_);
@@ -660,6 +665,11 @@
                    stream_id, creation_time)));
 }
 
+size_t SpdySession::UnclaimedPushedStreamContainer::EstimateMemoryUsage()
+    const {
+  return SpdyEstimateMemoryUsage(streams_);
+}
+
 // static
 bool SpdySession::CanPool(TransportSecurityState* transport_security_state,
                           const SSLInfo& ssl_info,
@@ -1349,10 +1359,27 @@
   return false;
 }
 
-void SpdySession::DumpMemoryStats(StreamSocket::SocketMemoryStats* stats,
-                                  bool* is_session_active) const {
+size_t SpdySession::DumpMemoryStats(StreamSocket::SocketMemoryStats* stats,
+                                    bool* is_session_active) const {
+  // TODO(xunjieli): Include |pending_create_stream_queues_| when WeakPtr is
+  // supported in memory_usage_estimator.h.
   *is_session_active = is_active();
   connection_->DumpMemoryStats(stats);
+
+  // |connection_| is estimated in stats->total_size. |read_buffer_| is
+  // estimated in kReadBufferSize. TODO(xunjieli): Make them use EMU().
+  return stats->total_size + kReadBufferSize +
+         SpdyEstimateMemoryUsage(spdy_session_key_) +
+         SpdyEstimateMemoryUsage(pooled_aliases_) +
+         SpdyEstimateMemoryUsage(active_streams_) +
+         SpdyEstimateMemoryUsage(unclaimed_pushed_streams_) +
+         SpdyEstimateMemoryUsage(created_streams_) +
+         SpdyEstimateMemoryUsage(write_queue_) +
+         SpdyEstimateMemoryUsage(in_flight_write_) +
+         SpdyEstimateMemoryUsage(buffered_spdy_framer_) +
+         SpdyEstimateMemoryUsage(initial_settings_) +
+         SpdyEstimateMemoryUsage(stream_send_unstall_queue_) +
+         SpdyEstimateMemoryUsage(priority_dependency_state_);
 }
 
 // {,Try}CreateStream() can be called with |in_io_loop_| set if a stream is
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index 30150e2..0056482 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -191,6 +191,9 @@
   // set a delegate for the returned stream (except for test code).
   base::WeakPtr<SpdyStream> ReleaseStream();
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   friend class SpdySession;
 
@@ -242,6 +245,7 @@
       PushedStreamInfo(SpdyStreamId stream_id, base::TimeTicks creation_time)
           : stream_id(stream_id), creation_time(creation_time) {}
       ~PushedStreamInfo() {}
+      size_t EstimateMemoryUsage() const { return 0; }
 
       SpdyStreamId stream_id;
       base::TimeTicks creation_time;
@@ -271,6 +275,8 @@
                     SpdyStreamId stream_id,
                     const base::TimeTicks& creation_time);
 
+    size_t EstimateMemoryUsage() const;
+
    private:
     SpdySession* spdy_session_;
 
@@ -565,8 +571,10 @@
   // indicate whether session is active.
   // |stats| can be assumed as being default initialized upon entry.
   // Implementation overrides fields in |stats|.
-  void DumpMemoryStats(StreamSocket::SocketMemoryStats* stats,
-                       bool* is_session_active) const;
+  // Returns the estimate of dynamically allocated memory in bytes, which
+  // includes the size attributed to the underlying socket.
+  size_t DumpMemoryStats(StreamSocket::SocketMemoryStats* stats,
+                         bool* is_session_active) const;
 
  private:
   friend class test::SpdyStreamTest;
diff --git a/net/spdy/spdy_session_key.cc b/net/spdy/spdy_session_key.cc
index 8b2fcbc..4c15e248 100644
--- a/net/spdy/spdy_session_key.cc
+++ b/net/spdy/spdy_session_key.cc
@@ -7,6 +7,8 @@
 #include <tuple>
 
 #include "base/logging.h"
+#include "net/base/host_port_pair.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 
 namespace net {
 
@@ -49,4 +51,8 @@
       host_port_proxy_pair_.second == other.host_port_proxy_pair_.second;
 }
 
+size_t SpdySessionKey::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(host_port_proxy_pair_);
+}
+
 }  // namespace net
diff --git a/net/spdy/spdy_session_key.h b/net/spdy/spdy_session_key.h
index 31d61a3e..f6a8238 100644
--- a/net/spdy/spdy_session_key.h
+++ b/net/spdy/spdy_session_key.h
@@ -49,6 +49,9 @@
     return privacy_mode_;
   }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   HostPortProxyPair host_port_proxy_pair_;
   // If enabled, then session cannot be tracked by the server.
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc
index 1a594d0..7af02fc 100644
--- a/net/spdy/spdy_session_pool.cc
+++ b/net/spdy/spdy_session_pool.cc
@@ -23,6 +23,10 @@
 #include "net/log/net_log_event_type.h"
 #include "net/log/net_log_source.h"
 #include "net/log/net_log_with_source.h"
+#include "net/spdy/hpack/hpack_constants.h"
+#include "net/spdy/hpack/hpack_huffman_table.h"
+#include "net/spdy/hpack/hpack_static_table.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_session.h"
 
 namespace net {
@@ -381,14 +385,15 @@
   for (const auto& session : sessions_) {
     StreamSocket::SocketMemoryStats stats;
     bool is_session_active = false;
-    session->DumpMemoryStats(&stats, &is_session_active);
-    total_size += stats.total_size;
+    total_size += session->DumpMemoryStats(&stats, &is_session_active);
     buffer_size += stats.buffer_size;
     cert_count += stats.cert_count;
     serialized_cert_size += stats.serialized_cert_size;
     if (is_session_active)
       num_active_sessions++;
   }
+  total_size += SpdyEstimateMemoryUsage(ObtainHpackHuffmanTable()) +
+                SpdyEstimateMemoryUsage(ObtainHpackStaticTable());
   base::trace_event::MemoryAllocatorDump* dump =
       pmd->CreateAllocatorDump(base::StringPrintf(
           "%s/spdy_session_pool", parent_dump_absolute_name.c_str()));
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index e00ae21..05d9f13b 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -23,6 +23,7 @@
 #include "net/log/net_log.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_event_type.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_buffer_producer.h"
 #include "net/spdy/spdy_http_utils.h"
 #include "net/spdy/spdy_session.h"
@@ -112,6 +113,7 @@
     return std::unique_ptr<SpdyBuffer>(
         new SpdyBuffer(stream_->ProduceHeadersFrame()));
   }
+  size_t EstimateMemoryUsage() const override { return 0; }
 
  private:
   const base::WeakPtr<SpdyStream> stream_;
@@ -820,6 +822,16 @@
   return result;
 }
 
+size_t SpdyStream::EstimateMemoryUsage() const {
+  // TODO(xunjieli): https://crbug.com/669108. Estimate |pending_send_data_|
+  // once scoped_refptr support is in.
+  return SpdyEstimateMemoryUsage(url_) +
+         SpdyEstimateMemoryUsage(request_headers_) +
+         SpdyEstimateMemoryUsage(url_from_header_block_) +
+         SpdyEstimateMemoryUsage(pending_recv_data_) +
+         SpdyEstimateMemoryUsage(response_headers_);
+}
+
 void SpdyStream::UpdateHistograms() {
   // We need at least the receive timers to be filled in, as otherwise
   // metrics can be bogus.
diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h
index 402e892b..816c7bc 100644
--- a/net/spdy/spdy_stream.h
+++ b/net/spdy/spdy_stream.h
@@ -372,6 +372,9 @@
   // GURL() if it is unknown.
   const GURL& GetUrlFromHeaders() const { return url_from_header_block_; }
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   class HeadersBufferProducer;
 
diff --git a/net/spdy/spdy_write_queue.cc b/net/spdy/spdy_write_queue.cc
index 50df9440..db498f3a 100644
--- a/net/spdy/spdy_write_queue.cc
+++ b/net/spdy/spdy_write_queue.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/logging.h"
+#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/spdy/spdy_buffer.h"
 #include "net/spdy/spdy_buffer_producer.h"
 #include "net/spdy/spdy_stream.h"
@@ -32,6 +33,10 @@
 SpdyWriteQueue::PendingWrite& SpdyWriteQueue::PendingWrite::operator=(
     PendingWrite&& other) = default;
 
+size_t SpdyWriteQueue::PendingWrite::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(frame_producer);
+}
+
 SpdyWriteQueue::SpdyWriteQueue() : removing_writes_(false) {}
 
 SpdyWriteQueue::~SpdyWriteQueue() {
@@ -155,4 +160,8 @@
   removing_writes_ = false;
 }
 
+size_t SpdyWriteQueue::EstimateMemoryUsage() const {
+  return SpdyEstimateMemoryUsage(queue_);
+}
+
 }  // namespace net
diff --git a/net/spdy/spdy_write_queue.h b/net/spdy/spdy_write_queue.h
index acf6b4c..d781f86 100644
--- a/net/spdy/spdy_write_queue.h
+++ b/net/spdy/spdy_write_queue.h
@@ -59,6 +59,9 @@
   // Removes all pending writes.
   void Clear();
 
+  // Returns the estimate of dynamically allocated memory in bytes.
+  size_t EstimateMemoryUsage() const;
+
  private:
   // A struct holding a frame producer and its associated stream.
   struct PendingWrite {
@@ -76,6 +79,8 @@
     PendingWrite(PendingWrite&& other);
     PendingWrite& operator=(PendingWrite&& other);
 
+    size_t EstimateMemoryUsage() const;
+
     DISALLOW_COPY_AND_ASSIGN(PendingWrite);
   };
 
diff --git a/net/spdy/spdy_write_queue_unittest.cc b/net/spdy/spdy_write_queue_unittest.cc
index c3587ac..7318be2 100644
--- a/net/spdy/spdy_write_queue_unittest.cc
+++ b/net/spdy/spdy_write_queue_unittest.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <utility>
 
+#include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_number_conversions.h"
 #include "net/base/request_priority.h"
@@ -61,6 +62,11 @@
     return std::move(buffer_);
   }
 
+  size_t EstimateMemoryUsage() const override {
+    NOTREACHED();
+    return 0;
+  }
+
   static void ConsumeCallback(SpdyWriteQueue* queue,
                               size_t size,
                               SpdyBuffer::ConsumeSource source) {
diff --git a/remoting/host/win/unprivileged_process_delegate.cc b/remoting/host/win/unprivileged_process_delegate.cc
index c9f0041..5c0a6b5 100644
--- a/remoting/host/win/unprivileged_process_delegate.cc
+++ b/remoting/host/win/unprivileged_process_delegate.cc
@@ -26,6 +26,7 @@
 #include "ipc/ipc_channel_proxy.h"
 #include "ipc/ipc_message.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "remoting/base/typed_buffer.h"
 #include "remoting/host/switches.h"
@@ -283,13 +284,10 @@
     return;
   }
 
-  const std::string mojo_child_token = mojo::edk::GenerateRandomToken();
-  const std::string mojo_message_pipe_token = mojo::edk::GenerateRandomToken();
-
+  mojo::edk::PendingProcessConnection process;
+  std::string mojo_message_pipe_token;
   std::unique_ptr<IPC::ChannelProxy> server = IPC::ChannelProxy::Create(
-      mojo::edk::CreateParentMessagePipe(mojo_message_pipe_token,
-                                         mojo_child_token)
-          .release(),
+      process.CreateMessagePipe(&mojo_message_pipe_token).release(),
       IPC::Channel::MODE_SERVER, this, io_task_runner_);
   base::CommandLine command_line(target_command_->argv());
   command_line.AppendSwitchASCII(kMojoPipeToken, mojo_message_pipe_token);
@@ -310,12 +308,10 @@
           token.Get(), &process_attributes, &thread_attributes,
           handles_to_inherit, /* creation_flags= */ 0,
           /* thread_attributes= */ nullptr, &worker_process, &worker_thread)) {
-    mojo::edk::ChildProcessLaunchFailed(mojo_child_token);
     ReportFatalError();
     return;
   }
-  mojo::edk::ChildProcessLaunched(
-      worker_process.Get(), mojo_channel.PassServerHandle(), mojo_child_token);
+  process.Connect(worker_process.Get(), mojo_channel.PassServerHandle());
 
   channel_ = std::move(server);
 
diff --git a/remoting/host/win/wts_session_process_delegate.cc b/remoting/host/win/wts_session_process_delegate.cc
index 635bd04..c665a59c 100644
--- a/remoting/host/win/wts_session_process_delegate.cc
+++ b/remoting/host/win/wts_session_process_delegate.cc
@@ -7,6 +7,7 @@
 
 #include "remoting/host/win/wts_session_process_delegate.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
@@ -27,6 +28,7 @@
 #include "ipc/ipc_message.h"
 #include "mojo/edk/embedder/embedder.h"
 #include "mojo/edk/embedder/named_platform_channel_pair.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/edk/embedder/platform_handle_utils.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
@@ -155,8 +157,8 @@
   // Tracks the id of the worker process.
   base::ProcessId worker_process_pid_ = base::kNullProcessId;
 
-  // The mojo child token for the process being launched.
-  std::string mojo_child_token_;
+  // The pending process connection for the process being launched.
+  std::unique_ptr<mojo::edk::PendingProcessConnection> process_connection_;
 
   DISALLOW_COPY_AND_ASSIGN(Core);
 };
@@ -257,10 +259,7 @@
   channel_.reset();
   elevated_server_handle_.reset();
   elevated_launcher_pid_ = base::kNullProcessId;
-  if (!mojo_child_token_.empty()) {
-    mojo::edk::ChildProcessLaunchFailed(mojo_child_token_);
-    mojo_child_token_.clear();
-  }
+  process_connection_.reset();
 }
 
 void WtsSessionProcessDelegate::Core::KillProcess() {
@@ -391,14 +390,12 @@
                                   target_command_->GetProgram());
   }
 
-  const std::string mojo_message_pipe_token = mojo::edk::GenerateRandomToken();
-  mojo_child_token_ = mojo::edk::GenerateRandomToken();
+  std::string mojo_pipe_token;
+  process_connection_ = base::MakeUnique<mojo::edk::PendingProcessConnection>();
   std::unique_ptr<IPC::ChannelProxy> channel = IPC::ChannelProxy::Create(
-      mojo::edk::CreateParentMessagePipe(mojo_message_pipe_token,
-                                         mojo_child_token_)
-          .release(),
+      process_connection_->CreateMessagePipe(&mojo_pipe_token).release(),
       IPC::Channel::MODE_SERVER, this, io_task_runner_);
-  command_line.AppendSwitchASCII(kMojoPipeToken, mojo_message_pipe_token);
+  command_line.AppendSwitchASCII(kMojoPipeToken, mojo_pipe_token);
 
   std::unique_ptr<mojo::edk::PlatformChannelPair> normal_mojo_channel;
   std::unique_ptr<mojo::edk::NamedPlatformChannelPair> elevated_mojo_channel;
@@ -558,10 +555,8 @@
   DCHECK(caller_task_runner_->BelongsToCurrentThread());
   DCHECK(!worker_process_.IsValid());
 
-  mojo::edk::ChildProcessLaunched(worker_process.Get(),
-                                  std::move(server_handle),
-                                  mojo_child_token_);
-  mojo_child_token_.clear();
+  process_connection_->Connect(worker_process.Get(), std::move(server_handle));
+  process_connection_.reset();
   worker_process_ = std::move(worker_process);
 
   // Report a handle that can be used to wait for the worker process completion,
diff --git a/services/service_manager/README.md b/services/service_manager/README.md
index ce4e2130..bc54399f 100644
--- a/services/service_manager/README.md
+++ b/services/service_manager/README.md
@@ -68,7 +68,7 @@
  every time some other service tries to connect to this one.
 
 Services have a link back to the Service Manager too, primarily in the form of
-the service_manager.mojom.Connector interface. The Connector allows services to 
+the service_manager.mojom.Connector interface. The Connector allows services to
 open connections to other services.
 
 A unique connection from the Service Manager to a service is called an
@@ -140,7 +140,7 @@
 What does all this do? Building the app target produces two files in the output
 directory: Packages/my_service/my_service.library and
 Packages/my_service/manifest.json. app.library is a DSO loaded by the Service
-Manager in its own process when another service connects to the 
+Manager in its own process when another service connects to the
 service:my_service name. This is not the only way (nor even the most likely one)
  you can implement a Service, but it's the simplest and easiest to reason about.
 
@@ -644,29 +644,21 @@
     mojo::edk::HandlePassingInformation info;
     pair.PrepareToPassClientHandleToChildProcess(&target_command_line, &info);
 
-    std::string token = mojo::edk::GenerateRandomToken();
+    mojo::edk::PendingProcessConnection connection;
+    std::string token;
+    mojo::ScopedMessagePipeHandle pipe = connection.CreateMessagePipe(&token);
     target_command_line.AppendSwitchASCII(switches::kPrimordialPipeToken,
                                           token);
 
-    mojo::ScopedMessagePipeHandle pipe =
-        mojo::edk::CreateParentMessagePipe(token);
-
-    service_manager::mojom::ServiceFactoryPtr factory;
-    factory.Bind(
-        mojo::InterfacePtrInfo<service_manager::mojom::ServiceFactory>(
-            std::move(pipe), 0u));
+    service_manager::Identity target("exe:target",
+                                     service_manager::mojom::kInheritUserID);
     service_manager::mojom::PIDReceiverPtr receiver;
-
-    service_manager::Identity target("exe:target",service_manager::mojom::kInheritUserID);
-    service_manager::Connector::ConnectParams params(target);
-    params.set_client_process_connection(std::move(factory),
-                                         MakeRequest(&receiver));
-    std::unique_ptr<service_manager::Connection> connection = connector->Connect(&params);
+    connector->RegisterService(target, std::move(pipe), MakeRequest(&receiver));
 
     base::LaunchOptions options;
     options.handles_to_inherit = &info;
     base::Process process = base::LaunchProcess(target_command_line, options);
-    mojo::edk::ChildProcessLaunched(process.Handle(), pair.PassServerHandle());
+    connection.Connect(process.Handle(), pair.PassServerHandle());
 
 That's a lot. But it boils down to these steps:
 1. Creating the message pipe to connect the target process and the Service
diff --git a/services/service_manager/runner/common/BUILD.gn b/services/service_manager/runner/common/BUILD.gn
index be0442a..c4ba43a1 100644
--- a/services/service_manager/runner/common/BUILD.gn
+++ b/services/service_manager/runner/common/BUILD.gn
@@ -12,12 +12,12 @@
 
   deps = [
     "//base",
-    "//mojo/edk/system",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
   ]
 
   public_deps = [
+    "//mojo/edk/system",
     "//services/service_manager/public/interfaces",
   ]
 }
diff --git a/services/service_manager/runner/common/client_util.cc b/services/service_manager/runner/common/client_util.cc
index 082d306..efbfe42 100644
--- a/services/service_manager/runner/common/client_util.cc
+++ b/services/service_manager/runner/common/client_util.cc
@@ -8,19 +8,18 @@
 
 #include "base/command_line.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "services/service_manager/runner/common/switches.h"
 
 namespace service_manager {
 
 mojom::ServicePtr PassServiceRequestOnCommandLine(
-    base::CommandLine* command_line, const std::string& child_token) {
-  std::string token = mojo::edk::GenerateRandomToken();
-  command_line->AppendSwitchASCII(switches::kPrimordialPipeToken, token);
-
+    mojo::edk::PendingProcessConnection* connection,
+    base::CommandLine* command_line) {
+  std::string token;
   mojom::ServicePtr client;
-  client.Bind(
-      mojom::ServicePtrInfo(
-          mojo::edk::CreateParentMessagePipe(token, child_token), 0));
+  client.Bind(mojom::ServicePtrInfo(connection->CreateMessagePipe(&token), 0));
+  command_line->AppendSwitchASCII(switches::kPrimordialPipeToken, token);
   return client;
 }
 
diff --git a/services/service_manager/runner/common/client_util.h b/services/service_manager/runner/common/client_util.h
index 2ca1213..a29f167 100644
--- a/services/service_manager/runner/common/client_util.h
+++ b/services/service_manager/runner/common/client_util.h
@@ -5,22 +5,27 @@
 #ifndef SERVICES_SERVICE_MANAGER_RUNNER_COMMON_CLIENT_UTIL_H_
 #define SERVICES_SERVICE_MANAGER_RUNNER_COMMON_CLIENT_UTIL_H_
 
-#include <string>
-
 #include "services/service_manager/public/interfaces/service.mojom.h"
 
 namespace base {
 class CommandLine;
 }
 
+namespace mojo {
+namespace edk {
+class PendingProcessConnection;
+}
+}
+
 namespace service_manager {
 
-// Creates a new Service pipe and returns one end of it. The other end is
-// passed via a token in |command_line|. A child of the calling process may
-// extract a ServiceRequest from this by calling
-// GetServiceRequestFromCommandLine().
+// Creates a new Service pipe for connection to a not-yet-launched child process
+// and returns one end of it. The other end is passed via a token in
+// |command_line|. The launched process may extract the corresponding
+// ServiceRequest by calling GetServiceRequestFromCommandLine().
 mojom::ServicePtr PassServiceRequestOnCommandLine(
-    base::CommandLine* command_line, const std::string& child_token);
+    mojo::edk::PendingProcessConnection* connection,
+    base::CommandLine* command_line);
 
 // Extracts a ServiceRequest from the command line of the current process.
 // The parent of this process should have passed a request using
diff --git a/services/service_manager/runner/host/service_process_launcher.cc b/services/service_manager/runner/host/service_process_launcher.cc
index 4bc8a07..759df006 100644
--- a/services/service_manager/runner/host/service_process_launcher.cc
+++ b/services/service_manager/runner/host/service_process_launcher.cc
@@ -47,7 +47,6 @@
       delegate_(delegate),
       start_sandboxed_(false),
       service_path_(service_path),
-      child_token_(mojo::edk::GenerateRandomToken()),
       start_child_process_event_(
           base::WaitableEvent::ResetPolicy::AUTOMATIC,
           base::WaitableEvent::InitialState::NOT_SIGNALED),
@@ -90,8 +89,8 @@
   mojo_ipc_channel_->PrepareToPassClientHandleToChildProcess(
       child_command_line.get(), &handle_passing_info_);
 
-  mojom::ServicePtr client =
-      PassServiceRequestOnCommandLine(child_command_line.get(), child_token_);
+  mojom::ServicePtr client = PassServiceRequestOnCommandLine(
+      &process_connection_, child_command_line.get());
   launch_process_runner_->PostTaskAndReply(
       FROM_HERE,
       base::Bind(&ServiceProcessLauncher::DoLaunch, base::Unretained(this),
@@ -197,11 +196,8 @@
 
     if (mojo_ipc_channel_.get()) {
       mojo_ipc_channel_->ChildProcessLaunched();
-      mojo::edk::ChildProcessLaunched(
-          child_process_.Handle(),
-          mojo::edk::ScopedPlatformHandle(mojo::edk::PlatformHandle(
-              mojo_ipc_channel_->PassServerHandle().release().handle)),
-          child_token_);
+      process_connection_.Connect(child_process_.Handle(),
+                                  mojo_ipc_channel_->PassServerHandle());
     }
   }
   start_child_process_event_.Signal();
diff --git a/services/service_manager/runner/host/service_process_launcher.h b/services/service_manager/runner/host/service_process_launcher.h
index d117f7c..39afe1f 100644
--- a/services/service_manager/runner/host/service_process_launcher.h
+++ b/services/service_manager/runner/host/service_process_launcher.h
@@ -15,6 +15,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/process/process.h"
 #include "base/synchronization/waitable_event.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "services/service_manager/public/interfaces/service_factory.mojom.h"
 
@@ -83,7 +84,7 @@
   // Used to initialize the Mojo IPC channel between parent and child.
   std::unique_ptr<mojo::edk::PlatformChannelPair> mojo_ipc_channel_;
   mojo::edk::HandlePassingInformation handle_passing_info_;
-  const std::string child_token_;
+  mojo::edk::PendingProcessConnection process_connection_;
 
   // Since Start() calls a method on another thread, we use an event to block
   // the main thread if it tries to destruct |this| while launching the process.
diff --git a/services/service_manager/tests/service_manager/service_manager_unittest.cc b/services/service_manager/tests/service_manager/service_manager_unittest.cc
index 39a21eca..8708856 100644
--- a/services/service_manager/tests/service_manager/service_manager_unittest.cc
+++ b/services/service_manager/tests/service_manager/service_manager_unittest.cc
@@ -20,6 +20,7 @@
 #include "base/process/process_handle.h"
 #include "base/run_loop.h"
 #include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/pending_process_connection.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
@@ -176,10 +177,10 @@
     platform_channel_pair.PrepareToPassClientHandleToChildProcess(
         &child_command_line, &handle_passing_info);
 
-    std::string child_token = mojo::edk::GenerateRandomToken();
+    mojo::edk::PendingProcessConnection process_connection;
     service_manager::mojom::ServicePtr client =
-        service_manager::PassServiceRequestOnCommandLine(&child_command_line,
-                                                         child_token);
+        service_manager::PassServiceRequestOnCommandLine(&process_connection,
+                                                         &child_command_line);
     service_manager::mojom::PIDReceiverPtr receiver;
 
     service_manager::Identity target("service_manager_unittest_target",
@@ -201,9 +202,8 @@
     target_ = base::LaunchProcess(child_command_line, options);
     DCHECK(target_.IsValid());
     receiver->SetPID(target_.Pid());
-    mojo::edk::ChildProcessLaunched(target_.Handle(),
-                                    platform_channel_pair.PassServerHandle(),
-                                    child_token);
+    process_connection.Connect(target_.Handle(),
+                               platform_channel_pair.PassServerHandle());
   }
 
   void KillTarget() {
diff --git a/services/service_manager/tests/util.cc b/services/service_manager/tests/util.cc
index 98bc47de..b12f6dbf 100644
--- a/services/service_manager/tests/util.cc
+++ b/services/service_manager/tests/util.cc
@@ -58,16 +58,11 @@
   platform_channel_pair.PrepareToPassClientHandleToChildProcess(
       &child_command_line, &handle_passing_info);
 
-  // Generate a token for the child to find and connect to a primordial pipe
-  // and pass that as well.
-  std::string primordial_pipe_token = mojo::edk::GenerateRandomToken();
-  child_command_line.AppendSwitchASCII(switches::kPrimordialPipeToken,
-                                        primordial_pipe_token);
-
-  // Allocate the pipe locally.
-  std::string child_token = mojo::edk::GenerateRandomToken();
+  mojo::edk::PendingProcessConnection pending_process;
+  std::string token;
   mojo::ScopedMessagePipeHandle pipe =
-      mojo::edk::CreateParentMessagePipe(primordial_pipe_token, child_token);
+      pending_process.CreateMessagePipe(&token);
+  child_command_line.AppendSwitchASCII(switches::kPrimordialPipeToken, token);
 
   service_manager::mojom::ServicePtr client;
   client.Bind(mojo::InterfacePtrInfo<service_manager::mojom::Service>(
@@ -94,9 +89,8 @@
   *process = base::LaunchProcess(child_command_line, options);
   DCHECK(process->IsValid());
   receiver->SetPID(process->Pid());
-  mojo::edk::ChildProcessLaunched(process->Handle(),
-                                  platform_channel_pair.PassServerHandle(),
-                                  child_token);
+  pending_process.Connect(process->Handle(),
+                          platform_channel_pair.PassServerHandle());
   return connection;
 }
 
diff --git a/services/ui/public/interfaces/window_tree.mojom b/services/ui/public/interfaces/window_tree.mojom
index e606490..ab53d13 100644
--- a/services/ui/public/interfaces/window_tree.mojom
+++ b/services/ui/public/interfaces/window_tree.mojom
@@ -416,6 +416,7 @@
   // |matches_pointer_watcher|.
   OnWindowInputEvent(uint32 event_id,
                      uint32 window,
+                     int64 display_id,
                      ui.mojom.Event event,
                      bool matches_pointer_watcher);
 
@@ -424,7 +425,9 @@
   // StartPointerWatcher() for details. |window_id| is the window id of the
   // event target, or 0 if the window is not known to this client. The
   // client should not acknowledge these events.
-  OnPointerEventObserved(ui.mojom.Event event, uint32 window_id);
+  OnPointerEventObserved(ui.mojom.Event event,
+                         uint32 window_id,
+                         int64 display_id);
 
   // Called in two distinct cases: when a window known to the connection gains
   // focus, or when focus moves from a window known to the connection to a
diff --git a/services/ui/ws/display.cc b/services/ui/ws/display.cc
index 68e8657..b3981b8 100644
--- a/services/ui/ws/display.cc
+++ b/services/ui/ws/display.cc
@@ -284,7 +284,7 @@
 void Display::OnEvent(const ui::Event& event) {
   WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot();
   if (display_root)
-    display_root->window_manager_state()->ProcessEvent(event);
+    display_root->window_manager_state()->ProcessEvent(event, GetId());
   window_server_
       ->GetUserActivityMonitorForUser(
           window_server_->user_id_tracker()->active_id())
diff --git a/services/ui/ws/test_utils.cc b/services/ui/ws/test_utils.cc
index c906176..914a72f 100644
--- a/services/ui/ws/test_utils.cc
+++ b/services/ui/ws/test_utils.cc
@@ -359,6 +359,7 @@
 
 void TestWindowTreeClient::OnWindowInputEvent(uint32_t event_id,
                                               uint32_t window,
+                                              int64_t display_id,
                                               std::unique_ptr<ui::Event> event,
                                               bool matches_pointer_watcher) {
   tracker_.OnWindowInputEvent(window, *event.get(), matches_pointer_watcher);
@@ -366,7 +367,8 @@
 
 void TestWindowTreeClient::OnPointerEventObserved(
     std::unique_ptr<ui::Event> event,
-    uint32_t window_id) {
+    uint32_t window_id,
+    int64_t display_id) {
   tracker_.OnPointerEventObserved(*event.get(), window_id);
 }
 
diff --git a/services/ui/ws/test_utils.h b/services/ui/ws/test_utils.h
index 29d65cd..b6fc6d8 100644
--- a/services/ui/ws/test_utils.h
+++ b/services/ui/ws/test_utils.h
@@ -207,7 +207,9 @@
     return wms_->GetEventTargetClientId(window, in_nonclient_area);
   }
 
-  void ProcessEvent(const ui::Event& event) { wms_->ProcessEvent(event); }
+  void ProcessEvent(const ui::Event& event, int64_t display_id = 0) {
+    wms_->ProcessEvent(event, display_id);
+  }
 
   void OnEventAckTimeout(ClientSpecificId client_id) {
     wms_->OnEventAckTimeout(client_id);
@@ -219,7 +221,8 @@
   }
 
   WindowTree* tree_awaiting_input_ack() {
-    return wms_->tree_awaiting_input_ack_;
+    return wms_->in_flight_event_details_ ? wms_->in_flight_event_details_->tree
+                                          : nullptr;
   }
 
  private:
@@ -442,10 +445,12 @@
       const base::Optional<std::vector<uint8_t>>& new_data) override;
   void OnWindowInputEvent(uint32_t event_id,
                           uint32_t window,
+                          int64_t display_id,
                           std::unique_ptr<ui::Event> event,
                           bool matches_pointer_watcher) override;
   void OnPointerEventObserved(std::unique_ptr<ui::Event> event,
-                              uint32_t window_id) override;
+                              uint32_t window_id,
+                              int64_t display_id) override;
   void OnWindowFocused(uint32_t focused_window_id) override;
   void OnWindowPredefinedCursorChanged(uint32_t window_id,
                                        mojom::Cursor cursor_id) override;
diff --git a/services/ui/ws/window_manager_state.cc b/services/ui/ws/window_manager_state.cc
index d1725e8..76c5684e 100644
--- a/services/ui/ws/window_manager_state.cc
+++ b/services/ui/ws/window_manager_state.cc
@@ -67,6 +67,18 @@
 
 }  // namespace
 
+WindowManagerState::InFlightEventDetails::InFlightEventDetails(
+    WindowTree* tree,
+    int64_t display_id,
+    const Event& event,
+    EventDispatchPhase phase)
+    : tree(tree),
+      display_id(display_id),
+      event(Event::Clone(event)),
+      phase(phase) {}
+
+WindowManagerState::InFlightEventDetails::~InFlightEventDetails() {}
+
 class WindowManagerState::ProcessedEventTarget {
  public:
   ProcessedEventTarget(ServerWindow* window,
@@ -169,9 +181,10 @@
     const std::unordered_map<std::string, std::vector<uint8_t>>& drag_data,
     uint32_t drag_operation) {
   int32_t drag_pointer = PointerEvent::kMousePointerId;
-  if (event_awaiting_input_ack_ &&
-      event_awaiting_input_ack_->IsPointerEvent()) {
-    drag_pointer = event_awaiting_input_ack_->AsPointerEvent()->pointer_id();
+  if (in_flight_event_details_ &&
+      in_flight_event_details_->event->IsPointerEvent()) {
+    drag_pointer =
+        in_flight_event_details_->event->AsPointerEvent()->pointer_id();
   } else {
     NOTIMPLEMENTED() << "Set drag drop set up during something other than a "
                      << "pointer event; rejecting drag.";
@@ -205,15 +218,15 @@
 void WindowManagerState::OnWillDestroyTree(WindowTree* tree) {
   event_dispatcher_.OnWillDestroyDragTargetConnection(tree);
 
-  if (tree_awaiting_input_ack_ != tree)
+  if (!in_flight_event_details_ || in_flight_event_details_->tree != tree)
     return;
 
   // The WindowTree is dying. So it's not going to ack the event.
   // If the dying tree matches the root |tree_| marked as handled so we don't
   // notify it of accelerators.
-  OnEventAck(tree_awaiting_input_ack_, tree == window_tree_
-                                           ? mojom::EventResult::HANDLED
-                                           : mojom::EventResult::UNHANDLED);
+  OnEventAck(in_flight_event_details_->tree,
+             tree == window_tree_ ? mojom::EventResult::HANDLED
+                                  : mojom::EventResult::UNHANDLED);
 }
 
 ServerWindow* WindowManagerState::GetOrphanedRootWithId(const WindowId& id) {
@@ -243,66 +256,68 @@
   event_queue.swap(event_queue_);
 }
 
-void WindowManagerState::ProcessEvent(const ui::Event& event) {
+void WindowManagerState::ProcessEvent(const ui::Event& event,
+                                      int64_t display_id) {
   // If this is still waiting for an ack from a previously sent event, then
   // queue up the event to be dispatched once the ack is received.
-  if (event_ack_timer_.IsRunning()) {
+  if (in_flight_event_details_) {
     if (!event_queue_.empty() && !event_queue_.back()->processed_target &&
         EventsCanBeCoalesced(*event_queue_.back()->event, event)) {
       event_queue_.back()->event = CoalesceEvents(
           std::move(event_queue_.back()->event), ui::Event::Clone(event));
+      event_queue_.back()->display_id = display_id;
       return;
     }
-    QueueEvent(event, nullptr);
+    QueueEvent(event, nullptr, display_id);
     return;
   }
 
-  ProcessEventImpl(event);
+  ProcessEventImpl(event, display_id);
 }
 
 void WindowManagerState::OnEventAck(mojom::WindowTree* tree,
                                     mojom::EventResult result) {
-  if (tree_awaiting_input_ack_ != tree ||
-      event_dispatch_phase_ != EventDispatchPhase::TARGET) {
+  if (!in_flight_event_details_ || in_flight_event_details_->tree != tree ||
+      in_flight_event_details_->phase != EventDispatchPhase::TARGET) {
     // TODO(sad): The ack must have arrived after the timeout. We should do
     // something here, and in OnEventAckTimeout().
     return;
   }
-  tree_awaiting_input_ack_ = nullptr;
-  event_ack_timer_.Stop();
+  std::unique_ptr<InFlightEventDetails> details =
+      std::move(in_flight_event_details_);
 
   base::WeakPtr<Accelerator> post_target_accelerator = post_target_accelerator_;
   post_target_accelerator_.reset();
-  std::unique_ptr<ui::Event> event = std::move(event_awaiting_input_ack_);
 
   if (result == mojom::EventResult::UNHANDLED && post_target_accelerator) {
-    OnAccelerator(post_target_accelerator->id(), *event,
+    OnAccelerator(post_target_accelerator->id(), *details->event,
                   AcceleratorPhase::POST);
   }
 
-  event_dispatch_phase_ = EventDispatchPhase::NONE;
   ProcessNextEventFromQueue();
 }
 
 void WindowManagerState::OnAcceleratorAck(mojom::EventResult result) {
-  if (event_dispatch_phase_ != EventDispatchPhase::PRE_TARGET_ACCELERATOR) {
+  if (!in_flight_event_details_ ||
+      in_flight_event_details_->phase !=
+          EventDispatchPhase::PRE_TARGET_ACCELERATOR) {
     // TODO(sad): The ack must have arrived after the timeout. We should do
     // something here, and in OnEventAckTimeout().
     return;
   }
 
-  tree_awaiting_input_ack_ = nullptr;
-  event_ack_timer_.Stop();
-  event_dispatch_phase_ = EventDispatchPhase::NONE;
-  std::unique_ptr<ui::Event> event = std::move(event_awaiting_input_ack_);
+  std::unique_ptr<InFlightEventDetails> details =
+      std::move(in_flight_event_details_);
 
   if (result == mojom::EventResult::UNHANDLED) {
+    event_processing_display_id_ = details->display_id;
     event_dispatcher_.ProcessEvent(
-        *event, EventDispatcher::AcceleratorMatchPhase::POST_ONLY);
+        *details->event, EventDispatcher::AcceleratorMatchPhase::POST_ONLY);
   } else {
     // We're not going to process the event any further, notify event observers.
     // We don't do this first to ensure we don't send an event twice to clients.
-    window_server()->SendToPointerWatchers(*event, user_id(), nullptr, nullptr);
+    window_server()->SendToPointerWatchers(*details->event, user_id(), nullptr,
+                                           nullptr, details->display_id);
     ProcessNextEventFromQueue();
   }
 }
@@ -363,25 +378,33 @@
   WindowTree* hung_tree = window_server()->GetTreeWithId(client_id);
   if (hung_tree && !hung_tree->janky())
     window_tree_->ClientJankinessChanged(hung_tree);
-  if (event_dispatch_phase_ == EventDispatchPhase::PRE_TARGET_ACCELERATOR)
+  if (in_flight_event_details_->phase ==
+      EventDispatchPhase::PRE_TARGET_ACCELERATOR) {
     OnAcceleratorAck(mojom::EventResult::UNHANDLED);
-  else
-    OnEventAck(tree_awaiting_input_ack_, mojom::EventResult::UNHANDLED);
+  } else {
+    OnEventAck(
+        in_flight_event_details_ ? in_flight_event_details_->tree : nullptr,
+        mojom::EventResult::UNHANDLED);
+  }
 }
 
-void WindowManagerState::ProcessEventImpl(const ui::Event& event) {
+void WindowManagerState::ProcessEventImpl(const ui::Event& event,
+                                          int64_t display_id) {
   // Debug accelerators are always checked and don't interfere with processing.
   ProcessDebugAccelerator(event);
+  event_processing_display_id_ = display_id;
   event_dispatcher_.ProcessEvent(event,
                                  EventDispatcher::AcceleratorMatchPhase::ANY);
 }
 
 void WindowManagerState::QueueEvent(
     const ui::Event& event,
-    std::unique_ptr<ProcessedEventTarget> processed_event_target) {
+    std::unique_ptr<ProcessedEventTarget> processed_event_target,
+    int64_t display_id) {
   std::unique_ptr<QueuedEvent> queued_event(new QueuedEvent);
   queued_event->event = ui::Event::Clone(event);
   queued_event->processed_target = std::move(processed_event_target);
+  queued_event->display_id = display_id;
   event_queue_.push(std::move(queued_event));
 }
 
@@ -392,7 +415,7 @@
     std::unique_ptr<QueuedEvent> queued_event = std::move(event_queue_.front());
     event_queue_.pop();
     if (!queued_event->processed_target) {
-      ProcessEventImpl(*queued_event->event);
+      ProcessEventImpl(*queued_event->event, queued_event->display_id);
       return;
     }
     if (queued_event->processed_target->IsValid()) {
@@ -410,7 +433,8 @@
     ClientSpecificId client_id,
     const ui::Event& event,
     base::WeakPtr<Accelerator> accelerator) {
-  if (target && target->parent() == nullptr)
+  DCHECK(target);
+  if (target->parent() == nullptr)
     target = GetWindowManagerRoot(target);
 
   if (event.IsMousePointerEvent()) {
@@ -418,19 +442,16 @@
     UpdateNativeCursorFromDispatcher();
   }
 
-  event_dispatch_phase_ = EventDispatchPhase::TARGET;
-
   WindowTree* tree = window_server()->GetTreeWithId(client_id);
   DCHECK(tree);
-  ScheduleInputEventTimeout(tree);
-
-  event_awaiting_input_ack_ = ui::Event::Clone(event);
+  ScheduleInputEventTimeout(tree, target, event, EventDispatchPhase::TARGET);
 
   if (accelerator)
     post_target_accelerator_ = accelerator;
 
   // Ignore |tree| because it will receive the event via normal dispatch.
-  window_server()->SendToPointerWatchers(event, user_id(), target, tree);
+  window_server()->SendToPointerWatchers(event, user_id(), target, tree,
+                                         in_flight_event_details_->display_id);
 
   tree->DispatchInputEvent(target, event);
 }
@@ -469,16 +490,22 @@
 #endif
 }
 
-void WindowManagerState::ScheduleInputEventTimeout(WindowTree* tree) {
+void WindowManagerState::ScheduleInputEventTimeout(WindowTree* tree,
+                                                   ServerWindow* target,
+                                                   const Event& event,
+                                                   EventDispatchPhase phase) {
+  std::unique_ptr<InFlightEventDetails> details =
+      base::MakeUnique<InFlightEventDetails>(tree, event_processing_display_id_,
+                                             event, phase);
+
   // TOOD(sad): Adjust this delay, possibly make this dynamic.
   const base::TimeDelta max_delay = base::debug::BeingDebugged()
                                         ? base::TimeDelta::FromDays(1)
                                         : GetDefaultAckTimerDelay();
-  event_ack_timer_.Start(FROM_HERE, max_delay,
-                         base::Bind(&WindowManagerState::OnEventAckTimeout,
-                                    weak_factory_.GetWeakPtr(), tree->id()));
-
-  tree_awaiting_input_ack_ = tree;
+  details->timer.Start(FROM_HERE, max_delay,
+                       base::Bind(&WindowManagerState::OnEventAckTimeout,
+                                  weak_factory_.GetWeakPtr(), tree->id()));
+  in_flight_event_details_ = std::move(details);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -490,10 +517,9 @@
   DCHECK(IsActive());
   const bool needs_ack = phase == AcceleratorPhase::PRE;
   if (needs_ack) {
-    DCHECK_EQ(EventDispatchPhase::NONE, event_dispatch_phase_);
-    event_dispatch_phase_ = EventDispatchPhase::PRE_TARGET_ACCELERATOR;
-    event_awaiting_input_ack_ = ui::Event::Clone(event);
-    ScheduleInputEventTimeout(window_tree_);
+    DCHECK(!in_flight_event_details_);
+    ScheduleInputEventTimeout(window_tree_, nullptr, event,
+                              EventDispatchPhase::PRE_TARGET_ACCELERATOR);
   }
   window_tree_->OnAccelerator(accelerator_id, event, needs_ack);
 }
@@ -553,10 +579,11 @@
   DCHECK(IsActive());
   // TODO(sky): this needs to see if another wms has capture and if so forward
   // to it.
-  if (event_ack_timer_.IsRunning()) {
+  if (in_flight_event_details_) {
     std::unique_ptr<ProcessedEventTarget> processed_event_target(
         new ProcessedEventTarget(target, client_id, accelerator));
-    QueueEvent(event, std::move(processed_event_target));
+    QueueEvent(event, std::move(processed_event_target),
+               event_processing_display_id_);
     return;
   }
 
@@ -625,7 +652,8 @@
 
 void WindowManagerState::OnEventTargetNotFound(const ui::Event& event) {
   window_server()->SendToPointerWatchers(event, user_id(), nullptr, /* window */
-                                         nullptr /* ignore_tree */);
+                                         nullptr /* ignore_tree */,
+                                         event_processing_display_id_);
   if (event.IsMousePointerEvent())
     UpdateNativeCursorFromDispatcher();
 }
diff --git a/services/ui/ws/window_manager_state.h b/services/ui/ws/window_manager_state.h
index 88f0921..67a343b5 100644
--- a/services/ui/ws/window_manager_state.h
+++ b/services/ui/ws/window_manager_state.h
@@ -92,7 +92,7 @@
   void Deactivate();
 
   // Processes an event from PlatformDisplay.
-  void ProcessEvent(const ui::Event& event);
+  void ProcessEvent(const Event& event, int64_t display_id);
 
   // Called when the ack from an event dispatched to WindowTree |tree| is
   // received.
@@ -117,10 +117,10 @@
   };
 
   struct DebugAccelerator {
-    bool Matches(const ui::KeyEvent& event) const;
+    bool Matches(const KeyEvent& event) const;
 
     DebugAcceleratorType type;
-    ui::KeyboardCode key_code;
+    KeyboardCode key_code;
     int event_flags;
   };
 
@@ -147,8 +147,24 @@
     QueuedEvent();
     ~QueuedEvent();
 
-    std::unique_ptr<ui::Event> event;
+    std::unique_ptr<Event> event;
     std::unique_ptr<ProcessedEventTarget> processed_target;
+    int64_t display_id;
+  };
+
+  // Tracks state associated with an event being dispatched to a client.
+  struct InFlightEventDetails {
+    InFlightEventDetails(WindowTree* tree,
+                         int64_t display_id,
+                         const Event& event,
+                         EventDispatchPhase phase);
+    ~InFlightEventDetails();
+
+    base::OneShotTimer timer;
+    WindowTree* tree;
+    int64_t display_id;
+    std::unique_ptr<Event> event;
+    EventDispatchPhase phase;
   };
 
   const WindowServer* window_server() const;
@@ -178,11 +194,12 @@
 
   // Implemenation of processing an event with a match phase of all. This
   // handles debug accelerators and forwards to EventDispatcher.
-  void ProcessEventImpl(const ui::Event& event);
+  void ProcessEventImpl(const Event& event, int64_t display_id);
 
   // Schedules an event to be processed later.
-  void QueueEvent(const ui::Event& event,
-                  std::unique_ptr<ProcessedEventTarget> processed_event_target);
+  void QueueEvent(const Event& event,
+                  std::unique_ptr<ProcessedEventTarget> processed_event_target,
+                  int64_t display_id);
 
   // Processes the next valid event in |event_queue_|. If the event has already
   // been processed it is dispatched, otherwise the event is passed to the
@@ -192,7 +209,7 @@
   // Dispatches the event to the appropriate client and starts the ack timer.
   void DispatchInputEventToWindowImpl(ServerWindow* target,
                                       ClientSpecificId client_id,
-                                      const ui::Event& event,
+                                      const Event& event,
                                       base::WeakPtr<Accelerator> accelerator);
 
   // Registers accelerators used internally for debugging.
@@ -200,17 +217,20 @@
 
   // Finds the debug accelerator for |event| and if one is found calls
   // HandleDebugAccelerator().
-  void ProcessDebugAccelerator(const ui::Event& event);
+  void ProcessDebugAccelerator(const Event& event);
 
   // Runs the specified debug accelerator.
   void HandleDebugAccelerator(DebugAcceleratorType type);
 
   // Called when waiting for an event or accelerator to be processed by |tree|.
-  void ScheduleInputEventTimeout(WindowTree* tree);
+  void ScheduleInputEventTimeout(WindowTree* tree,
+                                 ServerWindow* target,
+                                 const Event& event,
+                                 EventDispatchPhase phase);
 
   // EventDispatcherDelegate:
   void OnAccelerator(uint32_t accelerator_id,
-                     const ui::Event& event,
+                     const Event& event,
                      AcceleratorPhase phase) override;
   void SetFocusedWindowFromEventDispatcher(ServerWindow* window) override;
   ServerWindow* GetFocusedWindowForEventDispatcher() override;
@@ -222,12 +242,12 @@
   void OnMouseCursorLocationChanged(const gfx::Point& point) override;
   void DispatchInputEventToWindow(ServerWindow* target,
                                   ClientSpecificId client_id,
-                                  const ui::Event& event,
+                                  const Event& event,
                                   Accelerator* accelerator) override;
   ClientSpecificId GetEventTargetClientId(const ServerWindow* window,
                                           bool in_nonclient_area) override;
   ServerWindow* GetRootWindowContaining(gfx::Point* location) override;
-  void OnEventTargetNotFound(const ui::Event& event) override;
+  void OnEventTargetNotFound(const Event& event) override;
 
   // ServerWindowObserver:
   void OnWindowEmbeddedAppDisconnected(ServerWindow* window) override;
@@ -240,17 +260,15 @@
   bool got_frame_decoration_values_ = false;
   mojom::FrameDecorationValuesPtr frame_decoration_values_;
 
-  EventDispatchPhase event_dispatch_phase_ = EventDispatchPhase::NONE;
-  // The tree we're waiting to process the current accelerator or event.
-  WindowTree* tree_awaiting_input_ack_ = nullptr;
-  // The event we're awaiting an accelerator or input ack from.
-  std::unique_ptr<ui::Event> event_awaiting_input_ack_;
   base::WeakPtr<Accelerator> post_target_accelerator_;
   std::queue<std::unique_ptr<QueuedEvent>> event_queue_;
-  base::OneShotTimer event_ack_timer_;
 
   std::vector<DebugAccelerator> debug_accelerators_;
 
+  // If non-null we're actively waiting for a response from a client for an
+  // event.
+  std::unique_ptr<InFlightEventDetails> in_flight_event_details_;
+
   EventDispatcher event_dispatcher_;
 
   // PlatformDisplay that currently has capture.
@@ -259,6 +277,9 @@
   // All the active WindowManagerDisplayRoots.
   WindowManagerDisplayRoots window_manager_display_roots_;
 
+  // Id of the display the current event being processed originated from.
+  int64_t event_processing_display_id_ = 0;
+
   // Set of WindowManagerDisplayRoots corresponding to Displays that have been
   // destroyed. WindowManagerDisplayRoots are not destroyed immediately when
   // the Display is destroyed to allow the client to destroy the window when it
diff --git a/services/ui/ws/window_manager_state_unittest.cc b/services/ui/ws/window_manager_state_unittest.cc
index 7a502a9..d9910245 100644
--- a/services/ui/ws/window_manager_state_unittest.cc
+++ b/services/ui/ws/window_manager_state_unittest.cc
@@ -239,7 +239,7 @@
 
   // Send an ensure only the pre accelerator is called.
   ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
-  window_manager_state()->ProcessEvent(key);
+  window_manager_state()->ProcessEvent(key, 0);
   EXPECT_TRUE(window_manager()->on_accelerator_called());
   EXPECT_EQ(accelerator_id, window_manager()->on_accelerator_id());
   EXPECT_TRUE(tracker->changes()->empty());
@@ -254,7 +254,7 @@
   window_manager()->ClearAcceleratorCalled();
 
   // Repeat, but respond with UNHANDLED.
-  window_manager_state()->ProcessEvent(key);
+  window_manager_state()->ProcessEvent(key, 0);
   EXPECT_TRUE(window_manager()->on_accelerator_called());
   EXPECT_EQ(accelerator_id, window_manager()->on_accelerator_id());
   EXPECT_TRUE(tracker->changes()->empty());
@@ -583,7 +583,7 @@
       ui::ET_POINTER_MOVED, gfx::Point(25, 25), gfx::Point(25, 25), 0, 0, 0,
       ui::PointerDetails(EventPointerType::POINTER_TYPE_MOUSE),
       base::TimeTicks());
-  window_manager_state()->ProcessEvent(move);
+  window_manager_state()->ProcessEvent(move, 0);
   // The event isn't over a valid target, which should trigger resetting the
   // cursor to POINTER.
   EXPECT_EQ(ui::mojom::Cursor::POINTER, display_test_api.last_cursor());
diff --git a/services/ui/ws/window_server.cc b/services/ui/ws/window_server.cc
index 9ab1795..b96c0c98 100644
--- a/services/ui/ws/window_server.cc
+++ b/services/ui/ws/window_server.cc
@@ -425,11 +425,12 @@
 void WindowServer::SendToPointerWatchers(const ui::Event& event,
                                          const UserId& user_id,
                                          ServerWindow* target_window,
-                                         WindowTree* ignore_tree) {
+                                         WindowTree* ignore_tree,
+                                         int64_t display_id) {
   for (auto& pair : tree_map_) {
     WindowTree* tree = pair.second.get();
     if (tree->user_id() == user_id && tree != ignore_tree)
-      tree->SendToPointerWatcher(event, target_window);
+      tree->SendToPointerWatcher(event, target_window, display_id);
   }
 }
 
diff --git a/services/ui/ws/window_server.h b/services/ui/ws/window_server.h
index 32fc0d66..26bcfbd5 100644
--- a/services/ui/ws/window_server.h
+++ b/services/ui/ws/window_server.h
@@ -195,7 +195,8 @@
   void SendToPointerWatchers(const ui::Event& event,
                              const UserId& user_id,
                              ServerWindow* target_window,
-                             WindowTree* ignore_tree);
+                             WindowTree* ignore_tree,
+                             int64_t display_id);
 
   // Sets a callback to be called whenever a ServerWindow is scheduled for
   // a [re]paint. This should only be called in a test configuration.
diff --git a/services/ui/ws/window_tree.cc b/services/ui/ws/window_tree.cc
index 5322466..ce6c4a6 100644
--- a/services/ui/ws/window_tree.cc
+++ b/services/ui/ws/window_tree.cc
@@ -798,7 +798,8 @@
 }
 
 void WindowTree::SendToPointerWatcher(const ui::Event& event,
-                                      ServerWindow* target_window) {
+                                      ServerWindow* target_window,
+                                      int64_t display_id) {
   if (!EventMatchesPointerWatcher(event))
     return;
 
@@ -806,8 +807,8 @@
   // Ignore the return value from IsWindowKnown() as in the case of the client
   // not knowing the window we'll send 0, which corresponds to no window.
   IsWindowKnown(target_window, &client_window_id);
-  client()->OnPointerEventObserved(ui::Event::Clone(event),
-                                   client_window_id.id);
+  client()->OnPointerEventObserved(ui::Event::Clone(event), client_window_id.id,
+                                   display_id);
 }
 
 bool WindowTree::ShouldRouteToWindowManager(const ServerWindow* window) const {
@@ -1146,8 +1147,10 @@
   // Should only get events from windows attached to a host.
   DCHECK(event_source_wms_);
   bool matched_pointer_watcher = EventMatchesPointerWatcher(event);
+  Display* display = GetDisplay(target);
+  DCHECK(display);
   client()->OnWindowInputEvent(
-      event_ack_id_, ClientWindowIdForWindow(target).id,
+      event_ack_id_, ClientWindowIdForWindow(target).id, display->GetId(),
       ui::Event::Clone(event), matched_pointer_watcher);
 }
 
diff --git a/services/ui/ws/window_tree.h b/services/ui/ws/window_tree.h
index ea6dd8b..0c54d29 100644
--- a/services/ui/ws/window_tree.h
+++ b/services/ui/ws/window_tree.h
@@ -264,7 +264,8 @@
   // |target_window| is the target of the event, and may be null or not known
   // to this tree.
   void SendToPointerWatcher(const ui::Event& event,
-                            ServerWindow* target_window);
+                            ServerWindow* target_window,
+                            int64_t display_id);
 
  private:
   friend class test::WindowTreeTestApi;
diff --git a/services/ui/ws/window_tree_client_unittest.cc b/services/ui/ws/window_tree_client_unittest.cc
index 134c342..916a8e5 100644
--- a/services/ui/ws/window_tree_client_unittest.cc
+++ b/services/ui/ws/window_tree_client_unittest.cc
@@ -352,6 +352,7 @@
   }
   void OnWindowInputEvent(uint32_t event_id,
                           Id window_id,
+                          int64_t display_id,
                           std::unique_ptr<ui::Event> event,
                           bool matches_pointer_watcher) override {
     // Ack input events to clear the state on the server. These can be received
@@ -362,7 +363,8 @@
     // may come in at random points.
   }
   void OnPointerEventObserved(std::unique_ptr<ui::Event>,
-                              uint32_t window_id) override {}
+                              uint32_t window_id,
+                              int64_t display_id) override {}
   void OnWindowSharedPropertyChanged(
       uint32_t window,
       const std::string& name,
diff --git a/styleguide/java/OWNERS b/styleguide/java/OWNERS
new file mode 100644
index 0000000..137bf18
--- /dev/null
+++ b/styleguide/java/OWNERS
@@ -0,0 +1,5 @@
+agrieve@chromium.org
+dfalcantara@chromium.org
+nyquist@chromium.org
+tedchoc@chromium.org
+yfriedman@chromium.org
diff --git a/styleguide/java/java.md b/styleguide/java/java.md
new file mode 100644
index 0000000..ad1a1ba2
--- /dev/null
+++ b/styleguide/java/java.md
@@ -0,0 +1,71 @@
+# Chromium Java style guide
+
+_For other languages, please see the [Chromium style
+guides](https://chromium.googlesource.com/chromium/src/+/master/styleguide/styleguide.md)._
+
+Chromium follows the [Android Open Source style
+guide](http://source.android.com/source/code-style.html) unless an exception
+is listed below.
+
+## Style
+
+* Copyright header should use
+  [Chromium](https://chromium.googlesource.com/chromium/src/+/master/styleguide/styleguide.md)
+  style.
+* TODO should follow chromium convention i.e. `TODO(username)`.
+* Use of ```assert``` statements are encouraged.
+* Fields should not be explicitly initialized to default values (see
+  [here](https://groups.google.com/a/chromium.org/d/topic/chromium-dev/ylbLOvLs0bs/discussion)).
+* For automated style checking install
+  [checkstyle](https://sites.google.com/a/chromium.org/dev/developers/checkstyle).
+
+## Location
+
+"Top level directories" are defined as directories with a GN file, such as
+[//base](https://chromium.googlesource.com/chromium/src/+/master/base/)
+and
+[//content](https://chromium.googlesource.com/chromium/src/+/master/content/),
+Chromium Java should live in a directory named
+`<top level directory>/android/java`, with a package name
+`org.chromium.<top level directory>`.  Each top level directory's Java should
+build into a distinct JAR that honors the abstraction specified in a native
+[checkdeps](https://chromium.googlesource.com/chromium/buildtools/+/master/checkdeps/checkdeps.py)
+(e.g. `org.chromium.base` does not import `org.chromium.content`).  The full
+path of any java file should contain the complete package name.
+
+For example, top level directory `//base` might contain a file named
+`base/android/java/org/chromium/base/Class.java`. This would get compiled into a
+`chromium_base.jar` (final JAR name TBD).
+
+`org.chromium.chrome.browser.foo.Class` would live in
+`chrome/android/java/org/chromium/chrome/browser/foo/Class.java`.
+
+New `<top level directory>/android` directories should have an `OWNERS` file
+much like
+[//base/android/OWNERS](https://chromium.googlesource.com/chromium/src/+/master/base/android/OWNERS).
+
+## Asserts
+
+The Chromium build system strips asserts in release builds (via ProGuard) and
+enables them in debug builds (or when `dcheck_always_on=true`) (via a [build
+step](https://codereview.chromium.org/2517203002)). You should use asserts in
+the [same
+scenarios](https://chromium.googlesource.com/chromium/src/+/master/styleguide/c++/c++.md#CHECK_DCHECK_and-NOTREACHED)
+where C++ DCHECK()s make sense. For multi-statement asserts, use
+`org.chromium.base.BuildConfig.DCHECK_IS_ON` to guard your code.
+
+Example assert:
+
+```java
+assert someCallWithSideEffects() : "assert description";
+```
+
+Example use of `DCHECK_IS_ON`:
+
+```java
+if (org.chromium.base.BuildConfig.DCHECK_IS_ON) {
+   if (!someCallWithSideEffects()) {
+     throw new AssertionError("assert description");
+   }
+}
+```
diff --git a/styleguide/styleguide.md b/styleguide/styleguide.md
index 9fa42482..f9aee62 100644
--- a/styleguide/styleguide.md
+++ b/styleguide/styleguide.md
@@ -4,7 +4,7 @@
 
   * [Chromium C++ style guide](c++/c++.md)
   * [Google Objective-C style guide](https://google.github.io/styleguide/objcguide.xml)
-  * [Java style guide for Android](https://sites.google.com/a/chromium.org/dev/developers/coding-style/java)
+  * [Java style guide for Android](java/java.md)
   * [GN style guide](../tools/gn/docs/style_guide.md) for build files
 
 Chromium also uses these languages to a lesser degree:
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 5391046..07b04a1 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1242,6 +1242,24 @@
             ]
         }
     ],
+    "NTPTilesInInstantService": [
+        {
+            "platforms": [
+                "chromeos",
+                "linux",
+                "mac",
+                "win"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "NTPTilesInInstantService"
+                    ]
+                }
+            ]
+        }
+    ],
     "NetDelayableH2AndQuicRequests": [
         {
             "platforms": [
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 89fb361..c34175f 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1954,6 +1954,7 @@
 crbug.com/626703 external/wpt/selection/selectAllChildren.html [ Pass Timeout ]
 crbug.com/666703 external/wpt/html/browsers/sandboxing/sandbox-disallow-same-origin.html [ Timeout ]
 crbug.com/626703 external/wpt/html/dom/documents/dom-tree-accessors/Document.currentScript.html [ Timeout ]
+crbug.com/626703 external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html [ Failure Pass ]
 
 crbug.com/655458 external/wpt/workers/constructors/SharedWorker/undefined-arguments.html [ Failure ]
 crbug.com/655458 external/wpt/workers/baseurl/alpha/worker.html [ Failure ]
@@ -2015,14 +2016,6 @@
 crbug.com/602693 external/wpt/service-workers/service-worker/invalid-header.https.html [ Skip ]
 crbug.com/602693 external/wpt/service-workers/service-worker/referer.https.html [ Skip ]
 
-# Too large diff. Needs manual commit
-crbug.com/683066 external/wpt/selection/addRange-00.html [ Failure ]
-crbug.com/683066 external/wpt/selection/addRange-04.html [ Failure ]
-crbug.com/683066 external/wpt/selection/addRange-16.html [ Failure ]
-crbug.com/683066 external/wpt/selection/addRange-28.html [ Failure ]
-crbug.com/683066 external/wpt/selection/addRange-32.html [ Failure ]
-crbug.com/683066 external/wpt/selection/addRange-36.html [ Failure ]
-
 # mojo-loading: This is an experimental feature. failing virtual tests are
 # listed below.
 
diff --git a/third_party/WebKit/LayoutTests/compositing/fixed-position-container-expected.html b/third_party/WebKit/LayoutTests/compositing/fixed-position-container-expected.html
new file mode 100644
index 0000000..007c692
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/compositing/fixed-position-container-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+
+<style>
+  #clip {
+    position: absolute;
+    overflow: hidden;
+    width: 300px;
+    height: 300px;
+  }
+
+  #transform {
+    transform: scale(2, 2);
+    background-color: blue;
+    width: 200px;
+    height: 200px;
+  }
+
+  #fixed {
+    position: fixed;
+    top: 50px;
+    left: 50px;
+    width: 100px;
+    height: 100px;
+    background-color: green;
+  }
+</style>
+
+<div id='clip'>
+  <div id='transform'>
+    <div id='fixed'></div>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/compositing/fixed-position-container.html b/third_party/WebKit/LayoutTests/compositing/fixed-position-container.html
new file mode 100644
index 0000000..21f77bb7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/compositing/fixed-position-container.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+
+<style>
+  #clip {
+    position: absolute;
+    overflow: hidden;
+    width: 300px;
+    height: 300px;
+  }
+
+  #transform {
+    transform: scale3d(2, 2, 1);
+    background-color: blue;
+    width: 200px;
+    height: 200px;
+  }
+
+  #fixed {
+    will-change: transform;
+    position: fixed;
+    top: 50px;
+    left: 50px;
+    width: 100px;
+    height: 100px;
+    background-color: green;
+  }
+</style>
+
+<div id='clip'>
+  <div id='transform'>
+    <div id='fixed'></div>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/flex-flow-auto-margins-no-available-space-assert.html b/third_party/WebKit/LayoutTests/css3/flexbox/flex-flow-auto-margins-no-available-space-assert.html
index e2d2687b..c049fa7 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/flex-flow-auto-margins-no-available-space-assert.html
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/flex-flow-auto-margins-no-available-space-assert.html
@@ -10,7 +10,7 @@
 }
 </style>
 <script src="../../resources/check-layout.js"></script>
-<abbr data-expected-height=33554380>
+<abbr data-expected-height=30210272>
     <input></input>
 </abbr>
 <p> crbug.com/380201: Don't shrink below border/padding when stretching children within a flexbox with no available space.</p>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt
index 5e86010..c8970682 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt
@@ -100,9 +100,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -112,9 +112,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -124,75 +124,75 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -200,92 +200,92 @@
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
 " but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -294,14 +294,14 @@
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 " but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -341,9 +341,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -379,23 +379,23 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
 <meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -411,62 +411,62 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -480,35 +480,35 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -522,9 +522,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -538,23 +538,23 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdef" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -566,23 +566,23 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -590,54 +590,54 @@
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
 Qrstu" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
 <me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -676,9 +676,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -717,9 +717,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -736,269 +736,269 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 0 but got 1
@@ -1008,9 +1008,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1020,168 +1020,168 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -1189,15 +1189,15 @@
 "
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1237,9 +1237,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1275,23 +1275,23 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
 <meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1307,62 +1307,62 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1376,35 +1376,35 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1418,9 +1418,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1434,23 +1434,23 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 0
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1462,78 +1462,78 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+Qrstu" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
 <me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1572,9 +1572,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1613,9 +1613,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1632,293 +1632,293 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "A"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1928,9 +1928,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1940,144 +1940,144 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -2085,15 +2085,15 @@
 "
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2133,9 +2133,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2171,23 +2171,23 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
 <meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2203,62 +2203,62 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2272,35 +2272,35 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2314,9 +2314,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2330,9 +2330,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 2
@@ -2346,9 +2346,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 7 but got 8
@@ -2360,78 +2360,78 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+Qrstu" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
 <me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2470,9 +2470,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2511,9 +2511,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -2530,293 +2530,293 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 8 but got 9
@@ -2826,9 +2826,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2838,144 +2838,144 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
 " but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -2983,15 +2983,15 @@
 "
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3031,9 +3031,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3069,23 +3069,23 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
 <meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3101,62 +3101,62 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3170,35 +3170,35 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3212,9 +3212,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3228,9 +3228,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 2
@@ -3244,9 +3244,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 7 but got 9
@@ -3258,78 +3258,78 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+Qrstu" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
 <me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3368,9 +3368,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3409,9 +3409,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -3428,262 +3428,262 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt
index 744f8148..057b4187 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt
@@ -104,83 +104,57 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -192,11 +166,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -208,166 +180,132 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
 " but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 " but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -407,11 +345,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -447,29 +383,23 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Text node "Ijklmnop
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -485,133 +415,103 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 " but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -625,11 +525,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -643,11 +541,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -661,47 +557,37 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Ijklmnop
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -715,63 +601,49 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -810,11 +682,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -853,11 +723,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -874,423 +742,317 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 0 but got 1
@@ -1302,11 +1064,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1318,166 +1078,132 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1517,11 +1243,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1557,29 +1281,23 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Text node "Ijklmnop
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1595,133 +1313,103 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 0 but got 1
@@ -1735,11 +1423,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1753,11 +1439,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1771,47 +1455,37 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Ijklmnop
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1825,63 +1499,49 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1920,11 +1580,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1963,11 +1621,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1984,455 +1640,345 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "I"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2444,11 +1990,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2462,133 +2006,103 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2628,11 +2142,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2668,29 +2180,23 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Text node "Ijklmnop
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2706,152 +2212,116 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2865,11 +2335,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2883,47 +2351,37 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Ijklmnop
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2937,63 +2395,49 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3032,11 +2476,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3075,11 +2517,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -3096,475 +2536,345 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "klmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 8 but got 9
@@ -3577,13 +2887,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3597,156 +2903,103 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3786,13 +3039,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3828,34 +3077,23 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Text node "Ijklmnop
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3871,178 +3109,116 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 8 but got 9
@@ -4057,13 +3233,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4077,55 +3249,37 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Ijklmnop
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Ijklmnop
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4139,74 +3293,49 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Ijklmnop
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4245,13 +3374,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4290,13 +3415,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4313,402 +3434,262 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "klmnop
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt
index 2ec71a5..3641707 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt
@@ -66,35 +66,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -120,35 +94,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -174,35 +122,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -228,35 +150,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -282,35 +178,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -336,35 +206,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -390,35 +234,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -444,35 +262,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -499,353 +291,87 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 1 but got 2
@@ -873,35 +399,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -941,35 +441,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1005,89 +479,23 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1115,194 +523,48 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1328,35 +590,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1383,141 +619,35 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1544,35 +674,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1599,35 +703,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1655,35 +733,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1709,35 +761,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1763,35 +789,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1818,35 +818,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1872,141 +846,35 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2045,35 +913,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2112,35 +954,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -2168,35 +984,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <html><head><title>Selection.addRange() tests</title>
@@ -2221,35 +1011,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <html><head><title>Selection.addRange() tests</title>
@@ -2274,1212 +1038,426 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
 " but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3495,11 +1473,9 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3539,16 +1515,14 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -3562,18 +1536,14 @@
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
 " but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3585,318 +1555,242 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 " but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 " but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdef" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
 Qrstu" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3935,11 +1829,9 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3978,375 +1870,285 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4362,15 +2164,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4386,15 +2182,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4410,15 +2200,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4434,15 +2218,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -4458,15 +2236,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -4482,15 +2254,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -4506,15 +2272,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -4531,179 +2291,103 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4743,15 +2427,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4787,39 +2465,23 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4835,84 +2497,48 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <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 Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4928,15 +2554,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4953,61 +2573,35 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -5024,15 +2618,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -5049,15 +2637,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -5075,15 +2657,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5099,15 +2675,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5123,15 +2693,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5148,15 +2712,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 0 but got 1
@@ -5170,61 +2728,35 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></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 Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5263,15 +2795,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5310,15 +2836,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5336,15 +2856,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5359,15 +2873,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5382,416 +2890,236 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
@@ -5802,9 +3130,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5814,9 +3142,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5826,9 +3154,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5838,9 +3166,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5850,11 +3178,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5864,11 +3190,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5878,11 +3202,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5892,13 +3214,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5980,15 +3298,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-" but got object "Selection.addRange() tests
-
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -5998,39 +3310,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6040,35 +3322,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6078,11 +3334,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6092,15 +3346,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6146,11 +3394,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6160,13 +3406,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6200,13 +3442,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6216,13 +3454,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6232,13 +3466,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6248,11 +3478,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6262,11 +3490,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6276,13 +3502,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6292,11 +3514,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6318,10 +3538,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6331,38 +3550,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6372,38 +3562,9 @@
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6412,17 +3573,10 @@
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6431,12 +3585,10 @@
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -6445,12 +3597,10 @@
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt
index fe745f12..4ca869f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt
@@ -86,49 +86,33 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -141,13 +125,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -160,13 +140,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -180,13 +156,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -200,13 +172,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -220,13 +188,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -241,127 +205,87 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -369,21 +293,15 @@
 "
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -423,13 +341,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -465,33 +379,23 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
 <meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -507,90 +411,62 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -606,51 +482,35 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -665,13 +525,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -686,13 +542,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -706,13 +558,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -727,13 +575,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -747,13 +591,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -768,71 +608,49 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
 <me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -871,13 +689,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -916,13 +730,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -939,13 +749,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -958,13 +764,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -977,353 +779,243 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1337,11 +1029,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1355,11 +1045,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1373,11 +1061,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1391,206 +1077,160 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1630,11 +1270,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1670,29 +1308,23 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1708,62 +1340,48 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1777,11 +1395,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1795,45 +1411,35 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1849,11 +1455,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1869,11 +1473,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1891,11 +1493,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -1907,100 +1507,78 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+Qrstu" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2039,11 +1617,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2082,11 +1658,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -2103,618 +1677,468 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2754,11 +2178,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2794,29 +2216,23 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2832,171 +2248,129 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+Ijklmnop" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <p id="e" style="display:none">Ghijklmn</p>
@@ -3010,29 +2384,23 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3044,11 +2412,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <p id="e" style="display:none">Ghijklmn</p>
@@ -3062,63 +2428,49 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3157,11 +2509,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3200,11 +2550,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -3221,11 +2569,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -3238,11 +2584,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -3255,403 +2599,291 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3666,13 +2898,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3687,13 +2915,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3708,13 +2932,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3730,156 +2950,103 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3919,13 +3086,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3961,34 +3124,23 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4004,156 +3156,103 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -4168,13 +3267,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -4189,13 +3284,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4209,34 +3300,23 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 1
@@ -4249,13 +3329,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4269,74 +3345,49 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4375,13 +3426,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4420,13 +3467,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4443,13 +3486,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4463,382 +3502,249 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ijklmnop
-Qrstu"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt
index 2b292bb..6863e90 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt
@@ -84,258 +84,192 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
 " but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -353,11 +287,9 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -397,11 +329,9 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -437,29 +367,23 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -477,246 +401,186 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 " but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 " but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdef" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
 Qrstu" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -728,45 +592,35 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -805,11 +659,9 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -848,362 +700,278 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
@@ -1214,9 +982,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 0
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1226,9 +994,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "A"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endOffset of the Selection's last Range must match the added Range expected 2 but got 1
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1238,9 +1006,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1250,9 +1018,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1262,11 +1030,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1276,11 +1042,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "I"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1290,11 +1054,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "klmnop"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1304,13 +1066,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "klmnop
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1392,15 +1150,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-" but got object "Selection.addRange() tests
-
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1410,39 +1162,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1452,35 +1174,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1490,11 +1186,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <head><title>Selection.addRange() tests</title>
-<meta nam...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1504,15 +1198,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1558,11 +1246,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1572,13 +1258,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1612,13 +1294,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1628,13 +1306,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1644,13 +1318,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1660,11 +1330,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1674,11 +1342,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object "QrstuvwxYzabcdefGhijklmn"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1688,13 +1354,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ijklmnop
-Qrstu"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1704,11 +1366,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1730,10 +1390,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1743,38 +1402,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1784,38 +1414,9 @@
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1824,17 +1425,10 @@
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1843,12 +1437,10 @@
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -1857,12 +1449,10 @@
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range 
+PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range 
 PASS Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 assert_equals: rangeCount must be 1 expected 1 but got 0
 FAIL Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_not_equals: Cannot proceed with tests if rangeCount is 0 got disallowed value 0
@@ -2082,236 +1672,213 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Document node with 2 children
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Document node with 2 children
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Document node with 2 children
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Document node with 2 children
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
 " but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Document node with 2 children
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 " but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Document node with 2 children
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2327,20 +1894,19 @@
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
 " but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Document node with 2 children
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -2354,273 +1920,248 @@
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
 " but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Document node with 2 children
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Document node with 2 children
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Document node with 2 children
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Document node with 2 children
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 " but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 " but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdef" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Document node with 2 children
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Document node with 2 children
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Document node with 2 children
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
 Qrstu" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Document node with 2 children
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2631,10 +2172,9 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2673,10 +2213,9 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 1 but got 0
@@ -2715,335 +2254,285 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Document node with 2 children
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
-FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3069,38 +2558,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3126,38 +2586,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3183,38 +2614,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3240,38 +2642,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3297,38 +2670,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3354,38 +2698,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3411,38 +2726,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3469,374 +2755,87 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -3864,38 +2863,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -3935,38 +2905,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -4004,38 +2945,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
@@ -4061,38 +2973,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4120,206 +3003,48 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4345,38 +3070,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4403,150 +3099,35 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4573,38 +3154,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4631,38 +3183,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4690,38 +3213,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4747,38 +3241,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4804,38 +3269,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4862,38 +3298,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -4919,94 +3326,22 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 1 but got 2
@@ -5031,38 +3366,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5101,38 +3407,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 1 but got 0
@@ -5171,38 +3448,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5230,38 +3478,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Document node with 2 children
@@ -5286,38 +3505,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 35 [document, 0, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Document node with 2 children
@@ -5342,1010 +3532,236 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
+FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt
index fa0a3da..20e7c1bb 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt
@@ -77,38 +77,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -134,38 +105,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -191,38 +133,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -248,38 +161,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -305,38 +189,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -362,38 +217,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -419,38 +245,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -476,38 +273,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -534,374 +302,87 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -929,38 +410,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -1000,38 +452,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -1069,38 +492,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
@@ -1126,38 +520,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1185,206 +550,48 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1410,38 +617,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1468,150 +646,35 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1638,38 +701,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1696,38 +730,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1755,38 +760,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1812,38 +788,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1869,38 +816,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -1927,38 +845,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
@@ -1984,94 +873,22 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endOffset of the Selection's last Range must match the added Range expected 1 but got 2
@@ -2096,38 +913,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2166,38 +954,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -2236,38 +995,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -2295,38 +1025,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Document node with 2 children
@@ -2351,38 +1052,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 36 [document, 1, document, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Document node with 2 children
@@ -2407,1024 +1079,243 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
+FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3439,17 +1330,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3464,17 +1348,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3489,17 +1366,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -3514,17 +1384,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3539,17 +1402,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3564,17 +1420,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3589,17 +1438,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
@@ -3615,188 +1457,104 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3835,17 +1593,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3880,42 +1631,24 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -3930,89 +1663,49 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <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 Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <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 Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4027,17 +1720,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4053,65 +1739,36 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4127,17 +1784,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4153,17 +1803,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -4180,17 +1823,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4205,17 +1841,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 0
@@ -4228,17 +1857,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 1 but got 0
@@ -4252,90 +1874,50 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></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 Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4373,17 +1955,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -4421,17 +1996,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4447,17 +2015,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4471,17 +2032,10 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -4495,681 +2049,443 @@
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><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 Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected 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 Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Qrstuvwx"
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5208,12 +2524,10 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5248,28 +2562,24 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5284,154 +2594,130 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Qrstuvwx"
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+Ijklmnop" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5445,28 +2731,24 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <p id="e" style="display:none">Ghijklmn</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5478,12 +2760,10 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Text node "Qrstuvwx" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5497,58 +2777,50 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5586,12 +2858,10 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -5629,12 +2899,10 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5650,12 +2918,10 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -5666,12 +2932,10 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
@@ -5681,519 +2945,443 @@
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "uvwxYzabcdefGhijklmn" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "uvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Qrstuvwx"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "A" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "I" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Ijklmnop
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "klmnop
-" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 8 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "O" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "qrstuv" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 10 [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 11 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "E" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "ghijkl" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 13 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <p id="d" style="display:none">Yzabcdef</p>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
-" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 14 [document.documentElement, 0, document.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -6232,12 +3420,10 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -6272,28 +3458,24 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title>Selection.addRange() tests</title>
-<meta nam... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+<meta nam... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -6308,154 +3490,130 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 20 [foreignDoc.head, 1, foreignDoc.head, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 21 [foreignDoc.body, 0, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 22 [paras[0], 0, paras[0], 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Opqrstuv" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 25 [detachedPara1, 0, detachedPara1, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+Ijklmnop" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -6469,28 +3627,24 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Element node <p id="e" style="display:none">Ghijklmn</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -6502,75 +3656,65 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="d" style="display:none">Yzabcdef</p>
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ijklmnop
-Qrstu" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+Qrstu" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 31 [testDiv, 1, paras[2].firstChild, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
-<me... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 32 [document.documentElement, 1, document.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 33 [foreignDoc.documentElement, 1, foreignDoc.body, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 34 [document, 0, document, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -6608,12 +3752,10 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
@@ -6651,12 +3793,10 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -6672,12 +3812,10 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -6688,12 +3826,10 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in rangeCount being 1 
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
@@ -6704,273 +3840,237 @@
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 39 [paras[3], 1, comment, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 40 [foreignDoc, 0, foreignDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now." but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 41 [foreignDoc, 1, foreignComment, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "EfghijklMnopqrstI admit that I harbor doubts about w" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 42 [foreignDoc.body, 0, foreignTextNode, 36]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 43 [xmlDoc, 0, xmlDoc, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "do re mi fa so la ti" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 44 [xmlDoc, 1, xmlComment, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Uvwxyzab" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 45 [detachedTextNode, 0, detachedTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 46 [detachedForeignTextNode, 7, detachedForeignTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Cdefghij" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 47 [detachedForeignTextNode, 0, detachedForeignTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 48 [detachedXmlTextNode, 7, detachedXmlTextNode, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Klmnopqr" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 49 [detachedXmlTextNode, 0, detachedXmlTextNode, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 50 [detachedComment, 3, detachedComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 51 [detachedComment, 5, detachedComment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 52 [detachedForeignComment, 0, detachedForeignComment, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 53 [detachedForeignComment, 4, detachedForeignComment, 4]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 54 [detachedXmlComment, 2, detachedXmlComment, 6]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 55 [docfrag, 0, docfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 56 [foreignDocfrag, 0, foreignDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Ghijklmn" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range assert_equals: After mutating the first added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range assert_equals: After first addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range having the specified endpoints 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: first addRange() must result in the selection's last range being the same object we added 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the first added range must modify the Selection's last Range 
+PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object "Ghijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 57 [xmlDocfrag, 0, xmlDocfrag, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-basic-expected.txt b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-basic-expected.txt
deleted file mode 100644
index cf64c4e9..0000000
--- a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-basic-expected.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-Test Basic IIRFilterNode Properties
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS context.createIIRFilter is defined.
-PASS numberOfInputs is equal to 1.
-PASS numberOfOutputs is equal to 1.
-PASS channelCountMode is equal to "max".
-PASS channelInterpretation is equal to "speakers".
-PASS All basic IIRFilter parameters are correct.
-
-PASS createIIRFilter() threw TypeError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': 2 arguments required, but only 0 present..
-PASS createIIRFilter(new Float32Array(1)) threw TypeError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': 2 arguments required, but only 1 present..
-PASS createIIRFilter(null, null) threw TypeError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The 1st argument is neither an array, nor does it have indexed properties..
-PASS createIIRFilter([], []) threw NotSupportedError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The number of feedback coefficients provided (0) is outside the range [1, 20]..
-PASS createIIRFilter([1], []) threw NotSupportedError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The number of feedback coefficients provided (0) is outside the range [1, 20]..
-PASS createIIRFilter([], [1]) threw NotSupportedError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The number of feedforward coefficients provided (0) is outside the range [1, 20]..
-PASS createIIRFilter(new Float32Array(20), new Float32Array(20)) did not throw an exception.
-PASS createIIRFilter(new Float32Array(21), [1]) threw NotSupportedError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The number of feedforward coefficients provided (21) is outside the range [1, 20]..
-PASS createIIRFilter([1], new Float32Array(21)) threw NotSupportedError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The number of feedback coefficients provided (21) is outside the range [1, 20]..
-PASS createIIRFilter([1], new Float32Array(2)) threw InvalidStateError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': First feedback coefficient cannot be zero..
-PASS createIIRFilter(new Float32Array(10), [1]) threw InvalidStateError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': At least one feedforward coefficient must be non-zero..
-PASS createIIRFilter([1], [1, NaN, Infinity]) threw InvalidStateError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The feedback coefficient 1 is infinite..
-PASS createIIRFilter([1, NaN, Infinity], [1]) threw InvalidStateError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The feedforward coefficient 1 is infinite..
-PASS createIIRFilter([1, 'abc', []], [1]) threw InvalidStateError: Failed to execute 'createIIRFilter' on 'BaseAudioContext': The feedforward coefficient 1 is not a number..
-PASS All exceptions for createIIRFilter were correctly thrown.
-
-PASS getFrequencyResponse(null, new Float32Array(1), new Float32Array(1)) threw TypeError: Failed to execute 'getFrequencyResponse' on 'IIRFilterNode': parameter 1 is not of type 'Float32Array'..
-PASS getFrequencyResponse(new Float32Array(1), null, new Float32Array(1)) threw TypeError: Failed to execute 'getFrequencyResponse' on 'IIRFilterNode': parameter 2 is not of type 'Float32Array'..
-PASS getFrequencyResponse(new Float32Array(1), new Float32Array(1), null) threw TypeError: Failed to execute 'getFrequencyResponse' on 'IIRFilterNode': parameter 3 is not of type 'Float32Array'..
-PASS getFrequencyResponse(new Float32Array(10), new Float32Array(1), new Float32Array(20)) threw NotSupportedError: Failed to execute 'getFrequencyResponse' on 'IIRFilterNode': The magResponse length provided (1) is less than the minimum bound (10)..
-PASS getFrequencyResponse(new Float32Array(10), new Float32Array(20), new Float32Array(1)) threw NotSupportedError: Failed to execute 'getFrequencyResponse' on 'IIRFilterNode': The phaseResponse length provided (1) is less than the minimum bound (10)..
-PASS getFrequencyResponse(new Float32Array(10), new Float32Array(20), new Float32Array(30)) did not throw an exception.
-PASS getFrequencyResponse exceptions handled correctly.
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-basic.html b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-basic.html
index 7d725f44..f318697 100644
--- a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-basic.html
+++ b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-basic.html
@@ -2,16 +2,14 @@
 <html>
   <head>
     <title>Test Basic IIRFilterNode Properties</title>
-    <script src="../../resources/js-test.js"></script>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script> 
     <script src="../resources/audit-util.js"></script>
     <script src="../resources/audio-testing.js"></script>
   </head>
 
   <body>
     <script>
-      description("Test Basic IIRFilterNode Properties");
-      window.jsTestIsAsync = true;
-
       var sampleRate = 48000;
       var testFrames = 100;
 
@@ -27,7 +25,9 @@
       });
 
       audit.defineTask("existence", function (done) {
-        shouldBeDefined("context.createIIRFilter");
+        Should("context.createIIRFilter exists",
+          context.createIIRFilter != undefined)
+          .beEqualTo(true);
         done();
       });
 
@@ -44,10 +44,8 @@
         success = Should("channelCountMode", f.channelCountMode).beEqualTo("max") && success;
         success = Should("channelInterpretation", f.channelInterpretation).beEqualTo("speakers") && success;
 
-        if (success)
-          testPassed("All basic IIRFilter parameters are correct.\n");
-        else
-          testFailed("Some basic IIRFilter parameter was not correct.\n");
+        Should("Basic IRRFilter parameters", success)
+          .summarize("were all correct", "were not all correct");
         done();
       });
 
@@ -133,10 +131,9 @@
           context.createIIRFilter([1, "abc", []], [1]);
         }).throw("InvalidStateError") && success;
 
-        if (success)
-          testPassed("All exceptions for createIIRFilter were correctly thrown.\n");
-        else
-          testFailed("Some exceptions for createIIRFilter were not thrown as expected.\n");
+        Should("Exceptions for createIIRFilter", success)
+          .summarize("were all correctly thrown",
+                     "were not all correctly thrown");
         done();
       });
 
@@ -191,20 +188,12 @@
               30));
           }).notThrow() && success;
 
-        if (success)
-          testPassed("getFrequencyResponse exceptions handled correctly.\n");
-        else
-          testFailed("getFrequencyResponse exceptions not handled correctly.\n");
-
-        done();
-      });
-      audit.defineTask("finish", function (done) {
-        finishJSTest();
+        Should("getFrequencyResponse exceptions handled", success)
+          .summarize("correctly", "incorrectly");
         done();
       });
 
       audit.runTasks();
-      successfullyParsed = true;
     </script>
   </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-expected.txt b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-expected.txt
deleted file mode 100644
index c03845d..0000000
--- a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-expected.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-Test Basic IIRFilterNode Operation
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS createIIRFilter with normalized coefficients did not throw an exception.
-PASS createIIRFilter with unnormalized coefficients did not throw an exception.
-PASS Output of IIR filter with unnormalized coefficients equals [1,-0.8999999761581421,0.8100000023841858,-0.7289999723434448,0.6560999751091003,-0.5904899835586548,0.5314409732818604,-0.4782969057559967,0.4304672181606293,-0.3874204754829407,0.34867843985557556,-0.3138105869293213,0.2824295461177826,-0.25418657064437866,0.22876793146133423,-0.20589113235473633,...] with an element-wise tolerance of 2.1958e-38.
-PASS IIRFilter coefficients correctly normalized.
-
-PASS IIR 1-zero output equals [0.5,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...] with an element-wise tolerance of 0.
-PASS IIR 1-pole output equals [1,-0.9,0.81,-0.7290000000000001,0.6561000000000001,-0.5904900000000002,0.5314410000000002,-0.47829690000000014,0.43046721000000016,-0.38742048900000015,0.34867844010000015,-0.31381059609000017,0.28242953648100017,-0.25418658283290013,0.22876792454961012,-0.2058911320946491,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 5.723e-8}.
-PASS IIRFilter for Biquad lowpass equals [0.00052089,0.0025959,0.0067191,0.012853,0.020955,0.030980,0.042881,0.056604,0.072096,0.089298,0.10815,0.12859,0.15055,0.17397,0.19877,0.22488,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.000049834}.
-PASS SNR for IIRFIlter for Biquad lowpass is greater than or equal to 91.221.
-PASS IIRFilter for Biquad highpass equals [0.99229,0.97595,0.95782,0.93795,0.91641,0.89328,0.86861,0.84249,0.81499,0.78619,0.75616,0.72499,0.69276,0.65954,0.62543,0.59051,...] with an element-wise tolerance of {absoluteThreshold: 0.0000029, relativeThreshold: 0.00003}.
-PASS SNR for IIRFIlter for Biquad highpass is greater than or equal to 105.459.
-PASS IIRFilter for Biquad bandpass equals [0.0022847,0.0068389,0.011358,0.015833,0.020254,0.024612,0.028899,0.033106,0.037224,0.041246,0.045163,0.048967,0.052652,0.056209,0.059632,0.062915,...] with an element-wise tolerance of {absoluteThreshold: 2e-7, relativeThreshold: 0.00087}.
-PASS SNR for IIRFIlter for Biquad bandpass is greater than or equal to 104.06.
-PASS IIRFilter for Biquad notch equals [0.99772,0.99316,0.98864,0.98417,0.97975,0.97539,0.97110,0.96689,0.96278,0.95875,0.95484,0.95103,0.94735,0.94379,0.94037,0.93708,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000422}.
-PASS SNR for IIRFIlter for Biquad notch is greater than or equal to 91.312.
-PASS IIRFilter for Biquad allpass equals [0.99543,0.98632,0.97728,0.96833,0.95949,0.95078,0.94220,0.93379,0.92555,0.91751,0.90967,0.90207,0.89470,0.88758,0.88074,0.87417,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000431}.
-PASS SNR for IIRFIlter for Biquad allpass is greater than or equal to 91.319.
-PASS IIRFilter for Biquad lowshelf equals [1.0191,1.0576,1.0966,1.1362,1.1763,1.2168,1.2575,1.2986,1.3398,1.3812,1.4227,1.4642,1.5057,1.5471,1.5884,1.6296,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000298}.
-PASS SNR for IIRFIlter for Biquad lowshelf is greater than or equal to 90.609.
-PASS IIRFilter for Biquad highshelf equals [3.1031,2.9859,2.8713,2.7596,2.6507,2.5450,2.4425,2.3434,2.2476,2.1553,2.0665,1.9812,1.8995,1.8214,1.7467,1.6756,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000124}.
-PASS SNR for IIRFIlter for Biquad highshelf is greater than or equal to 103.159.
-PASS IIRFilter for Biquad peaking equals [1.0028,1.0083,1.0138,1.0193,1.0247,1.0301,1.0354,1.0406,1.0456,1.0506,1.0555,1.0602,1.0648,1.0693,1.0736,1.0777,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000505}.
-PASS SNR for IIRFIlter for Biquad peaking is greater than or equal to 91.504.
-PASS Max difference between IIR and Biquad on channel 0 is less than or equal to 0.000037671.
-PASS Max difference between IIR and Biquad on channel 1 is less than or equal to 0.000030071.
-PASS Max difference between IIR and Biquad on channel 2 is less than or equal to 0.000026241.
-PASS IIRFilter correctly processed 3-channel input.
-PASS 4-th order IIRFilter (biquad ref) equals [2.6831e-7,0.0000021317,0.0000084527,0.000023002,0.000049588,0.000091769,0.00015285,0.00023587,0.00034360,0.00047856,0.00064299,0.00083884,0.0010678,0.0013314,0.0016307,0.0019666,...] with an element-wise tolerance of {absoluteThreshold: 1.59e-7, relativeThreshold: 0.0000211}.
-PASS SNR of 4-th order IIRFilter (biquad ref) is greater than or equal to 108.947.
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-getFrequencyResponse-expected.txt b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-getFrequencyResponse-expected.txt
deleted file mode 100644
index 7839435..0000000
--- a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-getFrequencyResponse-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-Test IIRFilter getFrequencyResponse() functionality
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS 1-pole IIR Magnitude Response equals [10,9.995561599731445,9.982281684875488,9.96026611328125,9.929688453674316,9.890785217285156,9.843852043151855,9.789238929748535,9.727341651916504,9.658592224121094,9.583455085754395,9.502418518066406,9.415983200073242,9.32465934753418,9.228958129882812,9.12938404083252,...] with an element-wise tolerance of 0.0000028611.
-PASS 1-pole IIR Phase Response equals [0,-0.02826550230383873,-0.05647812411189079,-0.08458554744720459,-0.11253655701875687,-0.1402815729379654,-0.16777309775352478,-0.1949661672115326,-0.2218186855316162,-0.2482917755842209,-0.27434995770454407,-0.29996123909950256,-0.3250974416732788,-0.3497338891029358,-0.3738497197628021,-0.3974274694919586,...] with an element-wise tolerance of 1.7882e-7.
-PASS 1-pole IIR response matched expected response.
-
-PASS IIR Magnitude Response equals [1,1.0028345584869385,1.0113478899002075,1.025554895401001,1.0454282760620117,1.070805311203003,1.10122549533844,1.1356719732284546,1.1721950769424438,1.2074543237686157,1.2363563776016235,1.2522097826004028,1.247962236404419,1.218644618988037,1.1639058589935303,1.0886648893356323,...] with an element-wise tolerance of 0.000027419.
-PASS IIR Phase Response equals [0,-0.061315324157476425,-0.12391137331724167,-0.1891222447156906,-0.2583869397640228,-0.3332937955856323,-0.4156070649623871,-0.5072502493858337,-0.6102025508880615,-0.7262400388717651,-0.8564491868019104,-1.0005061626434326,-1.155927300453186,-1.3177809715270996,-1.4793895483016968,-1.6339597702026367,...] with an element-wise tolerance of 0.000027657.
-PASS IIR response matched equivalent lowpass Biquad response.
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-getFrequencyResponse.html b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-getFrequencyResponse.html
index 44a0644..b0c46303 100644
--- a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-getFrequencyResponse.html
+++ b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter-getFrequencyResponse.html
@@ -2,7 +2,8 @@
 <html>
   <head>
     <title>Test IIRFilter getFrequencyResponse() functionality</title>
-    <script src="../../resources/js-test.js"></script>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script> 
     <script src="../resources/audit-util.js"></script>
     <script src="../resources/audio-testing.js"></script>
     <script src="../resources/biquad-filters.js"></script>
@@ -10,9 +11,6 @@
 
   <body>
     <script>
-      description("Test IIRFilter getFrequencyResponse() functionality");
-      window.jsTestIsAsync = true;
-
       var sampleRate = 48000;
       // Some short duration; we're not actually looking at the rendered output.
       var testDurationSec = 0.01;
@@ -76,11 +74,10 @@
         success = Should("1-pole IIR Magnitude Response", iirMag).beCloseToArray(trueMag, 2.8611e-6);
         success = Should("1-pole IIR Phase Response", iirPhase).beCloseToArray(truePhase, 1.7882e-7)
           && success;
-        if (success)
-          testPassed("1-pole IIR response matched expected response.\n");
-        else
-          testFailed("1-pole IIR response did not match expected response.\n");
 
+        Should('1-pole IIR response', success)
+            .summarize(
+                'matched expected response', 'did not match expected response');
         done();
       });
 
@@ -112,21 +109,14 @@
         success = Should("IIR Magnitude Response", iirMag).beCloseToArray(biquadMag, 2.7419e-5);
         success = Should("IIR Phase Response", iirPhase).beCloseToArray(biquadPhase, 2.7657e-5) && success;
 
-        if (success)
-          testPassed("IIR response matched equivalent " + biquad.type + " Biquad response.\n");
-        else
-          testFailed("IIR response did not equivalent " + biquad.type + " Biquad response.\n");
-
-        done();
-      });
-
-      audit.defineTask("finish", function (done) {
-        finishJSTest();
+        var suffix = " equivalent " + biquad.type + " Biquad response";
+        Should("IIR response", success)
+          .summarize("matched" + suffix,
+                     "did not match" + suffix);
         done();
       });
 
       audit.runTasks();
-      successfullyParsed = true;
     </script>
   </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter.html b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter.html
index c6c9c91f..2053af5 100644
--- a/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter.html
+++ b/third_party/WebKit/LayoutTests/webaudio/IIRFilter/iirfilter.html
@@ -2,7 +2,8 @@
 <html>
   <head>
     <title>Test Basic IIRFilterNode Operation</title>
-    <script src="../../resources/js-test.js"></script>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script> 
     <script src="../resources/audit-util.js"></script>
     <script src="../resources/audio-testing.js"></script>
     <script src="../resources/biquad-filters.js"></script>
@@ -10,9 +11,6 @@
 
   <body>
     <script>
-      description("Test Basic IIRFilterNode Operation");
-      window.jsTestIsAsync = true;
-
       var sampleRate = 48000;
       var testDurationSec = 1;
       var testFrames = testDurationSec * sampleRate;
@@ -88,10 +86,8 @@
           // IIRFilterNode and the BiquadFilterNode.
           success = Should("Output of IIR filter with unnormalized coefficients", iir2Data)
             .beCloseToArray(iir1Data, 2.1958e-38) && success;
-          if (success)
-            testPassed("IIRFilter coefficients correctly normalized.\n");
-          else
-            testFailed("IIRFilter coefficients not correctly normalized.\n");
+          Should("IIRFilter coefficients normalized", success)
+            .summarize("correctly", "incorrectly");
         }).then(done);
       });
 
@@ -367,13 +363,10 @@
               }).beLessThanOrEqualTo(errorThresholds[channel]);
           }
 
-          if (success) {
-            testPassed("IIRFilter correctly processed " + result.numberOfChannels +
-              "-channel input.");
-          } else {
-            testFailed("IIRFilter failed to correctly process " + result.numberOfChannels +
-              "-channel input.");
-          }
+          Should("IIRFIlter processed " + result.numberOfChannels +
+            "-channel input",
+            success)
+            .summarize("correctly", "incorrectly");
         }).then(done);
       });
 
@@ -566,13 +559,7 @@
         }).then(done);
       });
 
-      audit.defineTask("finish", function (done) {
-        finishJSTest();
-        done();
-      });
-
       audit.runTasks();
-      successfullyParsed = true;
     </script>
   </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/resources/oscillator-testing.js b/third_party/WebKit/LayoutTests/webaudio/resources/oscillator-testing.js
index d4e2ec0..6323ab84 100644
--- a/third_party/WebKit/LayoutTests/webaudio/resources/oscillator-testing.js
+++ b/third_party/WebKit/LayoutTests/webaudio/resources/oscillator-testing.js
@@ -20,16 +20,14 @@
 // <!doctype html>
 // <html>
 // <head>
-//  <script src="resources/compatibility.js"></script>
-//  <script src="resources/buffer-loader.js"></script>
-//  <script src="../resources/js-test.js"></script>
-//  <script src="resources/oscillator-testing.js"></script>
-//  <script src="resources/audio-testing.js"></script>
+// <script src="../resources/testharness.js"></script>
+// <script src="resources/oscillator-testing.js"></script>
+// <script src="resources/audit-util.js"></script>
 // </head>
 // <body>
-//  <script>
-//    OscillatorTestingUtils.createNewReference("sine");
-//  </script>
+// <script>
+//   OscillatorTestingUtils.createNewReference("sine");
+// </script>
 // </body>
 // </html>
 
diff --git a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
index 7f2bdfc..f8239852 100644
--- a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
+++ b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
@@ -96,7 +96,7 @@
 
   switch (key->getType()) {
     case IDBKey::InvalidType:
-    case IDBKey::MinType:
+    case IDBKey::TypeEnumMax:
       ASSERT_NOT_REACHED();
       return v8Undefined();
     case IDBKey::NumberType:
diff --git a/third_party/WebKit/Source/core/css/CSSKeyframesRule.cpp b/third_party/WebKit/Source/core/css/CSSKeyframesRule.cpp
index 88cae61..f80fd371 100644
--- a/third_party/WebKit/Source/core/css/CSSKeyframesRule.cpp
+++ b/third_party/WebKit/Source/core/css/CSSKeyframesRule.cpp
@@ -173,8 +173,12 @@
 
 CSSKeyframeRule* CSSKeyframesRule::anonymousIndexedGetter(
     unsigned index) const {
-  if (UseCounter* useCounter = UseCounter::getFrom(parentStyleSheet()))
-    useCounter->count(UseCounter::CSSKeyframesRuleAnonymousIndexedGetter);
+  const Document* parentDocument =
+      CSSStyleSheet::singleOwnerDocument(parentStyleSheet());
+  if (parentDocument) {
+    UseCounter::count(*parentDocument,
+                      UseCounter::CSSKeyframesRuleAnonymousIndexedGetter);
+  }
   return item(index);
 }
 
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
index 3cf65c87..ffbc1f7 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -1959,9 +1959,6 @@
     case BreakAuto:
       m_valueID = CSSValueAuto;
       break;
-    case BreakAlways:
-      m_valueID = CSSValueAlways;
-      break;
     case BreakAvoid:
       m_valueID = CSSValueAvoid;
       break;
@@ -2001,8 +1998,6 @@
       return BreakAuto;
     case CSSValueAvoid:
       return BreakAvoid;
-    case CSSValueAlways:
-      return BreakAlways;
     case CSSValueAvoidPage:
       return BreakAvoidPage;
     case CSSValuePage:
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp b/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp
index c7ddcfa..22d89cc 100644
--- a/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp
+++ b/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp
@@ -80,6 +80,14 @@
 }
 #endif
 
+// static
+const Document* CSSStyleSheet::singleOwnerDocument(
+    const CSSStyleSheet* styleSheet) {
+  if (styleSheet)
+    return StyleSheetContents::singleOwnerDocument(styleSheet->contents());
+  return nullptr;
+}
+
 CSSStyleSheet* CSSStyleSheet::create(StyleSheetContents* sheet,
                                      CSSImportRule* ownerRule) {
   return new CSSStyleSheet(sheet, ownerRule);
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheet.h b/third_party/WebKit/Source/core/css/CSSStyleSheet.h
index 60958a0..b8102a42 100644
--- a/third_party/WebKit/Source/core/css/CSSStyleSheet.h
+++ b/third_party/WebKit/Source/core/css/CSSStyleSheet.h
@@ -47,6 +47,8 @@
   WTF_MAKE_NONCOPYABLE(CSSStyleSheet);
 
  public:
+  static const Document* singleOwnerDocument(const CSSStyleSheet*);
+
   static CSSStyleSheet* create(StyleSheetContents*,
                                CSSImportRule* ownerRule = nullptr);
   static CSSStyleSheet* create(StyleSheetContents*, Node& ownerNode);
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
index db6eb1b9..efe1bb1f 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -1906,37 +1906,43 @@
   return list;
 }
 
-static EBreak mapToPageBreakValue(EBreak genericBreakValue) {
-  switch (genericBreakValue) {
+// Returns a suitable value for the page-break-(before|after|inside) property,
+// given the computed value of the more general break-(before|after|inside)
+// property.
+static CSSValue* valueForPageBreak(EBreak breakValue) {
+  switch (breakValue) {
     case BreakAvoidColumn:
     case BreakColumn:
     case BreakRecto:
     case BreakVerso:
-      return BreakAuto;
+      return CSSIdentifierValue::create(CSSValueAuto);
     case BreakPage:
-      return BreakAlways;
+      return CSSIdentifierValue::create(CSSValueAlways);
     case BreakAvoidPage:
-      return BreakAvoid;
+      return CSSIdentifierValue::create(CSSValueAvoid);
     default:
-      return genericBreakValue;
+      return CSSIdentifierValue::create(breakValue);
   }
 }
 
-static EBreak mapToColumnBreakValue(EBreak genericBreakValue) {
-  switch (genericBreakValue) {
+// Returns a suitable value for the -webkit-column-break-(before|after|inside)
+// property, given the computed value of the more general
+// break-(before|after|inside) property.
+static CSSValue* valueForWebkitColumnBreak(EBreak breakValue) {
+  switch (breakValue) {
     case BreakAvoidPage:
     case BreakLeft:
     case BreakPage:
     case BreakRecto:
     case BreakRight:
     case BreakVerso:
-      return BreakAuto;
+      return CSSIdentifierValue::create(CSSValueAuto);
     case BreakColumn:
-      return BreakAlways;
+      return CSSIdentifierValue::create(CSSValueAlways);
     case BreakAvoidColumn:
-      return BreakAvoid;
+      return CSSIdentifierValue::create(CSSValueAvoid);
     default:
-      return genericBreakValue;
+      return CSSIdentifierValue::create(breakValue);
   }
 }
 
@@ -2237,14 +2243,11 @@
       return CSSIdentifierValue::create(style.getColumnSpan() ? CSSValueAll
                                                               : CSSValueNone);
     case CSSPropertyWebkitColumnBreakAfter:
-      return CSSIdentifierValue::create(
-          mapToColumnBreakValue(style.breakAfter()));
+      return valueForWebkitColumnBreak(style.breakAfter());
     case CSSPropertyWebkitColumnBreakBefore:
-      return CSSIdentifierValue::create(
-          mapToColumnBreakValue(style.breakBefore()));
+      return valueForWebkitColumnBreak(style.breakBefore());
     case CSSPropertyWebkitColumnBreakInside:
-      return CSSIdentifierValue::create(
-          mapToColumnBreakValue(style.breakInside()));
+      return valueForWebkitColumnBreak(style.breakInside());
     case CSSPropertyColumnWidth:
       if (style.hasAutoColumnWidth())
         return CSSIdentifierValue::create(CSSValueAuto);
@@ -2660,14 +2663,11 @@
     case CSSPropertyBreakInside:
       return CSSIdentifierValue::create(style.breakInside());
     case CSSPropertyPageBreakAfter:
-      return CSSIdentifierValue::create(
-          mapToPageBreakValue(style.breakAfter()));
+      return valueForPageBreak(style.breakAfter());
     case CSSPropertyPageBreakBefore:
-      return CSSIdentifierValue::create(
-          mapToPageBreakValue(style.breakBefore()));
+      return valueForPageBreak(style.breakBefore());
     case CSSPropertyPageBreakInside:
-      return CSSIdentifierValue::create(
-          mapToPageBreakValue(style.breakInside()));
+      return valueForPageBreak(style.breakInside());
     case CSSPropertyPosition:
       return CSSIdentifierValue::create(style.position());
     case CSSPropertyQuotes:
diff --git a/third_party/WebKit/Source/core/css/FontFace.cpp b/third_party/WebKit/Source/core/css/FontFace.cpp
index 790bd98..8aabfcb5 100644
--- a/third_party/WebKit/Source/core/css/FontFace.cpp
+++ b/third_party/WebKit/Source/core/css/FontFace.cpp
@@ -69,8 +69,7 @@
 static const CSSValue* parseCSSValue(const Document* document,
                                      const String& value,
                                      CSSPropertyID propertyID) {
-  CSSParserContext* context =
-      CSSParserContext::create(*document, UseCounter::getFrom(document));
+  CSSParserContext* context = CSSParserContext::create(*document, document);
   return CSSParser::parseFontFaceDescriptor(propertyID, value, context);
 }
 
diff --git a/third_party/WebKit/Source/core/css/StyleSheetContents.cpp b/third_party/WebKit/Source/core/css/StyleSheetContents.cpp
index 0e38cea..0005ba3 100644
--- a/third_party/WebKit/Source/core/css/StyleSheetContents.cpp
+++ b/third_party/WebKit/Source/core/css/StyleSheetContents.cpp
@@ -39,6 +39,16 @@
 
 namespace blink {
 
+// static
+const Document* StyleSheetContents::singleOwnerDocument(
+    const StyleSheetContents* styleSheetContents) {
+  // TODO(https://crbug.com/242125): We may want to handle stylesheets that have
+  // multiple owners when this is used for UseCounter.
+  if (styleSheetContents && styleSheetContents->hasSingleOwnerNode())
+    return styleSheetContents->singleOwnerDocument();
+  return nullptr;
+}
+
 // Rough size estimate for the memory cache.
 unsigned StyleSheetContents::estimatedSizeInBytes() const {
   // Note that this does not take into account size of the strings hanging from
diff --git a/third_party/WebKit/Source/core/css/StyleSheetContents.h b/third_party/WebKit/Source/core/css/StyleSheetContents.h
index caf0fcb..c8e3b4d 100644
--- a/third_party/WebKit/Source/core/css/StyleSheetContents.h
+++ b/third_party/WebKit/Source/core/css/StyleSheetContents.h
@@ -61,6 +61,8 @@
     return new StyleSheetContents(ownerRule, originalURL, context);
   }
 
+  static const Document* singleOwnerDocument(const StyleSheetContents*);
+
   ~StyleSheetContents();
 
   const CSSParserContext* parserContext() const { return m_parserContext; }
diff --git a/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.cpp b/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.cpp
index b5605a55..a684e33b 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.cpp
@@ -4,6 +4,7 @@
 
 #include "core/css/parser/CSSAtRuleID.h"
 
+#include "core/css/parser/CSSParserContext.h"
 #include "core/frame/UseCounter.h"
 
 namespace blink {
@@ -34,8 +35,7 @@
   return CSSAtRuleInvalid;
 }
 
-void countAtRule(UseCounter* useCounter, CSSAtRuleID ruleId) {
-  ASSERT(useCounter);
+void countAtRule(const CSSParserContext* context, CSSAtRuleID ruleId) {
   UseCounter::Feature feature;
 
   switch (ruleId) {
@@ -81,7 +81,7 @@
       ASSERT_NOT_REACHED();
       return;
   }
-  useCounter->count(feature);
+  context->count(feature);
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.h b/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.h
index 8ffe1a9..c67cce0 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSAtRuleID.h
@@ -9,7 +9,7 @@
 
 namespace blink {
 
-class UseCounter;
+class CSSParserContext;
 
 enum CSSAtRuleID {
   CSSAtRuleInvalid = 0,
@@ -30,7 +30,7 @@
 
 CSSAtRuleID cssAtRuleID(StringView name);
 
-void countAtRule(UseCounter*, CSSAtRuleID);
+void countAtRule(const CSSParserContext*, CSSAtRuleID);
 
 }  // namespace blink
 
diff --git a/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp b/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp
index c5ed81c..43ab191 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp
@@ -45,9 +45,8 @@
   if (!m_document)
     m_document = m_owningContents->anyOwnerDocument();
 
-  UseCounter* useCounter = UseCounter::getFrom(m_document);
-  if (useCounter != m_context->useCounter())
-    m_context = CSSParserContext::create(m_context, useCounter);
+  if (!m_context->isDocumentHandleEqual(m_document))
+    m_context = CSSParserContext::create(m_context, m_document);
   return m_context;
 }
 
diff --git a/third_party/WebKit/Source/core/css/parser/CSSLazyParsingTest.cpp b/third_party/WebKit/Source/core/css/parser/CSSLazyParsingTest.cpp
index 7d5fbf82..62386cc 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSLazyParsingTest.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSLazyParsingTest.cpp
@@ -120,7 +120,7 @@
       DummyPageHolder::create(IntSize(500, 500));
   CSSParserContext* context = CSSParserContext::create(
       HTMLStandardMode, CSSParserContext::DynamicProfile,
-      UseCounter::getFrom(&dummyHolder->document()));
+      &dummyHolder->document());
   m_cachedContents = StyleSheetContents::create(context);
   {
     CSSStyleSheet* sheet =
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserContext.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserContext.cpp
index dae63bff1..2ac0321 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserContext.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserContext.cpp
@@ -6,6 +6,7 @@
 
 #include "core/css/CSSStyleSheet.h"
 #include "core/css/StyleSheetContents.h"
+#include "core/frame/FrameHost.h"
 #include "core/frame/Settings.h"
 #include "core/frame/csp/ContentSecurityPolicy.h"
 #include "core/html/imports/HTMLImportsController.h"
@@ -16,41 +17,42 @@
 CSSParserContext* CSSParserContext::createWithStyleSheet(
     const CSSParserContext* other,
     const CSSStyleSheet* styleSheet) {
-  return CSSParserContext::create(other, UseCounter::getFrom(styleSheet));
+  return CSSParserContext::create(
+      other, CSSStyleSheet::singleOwnerDocument(styleSheet));
 }
 
 // static
 CSSParserContext* CSSParserContext::createWithStyleSheetContents(
     const CSSParserContext* other,
     const StyleSheetContents* styleSheetContents) {
-  return CSSParserContext::create(other,
-                                  UseCounter::getFrom(styleSheetContents));
+  return CSSParserContext::create(
+      other, StyleSheetContents::singleOwnerDocument(styleSheetContents));
 }
 
 // static
 CSSParserContext* CSSParserContext::create(const CSSParserContext* other,
-                                           UseCounter* useCounter) {
+                                           const Document* m_document) {
   return new CSSParserContext(
       other->m_baseURL, other->m_charset, other->m_mode, other->m_matchMode,
       other->m_profile, other->m_referrer, other->m_isHTMLDocument,
       other->m_useLegacyBackgroundSizeShorthandBehavior,
-      other->m_shouldCheckContentSecurityPolicy, useCounter);
+      other->m_shouldCheckContentSecurityPolicy, m_document);
 }
 
 // static
 CSSParserContext* CSSParserContext::create(CSSParserMode mode,
                                            SelectorProfile profile,
-                                           UseCounter* useCounter) {
+                                           const Document* m_document) {
   return new CSSParserContext(KURL(), emptyString, mode, mode, profile,
                               Referrer(), false, false,
-                              DoNotCheckContentSecurityPolicy, useCounter);
+                              DoNotCheckContentSecurityPolicy, m_document);
 }
 
 // static
 CSSParserContext* CSSParserContext::create(const Document& document,
-                                           UseCounter* useCounter) {
+                                           const Document* m_document) {
   return CSSParserContext::create(document, KURL(), emptyString, DynamicProfile,
-                                  useCounter);
+                                  m_document);
 }
 
 // static
@@ -58,7 +60,7 @@
                                            const KURL& baseURLOverride,
                                            const String& charset,
                                            SelectorProfile profile,
-                                           UseCounter* useCounter) {
+                                           const Document* m_document) {
   const KURL baseURL =
       baseURLOverride.isNull() ? document.baseURL() : baseURLOverride;
 
@@ -89,7 +91,7 @@
   return new CSSParserContext(baseURL, charset, mode, matchMode, profile,
                               referrer, document.isHTMLDocument(),
                               useLegacyBackgroundSizeShorthandBehavior,
-                              policyDisposition, useCounter);
+                              policyDisposition, m_document);
 }
 
 CSSParserContext::CSSParserContext(
@@ -102,7 +104,7 @@
     bool isHTMLDocument,
     bool useLegacyBackgroundSizeShorthandBehavior,
     ContentSecurityPolicyDisposition policyDisposition,
-    UseCounter* useCounter)
+    const Document* m_document)
     : m_baseURL(baseURL),
       m_charset(charset),
       m_mode(mode),
@@ -113,7 +115,7 @@
       m_useLegacyBackgroundSizeShorthandBehavior(
           useLegacyBackgroundSizeShorthandBehavior),
       m_shouldCheckContentSecurityPolicy(policyDisposition),
-      m_useCounter(useCounter) {}
+      m_document(m_document) {}
 
 bool CSSParserContext::operator==(const CSSParserContext& other) const {
   return m_baseURL == other.m_baseURL && m_charset == other.m_charset &&
@@ -138,4 +140,25 @@
   return KURL(baseURL(), url, charset());
 }
 
+void CSSParserContext::count(UseCounter::Feature feature) const {
+  if (isUseCounterRecordingEnabled())
+    UseCounter::count(*m_document, feature);
+}
+
+void CSSParserContext::count(CSSParserMode mode, CSSPropertyID property) const {
+  if (isUseCounterRecordingEnabled() && m_document->frameHost()) {
+    UseCounter* useCounter = &m_document->frameHost()->useCounter();
+    if (useCounter)
+      useCounter->count(mode, property);
+  }
+}
+
+bool CSSParserContext::isDocumentHandleEqual(const Document* other) const {
+  return m_document.get() == other;
+}
+
+DEFINE_TRACE(CSSParserContext) {
+  visitor->trace(m_document);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserContext.h b/third_party/WebKit/Source/core/css/parser/CSSParserContext.h
index 33381ec..c1babda 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserContext.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserContext.h
@@ -7,6 +7,8 @@
 
 #include "core/CoreExport.h"
 #include "core/css/parser/CSSParserMode.h"
+#include "core/dom/Document.h"
+#include "core/frame/UseCounter.h"
 #include "platform/loader/fetch/ResourceLoaderOptions.h"
 #include "platform/weborigin/KURL.h"
 #include "platform/weborigin/Referrer.h"
@@ -14,9 +16,7 @@
 namespace blink {
 
 class CSSStyleSheet;
-class Document;
 class StyleSheetContents;
-class UseCounter;
 
 class CORE_EXPORT CSSParserContext
     : public GarbageCollectedFinalized<CSSParserContext> {
@@ -25,7 +25,7 @@
   enum SelectorProfile { DynamicProfile, StaticProfile };
 
   // All three of these factories copy the context and override the current
-  // UseCounter handle.
+  // Document handle used for UseCounter.
   static CSSParserContext* createWithStyleSheet(const CSSParserContext*,
                                                 const CSSStyleSheet*);
   static CSSParserContext* createWithStyleSheetContents(
@@ -34,20 +34,19 @@
   // FIXME: This constructor shouldn't exist if we properly piped the UseCounter
   // through the CSS subsystem. Currently the UseCounter life time is too crazy
   // and we need a way to override it.
-  static CSSParserContext* create(const CSSParserContext* other, UseCounter*);
+  static CSSParserContext* create(const CSSParserContext* other,
+                                  const Document* useCounterDocument);
 
   static CSSParserContext* create(CSSParserMode,
                                   SelectorProfile = DynamicProfile,
-                                  UseCounter* = nullptr);
-  // FIXME: We shouldn't need the UseCounter argument as we could infer it from
-  // the Document but some callers want to disable use counting (e.g. the
-  // WebInspector).
-  static CSSParserContext* create(const Document&, UseCounter*);
+                                  const Document* useCounterDocument = nullptr);
+  static CSSParserContext* create(const Document&,
+                                  const Document* useCounterDocument);
   static CSSParserContext* create(const Document&,
                                   const KURL& baseURLOverride = KURL(),
                                   const String& charset = emptyString,
                                   SelectorProfile = DynamicProfile,
-                                  UseCounter* = nullptr);
+                                  const Document* useCounterDocument = nullptr);
 
   bool operator==(const CSSParserContext&) const;
   bool operator!=(const CSSParserContext& other) const {
@@ -80,16 +79,16 @@
 
   KURL completeURL(const String& url) const;
 
-  // This may return nullptr if counting is disabled.
-  // See comments on constructors.
-  UseCounter* useCounter() const { return m_useCounter; }
-  bool isUseCounterRecordingEnabled() const { return m_useCounter; }
+  void count(UseCounter::Feature) const;
+  void count(CSSParserMode, CSSPropertyID) const;
+  bool isUseCounterRecordingEnabled() const { return m_document; }
+  bool isDocumentHandleEqual(const Document* other) const;
 
   ContentSecurityPolicyDisposition shouldCheckContentSecurityPolicy() const {
     return m_shouldCheckContentSecurityPolicy;
   }
 
-  DEFINE_INLINE_TRACE() {}
+  DECLARE_TRACE();
 
  private:
   CSSParserContext(const KURL& baseURL,
@@ -101,7 +100,7 @@
                    bool isHTMLDocument,
                    bool useLegacyBackgroundSizeShorthandBehavior,
                    ContentSecurityPolicyDisposition,
-                   UseCounter*);
+                   const Document* useCounterDocument);
 
   KURL m_baseURL;
   String m_charset;
@@ -113,7 +112,7 @@
   bool m_useLegacyBackgroundSizeShorthandBehavior;
   ContentSecurityPolicyDisposition m_shouldCheckContentSecurityPolicy;
 
-  UseCounter* m_useCounter;
+  WeakMember<const Document> m_document;
 };
 
 CORE_EXPORT const CSSParserContext* strictCSSParserContext();
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
index 76269e9..8a3fb88 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
@@ -156,8 +156,7 @@
     Element* element) {
   Document& document = element->document();
   CSSParserContext* context = CSSParserContext::create(
-      document.elementSheet().contents()->parserContext(),
-      UseCounter::getFrom(&document));
+      document.elementSheet().contents()->parserContext(), &document);
   CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode()
                            ? HTMLStandardMode
                            : HTMLQuirksMode;
@@ -453,7 +452,7 @@
   CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek());
   CSSAtRuleID id = cssAtRuleID(name);
   if (id != CSSAtRuleInvalid && m_context->isUseCounterRecordingEnabled())
-    countAtRule(m_context->useCounter(), id);
+    countAtRule(m_context, id);
 
   if (range.atEnd() || range.peek().type() == SemicolonToken) {
     range.consume();
@@ -701,8 +700,7 @@
   if (nameToken.type() == IdentToken) {
     name = nameToken.value().toString();
   } else if (nameToken.type() == StringToken && webkitPrefixed) {
-    if (m_context->isUseCounterRecordingEnabled())
-      m_context->useCounter()->count(UseCounter::QuotedKeyframesRule);
+    m_context->count(UseCounter::QuotedKeyframesRule);
     name = nameToken.value().toString();
   } else {
     return nullptr;  // Parse error; expected ident token in @keyframes header
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index c4ad6da..d58e1163 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -126,8 +126,8 @@
   }
 
   // This doesn't count UA style sheets
-  if (parseSuccess && context->isUseCounterRecordingEnabled())
-    context->useCounter()->count(context->mode(), unresolvedProperty);
+  if (parseSuccess)
+    context->count(context->mode(), unresolvedProperty);
 
   if (!parseSuccess)
     parsedProperties.shrink(parsedPropertiesSize);
@@ -497,8 +497,7 @@
 
   if (allowQuotedName && range.peek().type() == StringToken) {
     // Legacy support for strings in prefixed animations.
-    if (context->isUseCounterRecordingEnabled())
-      context->useCounter()->count(UseCounter::QuotedAnimationName);
+    context->count(UseCounter::QuotedAnimationName);
 
     const CSSParserToken& token = range.consumeIncludingWhitespace();
     if (equalIgnoringASCIICase(token.value(), "none"))
@@ -793,8 +792,7 @@
     parsedValue = parseSingleShadow(args, context->mode(), false, false);
   } else {
     if (args.atEnd()) {
-      if (context->isUseCounterRecordingEnabled())
-        context->useCounter()->count(UseCounter::CSSFilterFunctionNoArguments);
+      context->count(UseCounter::CSSFilterFunctionNoArguments);
       return filterValue;
     }
     if (filterType == CSSValueBrightness) {
@@ -934,12 +932,11 @@
   CSSValue* value = consumePathOrNone(range);
 
   // Count when we receive a valid path other than 'none'.
-  if (context->isUseCounterRecordingEnabled() && value &&
-      !value->isIdentifierValue()) {
+  if (value && !value->isIdentifierValue()) {
     if (isMotionPath) {
-      context->useCounter()->count(UseCounter::CSSMotionInEffect);
+      context->count(UseCounter::CSSMotionInEffect);
     } else {
-      context->useCounter()->count(UseCounter::CSSOffsetInEffect);
+      context->count(UseCounter::CSSOffsetInEffect);
     }
   }
   return value;
@@ -1013,10 +1010,7 @@
     double perspective;
     if (!consumeNumberRaw(args, perspective) || perspective < 0)
       return false;
-    if (context->isUseCounterRecordingEnabled()) {
-      context->useCounter()->count(
-          UseCounter::UnitlessPerspectiveInTransformProperty);
-    }
+    context->count(UseCounter::UnitlessPerspectiveInTransformProperty);
     parsedValue = CSSPrimitiveValue::create(
         perspective, CSSPrimitiveValue::UnitType::Pixels);
   }
@@ -1162,10 +1156,7 @@
     double perspective;
     if (!consumeNumberRaw(range, perspective))
       return nullptr;
-    if (context->isUseCounterRecordingEnabled()) {
-      context->useCounter()->count(
-          UseCounter::UnitlessPerspectiveInPerspectiveProperty);
-    }
+    context->count(UseCounter::UnitlessPerspectiveInPerspectiveProperty);
     parsedValue = CSSPrimitiveValue::create(
         perspective, CSSPrimitiveValue::UnitType::Pixels);
   }
@@ -2016,21 +2007,20 @@
         else
           feature = UseCounter::CSSValueAppearanceOthers;
       }
-      context->useCounter()->count(feature);
+      context->count(feature);
       break;
     }
 
     case CSSPropertyWebkitUserModify: {
       switch (valueID) {
         case CSSValueReadOnly:
-          context->useCounter()->count(UseCounter::CSSValueUserModifyReadOnly);
+          context->count(UseCounter::CSSValueUserModifyReadOnly);
           break;
         case CSSValueReadWrite:
-          context->useCounter()->count(UseCounter::CSSValueUserModifyReadWrite);
+          context->count(UseCounter::CSSValueUserModifyReadWrite);
           break;
         case CSSValueReadWritePlaintextOnly:
-          context->useCounter()->count(
-              UseCounter::CSSValueUserModifyReadWritePlaintextOnly);
+          context->count(UseCounter::CSSValueUserModifyReadWritePlaintextOnly);
           break;
         default:
           NOTREACHED();
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
index b691724..ed50200 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -1200,16 +1200,12 @@
     result = consumeRadialGradient(args, context->mode(), Repeating);
   } else if (id == CSSValueWebkitLinearGradient) {
     // FIXME: This should send a deprecation message.
-    if (context->isUseCounterRecordingEnabled())
-      context->useCounter()->count(UseCounter::DeprecatedWebKitLinearGradient);
+    context->count(UseCounter::DeprecatedWebKitLinearGradient);
     result = consumeLinearGradient(args, context->mode(), NonRepeating,
                                    CSSPrefixedLinearGradient);
   } else if (id == CSSValueWebkitRepeatingLinearGradient) {
     // FIXME: This should send a deprecation message.
-    if (context->isUseCounterRecordingEnabled()) {
-      context->useCounter()->count(
-          UseCounter::DeprecatedWebKitRepeatingLinearGradient);
-    }
+    context->count(UseCounter::DeprecatedWebKitRepeatingLinearGradient);
     result = consumeLinearGradient(args, context->mode(), Repeating,
                                    CSSPrefixedLinearGradient);
   } else if (id == CSSValueRepeatingLinearGradient) {
@@ -1220,20 +1216,15 @@
                                    CSSLinearGradient);
   } else if (id == CSSValueWebkitGradient) {
     // FIXME: This should send a deprecation message.
-    if (context->isUseCounterRecordingEnabled())
-      context->useCounter()->count(UseCounter::DeprecatedWebKitGradient);
+    context->count(UseCounter::DeprecatedWebKitGradient);
     result = consumeDeprecatedGradient(args, context->mode());
   } else if (id == CSSValueWebkitRadialGradient) {
     // FIXME: This should send a deprecation message.
-    if (context->isUseCounterRecordingEnabled())
-      context->useCounter()->count(UseCounter::DeprecatedWebKitRadialGradient);
+    context->count(UseCounter::DeprecatedWebKitRadialGradient);
     result =
         consumeDeprecatedRadialGradient(args, context->mode(), NonRepeating);
   } else if (id == CSSValueWebkitRepeatingRadialGradient) {
-    if (context->isUseCounterRecordingEnabled()) {
-      context->useCounter()->count(
-          UseCounter::DeprecatedWebKitRepeatingRadialGradient);
-    }
+    context->count(UseCounter::DeprecatedWebKitRepeatingRadialGradient);
     result = consumeDeprecatedRadialGradient(args, context->mode(), Repeating);
   } else if (id == CSSValueWebkitCrossFade) {
     result = consumeCrossFade(args, context);
diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
index 6de81c9..9143aa3 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
@@ -808,7 +808,7 @@
 
 void CSSSelectorParser::recordUsageAndDeprecations(
     const CSSSelectorList& selectorList) {
-  if (!m_context->useCounter())
+  if (!m_context->isUseCounterRecordingEnabled())
     return;
 
   for (const CSSSelector* selector = selectorList.first(); selector;
@@ -904,11 +904,11 @@
           Deprecation::countDeprecation(*m_styleSheet->anyOwnerDocument(),
                                         feature);
         } else {
-          m_context->useCounter()->count(feature);
+          m_context->count(feature);
         }
       }
       if (current->relation() == CSSSelector::IndirectAdjacent)
-        m_context->useCounter()->count(UseCounter::CSSSelectorIndirectAdjacent);
+        m_context->count(UseCounter::CSSSelectorIndirectAdjacent);
       if (current->selectorList())
         recordUsageAndDeprecations(*current->selectorList());
     }
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPICursor.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPICursor.cpp
index 918f758..dc663be 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPICursor.cpp
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPICursor.cpp
@@ -42,11 +42,11 @@
   }
 
   CSSValueID id = range.peek().id();
-  if (!range.atEnd() && context->isUseCounterRecordingEnabled()) {
+  if (!range.atEnd()) {
     if (id == CSSValueWebkitZoomIn)
-      context->useCounter()->count(UseCounter::PrefixedCursorZoomIn);
+      context->count(UseCounter::PrefixedCursorZoomIn);
     else if (id == CSSValueWebkitZoomOut)
-      context->useCounter()->count(UseCounter::PrefixedCursorZoomOut);
+      context->count(UseCounter::PrefixedCursorZoomOut);
   }
   CSSValue* cursorType = nullptr;
   if (id == CSSValueHand) {
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIOffsetPosition.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIOffsetPosition.cpp
index 1fc270d4..76f80cc9 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIOffsetPosition.cpp
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIOffsetPosition.cpp
@@ -21,8 +21,8 @@
       range, context->mode(), CSSPropertyParserHelpers::UnitlessQuirk::Forbid);
 
   // Count when we receive a valid position other than 'auto'.
-  if (context->isUseCounterRecordingEnabled() && value && value->isValuePair())
-    context->useCounter()->count(UseCounter::CSSOffsetInEffect);
+  if (value && value->isValuePair())
+    context->count(UseCounter::CSSOffsetInEffect);
   return value;
 }
 
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIZoom.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIZoom.cpp
index dc8a261..cb18fb11 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIZoom.cpp
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIZoom.cpp
@@ -26,17 +26,17 @@
           CSSPropertyParserHelpers::consumeNumber(range, ValueRangeNonNegative);
     }
   }
-  if (zoom && context->isUseCounterRecordingEnabled()) {
+  if (zoom) {
     if (!(token.id() == CSSValueNormal ||
           (token.type() == NumberToken &&
            toCSSPrimitiveValue(zoom)->getDoubleValue() == 1) ||
           (token.type() == PercentageToken &&
            toCSSPrimitiveValue(zoom)->getDoubleValue() == 100)))
-      context->useCounter()->count(UseCounter::CSSZoomNotEqualToOne);
+      context->count(UseCounter::CSSZoomNotEqualToOne);
     if (token.id() == CSSValueReset)
-      context->useCounter()->count(UseCounter::CSSZoomReset);
+      context->count(UseCounter::CSSZoomReset);
     if (token.id() == CSSValueDocument)
-      context->useCounter()->count(UseCounter::CSSZoomDocument);
+      context->count(UseCounter::CSSZoomDocument);
   }
   return zoom;
 }
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyLengthUtils.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyLengthUtils.cpp
index 1222ac6..f5189ae 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSPropertyLengthUtils.cpp
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyLengthUtils.cpp
@@ -17,24 +17,21 @@
       id == CSSValueWebkitFillAvailable || id == CSSValueWebkitFitContent ||
       id == CSSValueMinContent || id == CSSValueMaxContent ||
       id == CSSValueFitContent) {
-    if (context->isUseCounterRecordingEnabled()) {
-      UseCounter* useCounter = context->useCounter();
-      switch (id) {
-        case CSSValueWebkitMinContent:
-          useCounter->count(UseCounter::CSSValuePrefixedMinContent);
-          break;
-        case CSSValueWebkitMaxContent:
-          useCounter->count(UseCounter::CSSValuePrefixedMaxContent);
-          break;
-        case CSSValueWebkitFillAvailable:
-          useCounter->count(UseCounter::CSSValuePrefixedFillAvailable);
-          break;
-        case CSSValueWebkitFitContent:
-          useCounter->count(UseCounter::CSSValuePrefixedFitContent);
-          break;
-        default:
-          break;
-      }
+    switch (id) {
+      case CSSValueWebkitMinContent:
+        context->count(UseCounter::CSSValuePrefixedMinContent);
+        break;
+      case CSSValueWebkitMaxContent:
+        context->count(UseCounter::CSSValuePrefixedMaxContent);
+        break;
+      case CSSValueWebkitFillAvailable:
+        context->count(UseCounter::CSSValuePrefixedFillAvailable);
+        break;
+      case CSSValueWebkitFitContent:
+        context->count(UseCounter::CSSValuePrefixedFitContent);
+        break;
+      default:
+        break;
     }
     return true;
   }
diff --git a/third_party/WebKit/Source/core/dom/PendingScript.cpp b/third_party/WebKit/Source/core/dom/PendingScript.cpp
index f3eb537..4507e23 100644
--- a/third_party/WebKit/Source/core/dom/PendingScript.cpp
+++ b/third_party/WebKit/Source/core/dom/PendingScript.cpp
@@ -218,9 +218,7 @@
   return false;
 }
 
-void PendingScript::onMemoryStateChange(MemoryState state) {
-  if (state != MemoryState::SUSPENDED)
-    return;
+void PendingScript::onPurgeMemory() {
   if (!m_streamer)
     return;
   m_streamer->cancel();
diff --git a/third_party/WebKit/Source/core/dom/PendingScript.h b/third_party/WebKit/Source/core/dom/PendingScript.h
index 51378fb..6c3dfaf 100644
--- a/third_party/WebKit/Source/core/dom/PendingScript.h
+++ b/third_party/WebKit/Source/core/dom/PendingScript.h
@@ -116,7 +116,7 @@
   void notifyAppendData(ScriptResource*) override;
 
   // MemoryCoordinatorClient
-  void onMemoryStateChange(MemoryState) override;
+  void onPurgeMemory() override;
 
   bool m_watchingForLoad;
   Member<Element> m_element;
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.cpp b/third_party/WebKit/Source/core/frame/UseCounter.cpp
index b16041f0..f424c14 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.cpp
+++ b/third_party/WebKit/Source/core/frame/UseCounter.cpp
@@ -1249,26 +1249,6 @@
   recordMeasurement(feature);
 }
 
-UseCounter* UseCounter::getFrom(const Document* document) {
-  if (document && document->frameHost())
-    return &document->frameHost()->useCounter();
-  return 0;
-}
-
-UseCounter* UseCounter::getFrom(const CSSStyleSheet* sheet) {
-  if (sheet)
-    return getFrom(sheet->contents());
-  return 0;
-}
-
-UseCounter* UseCounter::getFrom(const StyleSheetContents* sheetContents) {
-  // FIXME: We may want to handle stylesheets that have multiple owners
-  //        https://crbug.com/242125
-  if (sheetContents && sheetContents->hasSingleOwnerNode())
-    return getFrom(sheetContents->singleOwnerDocument());
-  return 0;
-}
-
 EnumerationHistogram& UseCounter::featuresHistogram() const {
   // Every SVGImage has it's own Page instance, and multiple web pages can
   // share the usage of a single SVGImage.  Ideally perhaps we'd delegate
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index 5392204..b78eab5f 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1487,10 +1487,6 @@
   // Invoked when a new document is loaded into the main frame of the page.
   void didCommitLoad(KURL);
 
-  static UseCounter* getFrom(const Document*);
-  static UseCounter* getFrom(const CSSStyleSheet*);
-  static UseCounter* getFrom(const StyleSheetContents*);
-
   static int mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyID);
 
   // When muted, all calls to "count" functions are ignoed.  May be nested.
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
index 0dbfa0fc..58984f54 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -1092,15 +1092,6 @@
   return lineCrossAxisExtent - childCrossExtent;
 }
 
-LayoutUnit LayoutFlexibleBox::availableAlignmentSpaceForChildBeforeStretching(
-    LayoutUnit lineCrossAxisExtent,
-    const LayoutBox& child) {
-  DCHECK(!child.isOutOfFlowPositioned());
-  LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) +
-                                crossAxisIntrinsicExtentForChild(child);
-  return lineCrossAxisExtent - childCrossExtent;
-}
-
 bool LayoutFlexibleBox::updateAutoMarginsInCrossAxis(
     LayoutBox& child,
     LayoutUnit availableAlignmentSpace) {
@@ -2089,16 +2080,12 @@
     LayoutBox& child,
     LayoutUnit lineCrossAxisExtent) {
   if (!hasOrthogonalFlow(child) && child.style()->logicalHeight().isAuto()) {
-    LayoutUnit heightBeforeStretching = childIntrinsicLogicalHeight(child);
     LayoutUnit stretchedLogicalHeight =
         std::max(child.borderAndPaddingLogicalHeight(),
-                 heightBeforeStretching +
-                     availableAlignmentSpaceForChildBeforeStretching(
-                         lineCrossAxisExtent, child));
+                 lineCrossAxisExtent - crossAxisMarginExtentForChild(child));
     DCHECK(!child.needsLayout());
     LayoutUnit desiredLogicalHeight = child.constrainLogicalHeightByMinMax(
-        stretchedLogicalHeight,
-        heightBeforeStretching - child.borderAndPaddingLogicalHeight());
+        stretchedLogicalHeight, child.intrinsicContentLogicalHeight());
 
     // FIXME: Can avoid laying out here in some cases. See
     // https://webkit.org/b/87905.
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
index ddb6f03..38f2c5f0 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
@@ -179,9 +179,6 @@
 
   LayoutUnit availableAlignmentSpaceForChild(LayoutUnit lineCrossAxisExtent,
                                              const LayoutBox& child);
-  LayoutUnit availableAlignmentSpaceForChildBeforeStretching(
-      LayoutUnit lineCrossAxisExtent,
-      const LayoutBox& child);
   LayoutUnit marginBoxAscentForChild(const LayoutBox& child);
 
   LayoutUnit computeChildMarginValue(Length margin);
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index bf203b45..54a33c0 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -1515,10 +1515,8 @@
   bool isContainer =
       m_owningLayer.layoutObject()->style()->canContainFixedPositionObjects() &&
       !m_owningLayer.isRootLayer();
-  // FIXME: we should make certain that childForSuperLayers will never be the
-  // m_squashingContainmentLayer here
   scrollingCoordinator->setLayerIsContainerForFixedPositionLayers(
-      childForSuperlayers(), isContainer);
+      m_graphicsLayer.get(), isContainer);
 }
 
 void CompositedLayerMapping::updateInternalHierarchy() {
diff --git a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
index 0152a5f8..b2eb801 100644
--- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
+++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
@@ -73,6 +73,9 @@
 
 static void updateAuxiliaryObjectProperties(const LayoutObject& object,
                                             PrePaintTreeWalkContext& context) {
+  if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+    return;
+
   if (!object.hasLayer())
     return;
 
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index cdd71835..33dc893 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -766,7 +766,6 @@
     return static_cast<EBreak>(m_nonInheritedData.m_breakAfter);
   }
   void setBreakAfter(EBreak b) {
-    DCHECK_LE(b, BreakValueLastAllowedForBreakAfterAndBefore);
     m_nonInheritedData.m_breakAfter = b;
   }
 
@@ -777,7 +776,6 @@
     return static_cast<EBreak>(m_nonInheritedData.m_breakBefore);
   }
   void setBreakBefore(EBreak b) {
-    DCHECK_LE(b, BreakValueLastAllowedForBreakAfterAndBefore);
     m_nonInheritedData.m_breakBefore = b;
   }
 
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
index 18e5f8c..88b0c7c 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -330,10 +330,7 @@
   BreakPage,
   BreakRecto,
   BreakRight,
-  BreakVerso,
-  BreakValueLastAllowedForBreakAfterAndBefore = BreakVerso,
-  BreakAlways  // Only needed by {page,-webkit-column}-break-{after,before}
-               // shorthands.
+  BreakVerso
 };
 
 enum class ECursor : unsigned {
diff --git a/third_party/WebKit/Source/core/style/StyleVisualData.cpp b/third_party/WebKit/Source/core/style/StyleVisualData.cpp
index 55a9a72a..7e29491 100644
--- a/third_party/WebKit/Source/core/style/StyleVisualData.cpp
+++ b/third_party/WebKit/Source/core/style/StyleVisualData.cpp
@@ -37,8 +37,6 @@
       clip(o.clip),
       hasAutoClip(o.hasAutoClip),
       textDecoration(o.textDecoration),
-      m_zoom(ComputedStyle::initialZoom()) {
-  DCHECK(m_zoom == o.m_zoom);  // crbug.com/689330
-}
+      m_zoom(o.m_zoom) {}
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js
index b74e789..8a6deaf 100644
--- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js
@@ -48,6 +48,7 @@
 
     this._sidebarTree = new UI.TreeOutlineInShadow();
     this._sidebarTree.registerRequiredCSS('profiler/profilesSidebarTree.css');
+    this._sidebarTree.element.classList.add('profiles-sidebar-tree-box');
     this.panelSidebarElement().appendChild(this._sidebarTree.element);
 
     this._sidebarTree.appendChild(this.profilesItemTreeElement);
@@ -60,7 +61,7 @@
     this._toolbarElement = createElementWithClass('div', 'profiles-toolbar');
     mainContainer.element.insertBefore(this._toolbarElement, mainContainer.element.firstChild);
 
-    this.panelSidebarElement().classList.add('profiles-sidebar-tree-box');
+    this.panelSidebarElement().classList.add('profiles-tree-sidebar');
     var toolbarContainerLeft = createElementWithClass('div', 'profiles-toolbar');
     this.panelSidebarElement().insertBefore(toolbarContainerLeft, this.panelSidebarElement().firstChild);
     var toolbar = new UI.Toolbar('', toolbarContainerLeft);
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css b/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css
index 3d86ce7..7b257ec7 100644
--- a/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/profiler/profilesPanel.css
@@ -67,10 +67,16 @@
 .profiles-toolbar {
     background-color: #f3f3f3;
     border-bottom: 1px solid #ccc;
+    flex-shrink: 0;
+}
+
+.profiles-tree-sidebar {
+    flex: auto;
+    overflow: hidden;
 }
 
 .profiles-sidebar-tree-box {
-    flex: auto;
+    overflow-y: auto;
 }
 
 .profile-view {
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBKey.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBKey.cpp
index 356ad3b..73931db 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBKey.cpp
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBKey.cpp
@@ -83,7 +83,7 @@
     case NumberType:
       return compareNumbers(m_number, other->m_number);
     case InvalidType:
-    case MinType:
+    case TypeEnumMax:
       ASSERT_NOT_REACHED();
       return 0;
   }
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBKey.h b/third_party/WebKit/Source/modules/indexeddb/IDBKey.h
index 4b9ff35..be542af81 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBKey.h
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBKey.h
@@ -63,14 +63,16 @@
   DECLARE_TRACE();
 
   // In order of the least to the highest precedent in terms of sort order.
+  // These values are written to logs. New enum values can be added, but
+  // existing enums must never be renumbered or deleted and reused.
   enum Type {
     InvalidType = 0,
-    ArrayType,
-    BinaryType,
-    StringType,
-    DateType,
-    NumberType,
-    MinType
+    ArrayType = 1,
+    BinaryType = 2,
+    StringType = 3,
+    DateType = 4,
+    NumberType = 5,
+    TypeEnumMax,
   };
 
   Type getType() const { return m_type; }
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
index eb6d1fd..7971e80 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
@@ -25,6 +25,10 @@
 
 #include "modules/indexeddb/IDBObjectStore.h"
 
+#include <memory>
+
+#include <v8.h>
+
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptState.h"
 #include "bindings/core/v8/SerializedScriptValueFactory.h"
@@ -38,14 +42,13 @@
 #include "modules/indexeddb/IDBDatabase.h"
 #include "modules/indexeddb/IDBKeyPath.h"
 #include "modules/indexeddb/IDBTracing.h"
+#include "platform/Histogram.h"
 #include "platform/SharedBuffer.h"
 #include "public/platform/WebBlobInfo.h"
 #include "public/platform/WebData.h"
 #include "public/platform/WebVector.h"
 #include "public/platform/modules/indexeddb/WebIDBKey.h"
 #include "public/platform/modules/indexeddb/WebIDBKeyRange.h"
-#include <memory>
-#include <v8.h>
 
 using blink::WebBlobInfo;
 using blink::WebIDBCallbacks;
@@ -321,15 +324,25 @@
   if (!indexKey)
     return;
 
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(
+      EnumerationHistogram, keyTypeHistogram,
+      new EnumerationHistogram(
+          "WebCore.IndexedDB.ObjectStore.IndexEntry.KeyType",
+          static_cast<int>(IDBKey::TypeEnumMax)));
+
   if (!indexMetadata.multiEntry || indexKey->getType() != IDBKey::ArrayType) {
     if (!indexKey->isValid())
       return;
 
     indexKeys->push_back(indexKey);
+    keyTypeHistogram.count(static_cast<int>(indexKey->getType()));
   } else {
     DCHECK(indexMetadata.multiEntry);
     DCHECK_EQ(indexKey->getType(), IDBKey::ArrayType);
-    indexKeys->appendVector(indexKey->toMultiEntryArray());
+    IDBKey::KeyArray array = indexKey->toMultiEntryArray();
+    for (const IDBKey* key : array)
+      keyTypeHistogram.count(static_cast<int>(key->getType()));
+    indexKeys->appendVector(array);
   }
 }
 
@@ -447,9 +460,10 @@
     return nullptr;
   }
   if (usesInLineKeys) {
-    if (clone.isEmpty())
+    if (clone.isEmpty()) {
       clone =
           deserializeScriptValue(scriptState, serializedValue.get(), &blobInfo);
+    }
     IDBKey* keyPathKey = ScriptValue::to<IDBKey*>(scriptState->isolate(), clone,
                                                   exceptionState, keyPath);
     if (exceptionState.hadException())
@@ -490,12 +504,21 @@
     return nullptr;
   }
 
+  if (key && usesInLineKeys) {
+    DEFINE_THREAD_SAFE_STATIC_LOCAL(
+        EnumerationHistogram, keyTypeHistogram,
+        new EnumerationHistogram("WebCore.IndexedDB.ObjectStore.Record.KeyType",
+                                 static_cast<int>(IDBKey::TypeEnumMax)));
+    keyTypeHistogram.count(static_cast<int>(key->getType()));
+  }
+
   Vector<int64_t> indexIds;
   HeapVector<IndexKeys> indexKeys;
   for (const auto& it : metadata().indexes) {
-    if (clone.isEmpty())
+    if (clone.isEmpty()) {
       clone =
           deserializeScriptValue(scriptState, serializedValue.get(), &blobInfo);
+    }
     IndexKeys keys;
     generateIndexKeysForValue(scriptState->isolate(), *it.value, clone, &keys);
     indexIds.push_back(it.key);
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index 6c36e04..d053681f 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -405,14 +405,10 @@
     "audio/AudioDestination.cpp",
     "audio/AudioDestination.h",
     "audio/AudioDestinationConsumer.h",
-    "audio/AudioFIFO.cpp",
-    "audio/AudioFIFO.h",
     "audio/AudioFileReader.h",
     "audio/AudioIOCallback.h",
     "audio/AudioProcessor.cpp",
     "audio/AudioProcessor.h",
-    "audio/AudioPullFIFO.cpp",
-    "audio/AudioPullFIFO.h",
     "audio/AudioResampler.cpp",
     "audio/AudioResampler.h",
     "audio/AudioResamplerKernel.cpp",
@@ -459,6 +455,8 @@
     "audio/MultiChannelResampler.h",
     "audio/Panner.cpp",
     "audio/Panner.h",
+    "audio/PushPullFIFO.cpp",
+    "audio/PushPullFIFO.h",
     "audio/Reverb.cpp",
     "audio/Reverb.h",
     "audio/ReverbAccumulationBuffer.cpp",
@@ -1699,6 +1697,7 @@
     "animation/CompositorAnimationTimelineTest.cpp",
     "animation/CompositorFloatAnimationCurveTest.cpp",
     "animation/TimingFunctionTest.cpp",
+    "audio/PushPullFIFOTest.cpp",
     "blob/BlobDataTest.cpp",
     "exported/FilePathConversionTest.cpp",
     "exported/WebStringTest.cpp",
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
index 8dd8a65..c011a96 100644
--- a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
+++ b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
@@ -65,19 +65,15 @@
 void MemoryCoordinator::onMemoryStateChange(MemoryState state) {
   for (auto& client : m_clients)
     client->onMemoryStateChange(state);
-  // Font cache invalidation always causes full layout. This increases
-  // tab switching cost significantly (e.g. en.wikipedia.org/wiki/Wikipedia).
-  // So we should not invalidate the font cache in purge+throttle. We should
-  // invalidate the font cache only when receiving a critical memory pressure.
-  if (state == MemoryState::SUSPENDED)
-    ImageDecodingStore::instance().clear();
-  WTF::Partitions::decommitFreeableMemory();
 }
 
 void MemoryCoordinator::onPurgeMemory() {
-  // TODO(tasak|bashi): Move code from onMemoryStateChange(). Currently
-  // onMemoryStateChange() is called when the purge+throttled experiment is
-  // enabled.
+  // Don't call clearMemory() because font cache invalidation always causes full
+  // layout. This increases tab switching cost significantly (e.g.
+  // en.wikipedia.org/wiki/Wikipedia). So we should not invalidate the font
+  // cache in purge+throttle.
+  ImageDecodingStore::instance().clear();
+  WTF::Partitions::decommitFreeableMemory();
 }
 
 void MemoryCoordinator::clearMemory() {
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.h b/third_party/WebKit/Source/platform/MemoryCoordinator.h
index 939c3cec..8e78cbd6 100644
--- a/third_party/WebKit/Source/platform/MemoryCoordinator.h
+++ b/third_party/WebKit/Source/platform/MemoryCoordinator.h
@@ -22,6 +22,8 @@
   virtual void onMemoryPressure(WebMemoryPressureLevel) {}
 
   virtual void onMemoryStateChange(MemoryState) {}
+
+  virtual void onPurgeMemory() {}
 };
 
 // MemoryCoordinator listens to some events which could be opportunities
diff --git a/third_party/WebKit/Source/platform/audio/AudioDestination.cpp b/third_party/WebKit/Source/platform/audio/AudioDestination.cpp
index dcf0ea58..70ca828e 100644
--- a/third_party/WebKit/Source/platform/audio/AudioDestination.cpp
+++ b/third_party/WebKit/Source/platform/audio/AudioDestination.cpp
@@ -28,14 +28,14 @@
 
 #include "platform/audio/AudioDestination.h"
 
+#include <memory>
 #include "platform/Histogram.h"
-#include "platform/audio/AudioPullFIFO.h"
 #include "platform/audio/AudioUtilities.h"
+#include "platform/audio/PushPullFIFO.h"
 #include "platform/weborigin/SecurityOrigin.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebSecurityOrigin.h"
 #include "wtf/PtrUtil.h"
-#include <memory>
 
 namespace blink {
 
@@ -67,6 +67,8 @@
       m_outputBus(AudioBus::create(numberOfOutputChannels,
                                    AudioUtilities::kRenderQuantumFrames,
                                    false)),
+      m_renderBus(AudioBus::create(numberOfOutputChannels,
+                                   AudioUtilities::kRenderQuantumFrames)),
       m_framesElapsed(0) {
   // Calculate the optimum buffer size first.
   if (calculateBufferSize()) {
@@ -80,9 +82,8 @@
     DCHECK(m_webAudioDevice);
 
     // Create a FIFO.
-    m_fifo = WTF::wrapUnique(
-        new AudioPullFIFO(*this, numberOfOutputChannels, kFIFOSize,
-                          AudioUtilities::kRenderQuantumFrames));
+    m_fifo =
+        WTF::wrapUnique(new PushPullFIFO(numberOfOutputChannels, kFIFOSize));
   } else {
     NOTREACHED();
   }
@@ -97,13 +98,8 @@
                               double delay,
                               double delayTimestamp,
                               size_t priorFramesSkipped) {
-  DCHECK_EQ(destinationData.size(), m_numberOfOutputChannels);
-  if (destinationData.size() != m_numberOfOutputChannels)
-    return;
-
-  DCHECK_EQ(numberOfFrames, m_callbackBufferSize);
-  if (numberOfFrames != m_callbackBufferSize)
-    return;
+  CHECK_EQ(destinationData.size(), m_numberOfOutputChannels);
+  CHECK_EQ(numberOfFrames, m_callbackBufferSize);
 
   m_framesElapsed -= std::min(m_framesElapsed, priorFramesSkipped);
   double outputPosition =
@@ -116,32 +112,41 @@
   // FIFO.
   for (unsigned i = 0; i < m_numberOfOutputChannels; ++i)
     m_outputBus->setChannelMemory(i, destinationData[i], numberOfFrames);
-  m_fifo->consume(m_outputBus.get(), numberOfFrames);
 
-  m_framesElapsed += numberOfFrames;
-}
+  // Number of frames to render via WebAudio graph. |framesToRender > 0| means
+  // the frames in FIFO is not enough to fulfill the requested frames from the
+  // audio device.
+  size_t framesToRender = numberOfFrames > m_fifo->framesAvailable()
+                              ? numberOfFrames - m_fifo->framesAvailable()
+                              : 0;
 
-void AudioDestination::provideInput(AudioBus* outputBus,
-                                    size_t framesToProcess) {
-  AudioIOPosition outputPosition = m_outputPosition;
+  for (size_t pushedFrames = 0; pushedFrames < framesToRender;
+       pushedFrames += AudioUtilities::kRenderQuantumFrames) {
+    // If platform buffer is more than two times longer than |framesToProcess|
+    // we do not want output position to get stuck so we promote it
+    // using the elapsed time from the moment it was initially obtained.
+    if (m_callbackBufferSize > AudioUtilities::kRenderQuantumFrames * 2) {
+      double delta =
+          (base::TimeTicks::Now() - m_outputPositionReceivedTimestamp)
+              .InSecondsF();
+      m_outputPosition.position += delta;
+      m_outputPosition.timestamp += delta;
+    }
 
-  // If platform buffer is more than two times longer than |framesToProcess|
-  // we do not want output position to get stuck so we promote it
-  // using the elapsed time from the moment it was initially obtained.
-  if (m_callbackBufferSize > framesToProcess * 2) {
-    double delta = (base::TimeTicks::Now() - m_outputPositionReceivedTimestamp)
-                       .InSecondsF();
-    outputPosition.position += delta;
-    outputPosition.timestamp += delta;
+    // Some implementations give only rough estimation of |delay| so
+    // we might have negative estimation |outputPosition| value.
+    if (m_outputPosition.position < 0.0)
+      m_outputPosition.position = 0.0;
+
+    // Process WebAudio graph and push the rendered output to FIFO.
+    m_callback.render(nullptr, m_renderBus.get(),
+                      AudioUtilities::kRenderQuantumFrames, m_outputPosition);
+    m_fifo->push(m_renderBus.get());
   }
 
-  // Some implementations give only rough estimation of |delay| so
-  // we might have negative estimation |outputPosition| value.
-  if (outputPosition.position < 0.0)
-    outputPosition.position = 0.0;
+  m_fifo->pull(m_outputBus.get(), numberOfFrames);
 
-  // To fill the FIFO, start the render call chain of the destination node.
-  m_callback.render(nullptr, outputBus, framesToProcess, outputPosition);
+  m_framesElapsed += numberOfFrames;
 }
 
 void AudioDestination::start() {
diff --git a/third_party/WebKit/Source/platform/audio/AudioDestination.h b/third_party/WebKit/Source/platform/audio/AudioDestination.h
index d0e35b8..f5c699a1 100644
--- a/third_party/WebKit/Source/platform/audio/AudioDestination.h
+++ b/third_party/WebKit/Source/platform/audio/AudioDestination.h
@@ -31,7 +31,6 @@
 
 #include "platform/audio/AudioBus.h"
 #include "platform/audio/AudioIOCallback.h"
-#include "platform/audio/AudioSourceProvider.h"
 #include "public/platform/WebAudioDevice.h"
 #include "public/platform/WebVector.h"
 #include "wtf/Allocator.h"
@@ -41,15 +40,14 @@
 
 namespace blink {
 
-class AudioPullFIFO;
+class PushPullFIFO;
 class SecurityOrigin;
 
 // The AudioDestination class is an audio sink interface between the media
 // renderer and the Blink's WebAudio module. It has a FIFO to adapt the
 // different processing block sizes of WebAudio renderer and actual hardware
 // audio callback.
-class PLATFORM_EXPORT AudioDestination : public WebAudioDevice::RenderCallback,
-                                         public AudioSourceProvider {
+class PLATFORM_EXPORT AudioDestination : public WebAudioDevice::RenderCallback {
   USING_FAST_MALLOC(AudioDestination);
   WTF_MAKE_NONCOPYABLE(AudioDestination);
 
@@ -74,9 +72,6 @@
               double delayTimestamp,
               size_t priorFramesSkipped) override;
 
-  // AudioSourceProvider (FIFO)
-  void provideInput(AudioBus* outputBus, size_t framesToProcess) override;
-
   virtual void start();
   virtual void stop();
 
@@ -98,8 +93,15 @@
   // The render callback function of WebAudio engine. (i.e. DestinationNode)
   AudioIOCallback& m_callback;
 
+  // To pass the data from FIFO to the audio device callback.
   RefPtr<AudioBus> m_outputBus;
-  std::unique_ptr<AudioPullFIFO> m_fifo;
+
+  // To push the rendered result from WebAudio graph into the FIFO.
+  RefPtr<AudioBus> m_renderBus;
+
+  // Resolves the buffer size mismatch between the WebAudio engine and
+  // the callback function from the actual audio device.
+  std::unique_ptr<PushPullFIFO> m_fifo;
 
   size_t m_framesElapsed;
   AudioIOPosition m_outputPosition;
diff --git a/third_party/WebKit/Source/platform/audio/AudioFIFO.cpp b/third_party/WebKit/Source/platform/audio/AudioFIFO.cpp
deleted file mode 100644
index c35ce14..0000000
--- a/third_party/WebKit/Source/platform/audio/AudioFIFO.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "platform/audio/AudioFIFO.h"
-
-namespace blink {
-
-AudioFIFO::AudioFIFO(unsigned numberOfChannels, size_t fifoLength)
-    : m_fifoAudioBus(AudioBus::create(numberOfChannels, fifoLength)),
-      m_fifoLength(fifoLength),
-      m_framesInFifo(0),
-      m_readIndex(0),
-      m_writeIndex(0) {}
-
-void AudioFIFO::consume(AudioBus* destination, size_t framesToConsume) {
-  bool isGood = destination && (framesToConsume <= m_fifoLength) &&
-                (framesToConsume <= m_framesInFifo) &&
-                (destination->length() >= framesToConsume);
-  ASSERT(isGood);
-  if (!isGood)
-    return;
-
-  // Copy the requested number of samples to the destination.
-
-  size_t part1Length;
-  size_t part2Length;
-  findWrapLengths(m_readIndex, framesToConsume, part1Length, part2Length);
-
-  size_t numberOfChannels = m_fifoAudioBus->numberOfChannels();
-
-  for (size_t channelIndex = 0; channelIndex < numberOfChannels;
-       ++channelIndex) {
-    float* destinationData = destination->channel(channelIndex)->mutableData();
-    const float* sourceData = m_fifoAudioBus->channel(channelIndex)->data();
-
-    bool isCopyGood = ((m_readIndex < m_fifoLength) &&
-                       (m_readIndex + part1Length) <= m_fifoLength &&
-                       (part1Length <= destination->length()) &&
-                       (part1Length + part2Length) <= destination->length());
-    ASSERT(isCopyGood);
-    if (!isCopyGood)
-      return;
-
-    memcpy(destinationData, sourceData + m_readIndex,
-           part1Length * sizeof(*sourceData));
-    // Handle wrap around of the FIFO, if needed.
-    if (part2Length)
-      memcpy(destinationData + part1Length, sourceData,
-             part2Length * sizeof(*sourceData));
-  }
-  m_readIndex = updateIndex(m_readIndex, framesToConsume);
-  ASSERT(m_framesInFifo >= framesToConsume);
-  m_framesInFifo -= framesToConsume;
-}
-
-void AudioFIFO::push(const AudioBus* sourceBus) {
-  // Copy the sourceBus into the FIFO buffer.
-
-  bool isGood =
-      sourceBus && (m_framesInFifo + sourceBus->length() <= m_fifoLength);
-  if (!isGood)
-    return;
-
-  size_t sourceLength = sourceBus->length();
-  size_t part1Length;
-  size_t part2Length;
-  findWrapLengths(m_writeIndex, sourceLength, part1Length, part2Length);
-
-  size_t numberOfChannels = m_fifoAudioBus->numberOfChannels();
-
-  for (size_t channelIndex = 0; channelIndex < numberOfChannels;
-       ++channelIndex) {
-    float* destination = m_fifoAudioBus->channel(channelIndex)->mutableData();
-    const float* source = sourceBus->channel(channelIndex)->data();
-
-    bool isCopyGood = ((m_writeIndex < m_fifoLength) &&
-                       (m_writeIndex + part1Length) <= m_fifoLength &&
-                       part2Length < m_fifoLength &&
-                       part1Length + part2Length <= sourceLength);
-    ASSERT(isCopyGood);
-    if (!isCopyGood)
-      return;
-
-    memcpy(destination + m_writeIndex, source,
-           part1Length * sizeof(*destination));
-
-    // Handle wrap around of the FIFO, if needed.
-    if (part2Length)
-      memcpy(destination, source + part1Length,
-             part2Length * sizeof(*destination));
-  }
-
-  m_framesInFifo += sourceLength;
-  ASSERT(m_framesInFifo <= m_fifoLength);
-  m_writeIndex = updateIndex(m_writeIndex, sourceLength);
-}
-
-void AudioFIFO::findWrapLengths(size_t index,
-                                size_t size,
-                                size_t& part1Length,
-                                size_t& part2Length) {
-  SECURITY_DCHECK(index < m_fifoLength && size <= m_fifoLength);
-  if (index < m_fifoLength && size <= m_fifoLength) {
-    if (index + size > m_fifoLength) {
-      // Need to wrap. Figure out the length of each piece.
-      part1Length = m_fifoLength - index;
-      part2Length = size - part1Length;
-    } else {
-      // No wrap needed.
-      part1Length = size;
-      part2Length = 0;
-    }
-  } else {
-    // Invalid values for index or size. Set the part lengths to zero so nothing
-    // is copied.
-    part1Length = 0;
-    part2Length = 0;
-  }
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/audio/AudioFIFO.h b/third_party/WebKit/Source/platform/audio/AudioFIFO.h
deleted file mode 100644
index ef66f92..0000000
--- a/third_party/WebKit/Source/platform/audio/AudioFIFO.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef AudioFIFO_h
-#define AudioFIFO_h
-
-#include "platform/audio/AudioBus.h"
-#include "wtf/Allocator.h"
-
-namespace blink {
-
-class AudioFIFO {
-  USING_FAST_MALLOC(AudioFIFO);
-  WTF_MAKE_NONCOPYABLE(AudioFIFO);
-
- public:
-  // Create a FIFO large enough to hold |fifoLength| frames of data of
-  // |numberOfChannels| channels.
-  AudioFIFO(unsigned numberOfChannels, size_t fifoLength);
-
-  // Push the data from the bus into the FIFO.
-  void push(const AudioBus*);
-
-  // Consume |framesToConsume| frames of data from the FIFO and put them in
-  // |destination|. The corresponding frames are removed from the FIFO.
-  void consume(AudioBus* destination, size_t framesToConsume);
-
-  // Number of frames of data that are currently in the FIFO.
-  size_t framesInFifo() const { return m_framesInFifo; }
-
- private:
-  // Update the FIFO index by the step, with appropriate wrapping around the
-  // endpoint.
-  int updateIndex(int index, int step) { return (index + step) % m_fifoLength; }
-
-  void findWrapLengths(size_t index,
-                       size_t providerSize,
-                       size_t& part1Length,
-                       size_t& part2Length);
-
-  // The FIFO itself. In reality, the FIFO is a circular buffer.
-  RefPtr<AudioBus> m_fifoAudioBus;
-
-  // The total available space in the FIFO.
-  size_t m_fifoLength;
-
-  // The number of actual elements in the FIFO
-  size_t m_framesInFifo;
-
-  // Where to start reading from the FIFO.
-  size_t m_readIndex;
-
-  // Where to start writing to the FIFO.
-  size_t m_writeIndex;
-};
-
-}  // namespace blink
-
-#endif  // AudioFIFO.h
diff --git a/third_party/WebKit/Source/platform/audio/AudioPullFIFO.cpp b/third_party/WebKit/Source/platform/audio/AudioPullFIFO.cpp
deleted file mode 100644
index ca14cfa..0000000
--- a/third_party/WebKit/Source/platform/audio/AudioPullFIFO.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "platform/audio/AudioPullFIFO.h"
-
-namespace blink {
-
-AudioPullFIFO::AudioPullFIFO(AudioSourceProvider& audioProvider,
-                             unsigned numberOfChannels,
-                             size_t fifoLength,
-                             size_t providerSize)
-    : m_provider(audioProvider),
-      m_fifo(numberOfChannels, fifoLength),
-      m_providerSize(providerSize),
-      m_tempBus(AudioBus::create(numberOfChannels, providerSize)) {}
-
-void AudioPullFIFO::consume(AudioBus* destination, size_t framesToConsume) {
-  if (!destination)
-    return;
-
-  if (framesToConsume > m_fifo.framesInFifo()) {
-    // We don't have enough data in the FIFO to fulfill the request. Ask for
-    // more data.
-    fillBuffer(framesToConsume - m_fifo.framesInFifo());
-  }
-
-  m_fifo.consume(destination, framesToConsume);
-}
-
-void AudioPullFIFO::fillBuffer(size_t numberOfFrames) {
-  // Keep asking the provider to give us data until we have received at least
-  // |numberOfFrames| of data. Stuff the data into the FIFO.
-  size_t framesProvided = 0;
-
-  while (framesProvided < numberOfFrames) {
-    m_provider.provideInput(m_tempBus.get(), m_providerSize);
-
-    m_fifo.push(m_tempBus.get());
-
-    framesProvided += m_providerSize;
-  }
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/audio/AudioPullFIFO.h b/third_party/WebKit/Source/platform/audio/AudioPullFIFO.h
deleted file mode 100644
index 7f375b2e..0000000
--- a/third_party/WebKit/Source/platform/audio/AudioPullFIFO.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef AudioPullFIFO_h
-#define AudioPullFIFO_h
-
-#include "platform/audio/AudioBus.h"
-#include "platform/audio/AudioFIFO.h"
-#include "platform/audio/AudioSourceProvider.h"
-#include "wtf/Allocator.h"
-
-namespace blink {
-
-// A FIFO (First In First Out) buffer to handle mismatches in buffer sizes
-// between a provider and receiver. The receiver will "pull" data from this
-// FIFO. If data is already available in the FIFO, it is provided to the
-// receiver. If insufficient data is available to satisfy the request, the FIFO
-// will ask the provider for more data when necessary to fulfill a request.
-// Contrast this with a "push" FIFO, where the sender pushes data to the FIFO
-// which will itself push the data to the receiver when the FIFO is full.
-class PLATFORM_EXPORT AudioPullFIFO {
-  USING_FAST_MALLOC(AudioPullFIFO);
-  WTF_MAKE_NONCOPYABLE(AudioPullFIFO);
-
- public:
-  // Create a FIFO that gets data from |provider|. The FIFO will be large
-  // enough to hold |fifoLength| frames of data of |numberOfChannels| channels.
-  // The AudioSourceProvider will be asked to produce |providerSize| frames
-  // when the FIFO needs more data.
-  AudioPullFIFO(AudioSourceProvider& audioProvider,
-                unsigned numberOfChannels,
-                size_t fifoLength,
-                size_t providerSize);
-
-  // Read |framesToConsume| frames from the FIFO into the destination. If the
-  // FIFO does not have enough data, we ask the |provider| to get more data to
-  // fulfill the request.
-  void consume(AudioBus* destination, size_t framesToConsume);
-
- private:
-  // Fill the FIFO buffer with at least |numberOfFrames| more data.
-  void fillBuffer(size_t numberOfFrames);
-
-  // The provider of the data in our FIFO.
-  AudioSourceProvider& m_provider;
-
-  // The actual FIFO
-  AudioFIFO m_fifo;
-
-  // Number of frames of data that the provider will produce per call.
-  unsigned m_providerSize;
-
-  // Temporary workspace to hold the data from the provider.
-  RefPtr<AudioBus> m_tempBus;
-};
-
-}  // namespace blink
-
-#endif  // AudioPullFIFO.h
diff --git a/third_party/WebKit/Source/platform/audio/PushPullFIFO.cpp b/third_party/WebKit/Source/platform/audio/PushPullFIFO.cpp
new file mode 100644
index 0000000..f464e9d
--- /dev/null
+++ b/third_party/WebKit/Source/platform/audio/PushPullFIFO.cpp
@@ -0,0 +1,145 @@
+// 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 "platform/audio/PushPullFIFO.h"
+
+#include <memory>
+#include "platform/audio/AudioUtilities.h"
+#include "wtf/PtrUtil.h"
+
+namespace blink {
+
+namespace {
+
+// Suppress the warning log if over/underflow happens more than 100 times.
+const unsigned kMaxMessagesToLog = 100;
+}
+
+const size_t PushPullFIFO::kMaxFIFOLength = 65536;
+
+PushPullFIFO::PushPullFIFO(unsigned numberOfChannels, size_t fifoLength)
+    : m_fifoLength(fifoLength),
+      m_framesAvailable(0),
+      m_indexRead(0),
+      m_indexWrite(0),
+      m_overflowCount(0),
+      m_underflowCount(0) {
+  CHECK_LE(m_fifoLength, kMaxFIFOLength);
+  m_fifoBus = AudioBus::create(numberOfChannels, m_fifoLength);
+}
+
+PushPullFIFO::~PushPullFIFO() {}
+
+// Push the data from |inputBus| to FIFO. The size of push is determined by
+// the length of |inputBus|.
+void PushPullFIFO::push(const AudioBus* inputBus) {
+  CHECK(inputBus);
+  CHECK_EQ(inputBus->length(), AudioUtilities::kRenderQuantumFrames);
+  SECURITY_CHECK(inputBus->length() <= m_fifoLength);
+  SECURITY_CHECK(m_indexWrite < m_fifoLength);
+
+  const size_t inputBusLength = inputBus->length();
+  const size_t remainder = m_fifoLength - m_indexWrite;
+
+  for (unsigned i = 0; i < m_fifoBus->numberOfChannels(); ++i) {
+    float* fifoBusChannel = m_fifoBus->channel(i)->mutableData();
+    const float* inputBusChannel = inputBus->channel(i)->data();
+    if (remainder >= inputBusLength) {
+      // The remainder is big enough for the input data.
+      memcpy(fifoBusChannel + m_indexWrite, inputBusChannel,
+             inputBusLength * sizeof(*fifoBusChannel));
+    } else {
+      // The input data overflows the remainder size. Wrap around the index.
+      memcpy(fifoBusChannel + m_indexWrite, inputBusChannel,
+             remainder * sizeof(*fifoBusChannel));
+      memcpy(fifoBusChannel, inputBusChannel + remainder,
+             (inputBusLength - remainder) * sizeof(*fifoBusChannel));
+    }
+  }
+
+  // Update the write index; wrap it around if necessary.
+  m_indexWrite = (m_indexWrite + inputBusLength) % m_fifoLength;
+
+  // In case of overflow, move the |indexRead| to the updated |indexWrite| to
+  // avoid reading overwritten frames by the next pull.
+  if (inputBusLength > m_fifoLength - m_framesAvailable) {
+    m_indexRead = m_indexWrite;
+    if (++m_overflowCount < kMaxMessagesToLog) {
+      LOG(WARNING) << "PushPullFIFO: overflow while pushing ("
+                   << "overflowCount=" << m_overflowCount
+                   << ", availableFrames=" << m_framesAvailable
+                   << ", inputFrames=" << inputBusLength
+                   << ", fifoLength=" << m_fifoLength << ")";
+    }
+  }
+
+  // Update the number of frames available in FIFO.
+  m_framesAvailable =
+      std::min(m_framesAvailable + inputBusLength, m_fifoLength);
+  DCHECK_EQ((m_indexRead + m_framesAvailable) % m_fifoLength, m_indexWrite);
+}
+
+// Pull the data out of FIFO to |outputBus|. If remaining frame in the FIFO
+// is less than the frames to pull, provides remaining frame plus the silence.
+void PushPullFIFO::pull(AudioBus* outputBus, size_t framesRequested) {
+  CHECK(outputBus);
+  SECURITY_CHECK(framesRequested <= outputBus->length());
+  SECURITY_CHECK(framesRequested <= m_fifoLength);
+  SECURITY_CHECK(m_indexRead < m_fifoLength);
+
+  const size_t remainder = m_fifoLength - m_indexRead;
+  const size_t framesToFill = std::min(m_framesAvailable, framesRequested);
+
+  for (unsigned i = 0; i < m_fifoBus->numberOfChannels(); ++i) {
+    const float* fifoBusChannel = m_fifoBus->channel(i)->data();
+    float* outputBusChannel = outputBus->channel(i)->mutableData();
+
+    // Fill up the output bus with the available frames first.
+    if (remainder >= framesToFill) {
+      // The remainder is big enough for the frames to pull.
+      memcpy(outputBusChannel, fifoBusChannel + m_indexRead,
+             framesToFill * sizeof(*fifoBusChannel));
+    } else {
+      // The frames to pull is bigger than the remainder size.
+      // Wrap around the index.
+      memcpy(outputBusChannel, fifoBusChannel + m_indexRead,
+             remainder * sizeof(*fifoBusChannel));
+      memcpy(outputBusChannel + remainder, fifoBusChannel,
+             (framesToFill - remainder) * sizeof(*fifoBusChannel));
+    }
+
+    // The frames available was not enough to fulfill the requested frames. Fill
+    // the rest of the channel with silence.
+    if (framesRequested > framesToFill) {
+      memset(outputBusChannel + framesToFill, 0,
+             (framesRequested - framesToFill) * sizeof(*outputBusChannel));
+    }
+  }
+
+  // Update the read index; wrap it around if necessary.
+  m_indexRead = (m_indexRead + framesToFill) % m_fifoLength;
+
+  // In case of underflow, move the |indexWrite| to the updated |indexRead|.
+  if (framesRequested > framesToFill) {
+    m_indexWrite = m_indexRead;
+    if (m_underflowCount++ < kMaxMessagesToLog) {
+      LOG(WARNING) << "PushPullFIFO: underflow while pulling ("
+                   << "underflowCount=" << m_underflowCount
+                   << ", availableFrames=" << m_framesAvailable
+                   << ", requestedFrames=" << framesRequested
+                   << ", fifoLength=" << m_fifoLength << ")";
+    }
+  }
+
+  // Update the number of frames in FIFO.
+  m_framesAvailable -= framesToFill;
+  DCHECK_EQ((m_indexRead + m_framesAvailable) % m_fifoLength, m_indexWrite);
+}
+
+const PushPullFIFOStateForTest PushPullFIFO::getStateForTest() const {
+  return {length(),     numberOfChannels(), framesAvailable(), m_indexRead,
+          m_indexWrite, m_overflowCount,    m_underflowCount};
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/audio/PushPullFIFO.h b/third_party/WebKit/Source/platform/audio/PushPullFIFO.h
new file mode 100644
index 0000000..2341372
--- /dev/null
+++ b/third_party/WebKit/Source/platform/audio/PushPullFIFO.h
@@ -0,0 +1,85 @@
+// 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 PushPullFIFO_h
+#define PushPullFIFO_h
+
+#include "platform/audio/AudioBus.h"
+#include "public/platform/WebCommon.h"
+#include "wtf/Allocator.h"
+
+namespace blink {
+
+// A configuration data container for PushPullFIFO unit test.
+struct PushPullFIFOStateForTest {
+  const size_t fifoLength;
+  const unsigned numberOfChannels;
+  const size_t framesAvailable;
+  const size_t indexRead;
+  const size_t indexWrite;
+  const unsigned overflowCount;
+  const unsigned underflowCount;
+};
+
+// PushPullFIFO class is an intermediate audio sample storage between
+// Blink-WebAudio and the renderer. The renderer's hardware callback buffer size
+// varies on the platform, but the WebAudio always renders 128 frames (render
+// quantum, RQ) thus FIFO is needed to handle the general case.
+class BLINK_PLATFORM_EXPORT PushPullFIFO {
+  USING_FAST_MALLOC(PushPullFIFO);
+  WTF_MAKE_NONCOPYABLE(PushPullFIFO);
+
+ public:
+  // Maximum FIFO length. (512 render quanta)
+  static const size_t kMaxFIFOLength;
+
+  // |fifoLength| cannot exceed |kMaxFIFOLength|. Otherwise it crashes.
+  explicit PushPullFIFO(unsigned numberOfChannels, size_t fifoLength);
+  ~PushPullFIFO();
+
+  // Pushes the rendered frames by WebAudio engine.
+  //  - The |inputBus| length is 128 frames (1 render quantum), fixed.
+  //  - In case of overflow (FIFO full while push), the existing frames in FIFO
+  //    will be overwritten and |indexRead| will be forcibly moved to
+  //    |indexWrite| to avoid reading overwritten frames.
+  void push(const AudioBus* inputBus);
+
+  // Pulling |framesRequested| by the audio device thread.
+  //  - If |framesRequested| is bigger than the length of |outputBus|, it
+  //    violates SECURITY_CHECK().
+  //  - If |framesRequested| is bigger than FIFO length, it violates
+  //    SECURITY_CHECK().
+  //  - In case of underflow (FIFO empty while pull), the remaining space in the
+  //    requested output bus will be filled with silence. Thus it will fulfill
+  //    the request from the consumer without causing error, but with a glitch.
+  void pull(AudioBus* outputBus, size_t framesRequested);
+
+  size_t framesAvailable() const { return m_framesAvailable; }
+  size_t length() const { return m_fifoLength; }
+  unsigned numberOfChannels() const { return m_fifoBus->numberOfChannels(); }
+  AudioBus* bus() const { return m_fifoBus.get(); }
+
+  // For unit test. Get the current configuration that consists of FIFO length,
+  // number of channels, read/write index position and under/overflow count.
+  const PushPullFIFOStateForTest getStateForTest() const;
+
+ private:
+  // The size of the FIFO.
+  const size_t m_fifoLength = 0;
+
+  RefPtr<AudioBus> m_fifoBus;
+
+  // The number of frames in the FIFO actually available for pulling.
+  size_t m_framesAvailable;
+
+  size_t m_indexRead;
+  size_t m_indexWrite;
+
+  unsigned m_overflowCount;
+  unsigned m_underflowCount;
+};
+
+}  // namespace blink
+
+#endif  // PushPullFIFO_h
diff --git a/third_party/WebKit/Source/platform/audio/PushPullFIFOTest.cpp b/third_party/WebKit/Source/platform/audio/PushPullFIFOTest.cpp
new file mode 100644
index 0000000..cd442b9b
--- /dev/null
+++ b/third_party/WebKit/Source/platform/audio/PushPullFIFOTest.cpp
@@ -0,0 +1,363 @@
+// 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 "platform/audio/PushPullFIFO.h"
+
+#include <memory>
+#include <vector>
+#include "platform/audio/AudioUtilities.h"
+#include "platform/testing/TestingPlatformSupport.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "wtf/PtrUtil.h"
+
+namespace blink {
+
+namespace {
+
+// Check the basic contract of FIFO.
+TEST(PushPullFIFOBasicTest, BasicTests) {
+  // This suppresses the multi-thread warning for GTest. Potently it increases
+  // the test execution time, but this specific test is very short and simple.
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+
+  // FIFO length exceeding the maximum length allowed will cause crash.
+  // i.e.) m_fifoLength <= kMaxFIFOLength
+  EXPECT_DEATH(new PushPullFIFO(2, PushPullFIFO::kMaxFIFOLength + 1), "");
+
+  std::unique_ptr<PushPullFIFO> testFifo =
+      WTF::wrapUnique(new PushPullFIFO(2, 1024));
+
+  // The input bus length must be |AudioUtilities::kRenderQuantumFrames|.
+  // i.e.) inputBus->length() == kRenderQuantumFrames
+  RefPtr<AudioBus> inputBusOf129Frames =
+      AudioBus::create(2, AudioUtilities::kRenderQuantumFrames + 1);
+  EXPECT_DEATH(testFifo->push(inputBusOf129Frames.get()), "");
+  RefPtr<AudioBus> inputBusOf127Frames =
+      AudioBus::create(2, AudioUtilities::kRenderQuantumFrames - 1);
+  EXPECT_DEATH(testFifo->push(inputBusOf127Frames.get()), "");
+
+  // Pull request frames cannot exceed the length of output bus.
+  // i.e.) framesRequested <= outputBus->length()
+  RefPtr<AudioBus> outputBusOf512Frames = AudioBus::create(2, 512);
+  EXPECT_DEATH(testFifo->pull(outputBusOf512Frames.get(), 513), "");
+
+  // Pull request frames cannot exceed the length of FIFO.
+  // i.e.) framesRequested <= m_fifoLength
+  RefPtr<AudioBus> outputBusOf1025Frames = AudioBus::create(2, 1025);
+  EXPECT_DEATH(testFifo->pull(outputBusOf1025Frames.get(), 1025), "");
+}
+
+// Fills each AudioChannel in an AudioBus with a series of linearly increasing
+// values starting from |startingValue| and incrementing by 1. Then return value
+// will be |startingValue| + |bus_length|.
+size_t fillBusWithLinearRamp(AudioBus* targetBus, size_t startingValue) {
+  for (unsigned c = 0; c < targetBus->numberOfChannels(); ++c) {
+    float* busChannel = targetBus->channel(c)->mutableData();
+    for (size_t i = 0; i < targetBus->channel(c)->length(); ++i) {
+      busChannel[i] = static_cast<float>(startingValue + i);
+    }
+  }
+  return startingValue + targetBus->length();
+}
+
+// Inspect the content of AudioBus with a given set of index and value across
+// channels.
+bool verifyBusValueAtIndex(AudioBus* targetBus,
+                           int index,
+                           float expectedValue) {
+  for (unsigned c = 0; c < targetBus->numberOfChannels(); ++c) {
+    float* busChannel = targetBus->channel(c)->mutableData();
+    if (busChannel[index] != expectedValue) {
+      LOG(ERROR) << ">> [FAIL] expected " << expectedValue << " at index "
+                 << index << " but got " << busChannel[index] << ".";
+      return false;
+    }
+  }
+  return true;
+}
+
+struct FIFOAction {
+  // The type of action; "PUSH" or "PULL".
+  const char* action;
+  // Number of frames for the operation.
+  const size_t numberOfFrames;
+};
+
+struct AudioBusSample {
+  // The frame index of a sample in the bus.
+  const size_t index;
+  // The value at the |index| above.
+  const float value;
+};
+
+struct FIFOTestSetup {
+  // Length of FIFO to be created for test case.
+  const size_t fifoLength;
+  // Channel count of FIFO to be created for test case.
+  const unsigned numberOfChannels;
+  // A list of |FIFOAction| entries to be performed in test case.
+  const std::vector<FIFOAction> fifoActions;
+};
+
+struct FIFOTestExpectedState {
+  // Expected read index in FIFO.
+  const size_t indexRead;
+  // Expected write index in FIFO.
+  const size_t indexWrite;
+  // Expected overflow count in FIFO.
+  const unsigned overflowCount;
+  // Expected underflow count in FIFO.
+  const unsigned underflowCount;
+  // A list of expected |AudioBusSample| entries for the FIFO bus.
+  const std::vector<AudioBusSample> fifoSamples;
+  // A list of expected |AudioBusSample| entries for the output bus.
+  const std::vector<AudioBusSample> outputSamples;
+};
+
+// The data structure for the parameterized test cases.
+struct FIFOTestParam {
+  FIFOTestSetup setup;
+  FIFOTestExpectedState expectedState;
+};
+
+std::ostream& operator<<(std::ostream& out, const FIFOTestParam& param) {
+  out << "fifoLength=" << param.setup.fifoLength
+      << " numberOfChannels=" << param.setup.numberOfChannels;
+  return out;
+}
+
+class PushPullFIFOFeatureTest : public ::testing::TestWithParam<FIFOTestParam> {
+};
+
+TEST_P(PushPullFIFOFeatureTest, FeatureTests) {
+  const FIFOTestSetup setup = GetParam().setup;
+  const FIFOTestExpectedState expectedState = GetParam().expectedState;
+
+  // Create a FIFO with a specified configuration.
+  std::unique_ptr<PushPullFIFO> fifo = WTF::wrapUnique(
+      new PushPullFIFO(setup.numberOfChannels, setup.fifoLength));
+
+  RefPtr<AudioBus> outputBus;
+
+  // Iterate all the scheduled push/pull actions.
+  size_t frameCounter = 0;
+  for (const auto& action : setup.fifoActions) {
+    if (strcmp(action.action, "PUSH") == 0) {
+      RefPtr<AudioBus> inputBus =
+          AudioBus::create(setup.numberOfChannels, action.numberOfFrames);
+      frameCounter = fillBusWithLinearRamp(inputBus.get(), frameCounter);
+      fifo->push(inputBus.get());
+      LOG(INFO) << "PUSH " << action.numberOfFrames
+                << " frames (frameCounter=" << frameCounter << ")";
+    } else {
+      outputBus =
+          AudioBus::create(setup.numberOfChannels, action.numberOfFrames);
+      fifo->pull(outputBus.get(), action.numberOfFrames);
+      LOG(INFO) << "PULL " << action.numberOfFrames << " frames";
+    }
+  }
+
+  // Get FIFO config data.
+  const PushPullFIFOStateForTest actualState = fifo->getStateForTest();
+
+  // Verify the read/write indexes.
+  EXPECT_EQ(expectedState.indexRead, actualState.indexRead);
+  EXPECT_EQ(expectedState.indexWrite, actualState.indexWrite);
+  EXPECT_EQ(expectedState.overflowCount, actualState.overflowCount);
+  EXPECT_EQ(expectedState.underflowCount, actualState.underflowCount);
+
+  // Verify in-FIFO samples.
+  for (const auto& sample : expectedState.fifoSamples) {
+    EXPECT_TRUE(verifyBusValueAtIndex(fifo->bus(), sample.index, sample.value));
+  }
+
+  // Verify samples from the most recent output bus.
+  for (const auto& sample : expectedState.outputSamples) {
+    EXPECT_TRUE(
+        verifyBusValueAtIndex(outputBus.get(), sample.index, sample.value));
+  }
+}
+
+FIFOTestParam featureTestParams[] = {
+    // Test cases 0 ~ 3: Regular operation on various channel configuration.
+    //  - Mono, Stereo, Quad, 5.1.
+    //  - FIFO length and pull size are RQ-aligned.
+    {{512, 1, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}},
+     {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}},
+
+    {{512, 2, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}},
+     {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}},
+
+    {{512, 4, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}},
+     {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}},
+
+    {{512, 6, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}},
+     {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}},
+
+    // Test case 4: Pull size less than or equal to 128.
+    {{128, 2, {{"PUSH", 128}, {"PULL", 128}, {"PUSH", 128}, {"PULL", 64}}},
+     {64, 0, 0, 0, {{64, 192}, {0, 128}}, {{0, 128}, {63, 191}}}},
+
+    // Test case 5: Unusual FIFO and Pull length.
+    //  - FIFO and pull length that are not aligned to render quantum.
+    //  - Check if the indexes are wrapping around correctly.
+    //  - Check if the output bus starts and ends with correct values.
+    {{997,
+      1,
+      {
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 449},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 449},
+      }},
+     // - expectedIndexRead = 898, expectedIndexWrite = 27
+     // - overflowCount = 0, underflowCount = 0
+     // - FIFO samples (index, expectedValue) = (898, 898), (27, 27)
+     // - Output bus samples (index, expectedValue) = (0, 499), (448, 897)
+     {898, 27, 0, 0, {{898, 898}, {27, 27}}, {{0, 449}, {448, 897}}}},
+
+    // Test case 6: Overflow
+    //  - Check overflow counter.
+    //  - After the overflow occurs, the read index must be moved to the write
+    //    index. Thus pulled frames must not contain overwritten data.
+    {{512,
+      3,
+      {
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 256},
+      }},
+     // - expectedIndexRead = 384, expectedIndexWrite = 128
+     // - overflowCount = 1, underflowCount = 0
+     // - FIFO samples (index, expectedValue) = (384, 384), (128, 128)
+     // - Output bus samples (index, expectedValue) = (0, 128), (255, 383)
+     {384, 128, 1, 0, {{384, 384}, {128, 128}}, {{0, 128}, {255, 383}}}},
+
+    // Test case 7: Overflow in unusual FIFO and pull length.
+    //  - Check overflow counter.
+    //  - After the overflow occurs, the read index must be moved to the write
+    //    index. Thus pulled frames must not contain overwritten data.
+    {{577,
+      5,
+      {
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 227},
+      }},
+     // - expectedIndexRead = 290, expectedIndexWrite = 63
+     // - overflowCount = 1, underflowCount = 0
+     // - FIFO samples (index, expectedValue) = (63, 63), (290, 290)
+     // - Output bus samples (index, expectedValue) = (0, 63), (226, 289)
+     {290, 63, 1, 0, {{63, 63}, {290, 290}}, {{0, 63}, {226, 289}}}},
+
+    // Test case 8: Underflow
+    //  - Check underflow counter.
+    //  - After the underflow occurs, the write index must be moved to the read
+    //    index. Frames pulled after FIFO underflows must be zeroed.
+    {{512,
+      7,
+      {
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 384},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 384},
+      }},
+     // - expectedIndexRead = 128, expectedIndexWrite = 128
+     // - overflowCount = 0, underflowCount = 1
+     // - FIFO samples (index, expectedValue) = (128, 128)
+     // - Output bus samples (index, expectedValue) = (0, 384), (255, 639)
+     //                                               (256, 0), (383, 0)
+     {128,
+      128,
+      0,
+      1,
+      {{128, 128}},
+      {{0, 384}, {255, 639}, {256, 0}, {383, 0}}}},
+
+    // Test case 9: Underflow in unusual FIFO and pull length.
+    //  - Check underflow counter.
+    //  - After the underflow occurs, the write index must be moved to the read
+    //    index. Frames pulled after FIFO underflows must be zeroed.
+    {{523,
+      11,
+      {
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 383},
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 383},
+      }},
+     // - expectedIndexRead = 117, expectedIndexWrite = 117
+     // - overflowCount = 0, underflowCount = 1
+     // - FIFO samples (index, expectedValue) = (117, 117)
+     // - Output bus samples (index, expectedValue) = (0, 383), (256, 639)
+     //                                               (257, 0), (382, 0)
+     {117,
+      117,
+      0,
+      1,
+      {{117, 117}},
+      {{0, 383}, {256, 639}, {257, 0}, {382, 0}}}},
+
+    // Test case 10: Multiple pull from an empty FIFO.
+    //  - Check underflow counter.
+    //  - After the underflow occurs, the write index must be moved to the read
+    //    index. Frames pulled after FIFO underflows must be zeroed.
+    {{1024,
+      11,
+      {
+          {"PUSH", 128},
+          {"PUSH", 128},
+          {"PULL", 440},
+          {"PULL", 440},
+          {"PULL", 440},
+          {"PULL", 440},
+          {"PULL", 440},
+      }},
+     // - expectedIndexRead = 117, expectedIndexWrite = 117
+     // - overflowCount = 0, underflowCount = 1
+     // - FIFO samples (index, expectedValue) = (117, 117)
+     // - Output bus samples (index, expectedValue) = (0, 383), (256, 639)
+     //                                               (257, 0), (382, 0)
+     {256, 256, 0, 5, {{256, 0}}, {{0, 0}, {439, 0}}}},
+
+    // Test case 11: Multiple pull from an empty FIFO. (zero push)
+    {{1024,
+      11,
+      {
+          {"PULL", 144},
+          {"PULL", 144},
+          {"PULL", 144},
+          {"PULL", 144},
+      }},
+     // - expectedIndexRead = 0, expectedIndexWrite = 0
+     // - overflowCount = 0, underflowCount = 4
+     // - FIFO samples (index, expectedValue) = (0, 0), (1023, 0)
+     // - Output bus samples (index, expectedValue) = (0, 0), (143, 0)
+     {0, 0, 0, 4, {{0, 0}, {1023, 0}}, {{0, 0}, {143, 0}}}}};
+
+INSTANTIATE_TEST_CASE_P(PushPullFIFOFeatureTest,
+                        PushPullFIFOFeatureTest,
+                        ::testing::ValuesIn(featureTestParams));
+
+}  // namespace
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/loader/fetch/Resource.cpp b/third_party/WebKit/Source/platform/loader/fetch/Resource.cpp
index 201eea4..d6060abd 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/Resource.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/Resource.cpp
@@ -842,9 +842,7 @@
   destroyDecodedDataIfPossible();
 }
 
-void Resource::onMemoryStateChange(MemoryState state) {
-  if (state != MemoryState::SUSPENDED)
-    return;
+void Resource::onPurgeMemory() {
   prune();
   if (!m_cacheHandler)
     return;
@@ -983,8 +981,24 @@
          resourceRequest().cacheControlContainsNoStore();
 }
 
-bool Resource::hasVaryHeader() const {
-  return !response().httpHeaderField(HTTPNames::Vary).isNull();
+bool Resource::mustReloadDueToVaryHeader(
+    const ResourceRequest& newRequest) const {
+  const AtomicString& vary = response().httpHeaderField(HTTPNames::Vary);
+  if (vary.isNull())
+    return false;
+  if (vary == "*")
+    return true;
+
+  CommaDelimitedHeaderSet varyHeaders;
+  parseCommaDelimitedHeader(vary, varyHeaders);
+  for (const String& header : varyHeaders) {
+    AtomicString atomicHeader(header);
+    if (resourceRequest().httpHeaderField(atomicHeader) !=
+        newRequest.httpHeaderField(atomicHeader)) {
+      return true;
+    }
+  }
+  return false;
 }
 
 bool Resource::mustRevalidateDueToCacheHeaders() const {
diff --git a/third_party/WebKit/Source/platform/loader/fetch/Resource.h b/third_party/WebKit/Source/platform/loader/fetch/Resource.h
index ac68d27..c17ba26 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/Resource.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/Resource.h
@@ -264,7 +264,7 @@
   bool canUseCacheValidator() const;
   bool isCacheValidator() const { return m_isRevalidating; }
   bool hasCacheControlNoStoreHeader() const;
-  bool hasVaryHeader() const;
+  bool mustReloadDueToVaryHeader(const ResourceRequest& newRequest) const;
 
   bool isEligibleForIntegrityCheck(SecurityOrigin*) const;
 
@@ -425,7 +425,7 @@
   String reasonNotDeletable() const;
 
   // MemoryCoordinatorClient overrides:
-  void onMemoryStateChange(MemoryState) override;
+  void onPurgeMemory() override;
 
   Member<CachedMetadataHandlerImpl> m_cacheHandler;
   RefPtr<SecurityOrigin> m_fetcherSecurityOrigin;
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
index 5f21df7..9dc5030f 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
@@ -970,8 +970,7 @@
       existingResource == cachedResource(request.url()))
     return Use;
 
-  // Defer to the browser process cache for Vary header handling.
-  if (existingResource->hasVaryHeader())
+  if (existingResource->mustReloadDueToVaryHeader(request))
     return Reload;
 
   // If any of the redirects in the chain to loading the resource were not
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp
index 3cd79b5..6be9d2a9 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp
@@ -154,7 +154,7 @@
   response.setHTTPHeaderField(HTTPNames::Vary, "*");
   resource->responseReceived(response, nullptr);
   resource->finish();
-  ASSERT_TRUE(resource->hasVaryHeader());
+  ASSERT_TRUE(resource->mustReloadDueToVaryHeader(url));
 
   ResourceFetcher* fetcher = ResourceFetcher::create(context());
   ResourceRequest resourceRequest(url);
@@ -220,7 +220,7 @@
   response.setHTTPHeaderField(HTTPNames::Vary, "*");
   resource->responseReceived(response, nullptr);
   resource->finish();
-  ASSERT_TRUE(resource->hasVaryHeader());
+  ASSERT_TRUE(resource->mustReloadDueToVaryHeader(url));
 
   ResourceRequest resourceRequest(url);
   resourceRequest.setRequestContext(WebURLRequest::RequestContextInternal);
@@ -245,7 +245,7 @@
   Resource* resource = MockResource::fetch(fetchRequestOriginal, fetcher);
   ASSERT_TRUE(resource);
   Platform::current()->getURLLoaderMockFactory()->serveAsynchronousRequests();
-  ASSERT_TRUE(resource->hasVaryHeader());
+  ASSERT_TRUE(resource->mustReloadDueToVaryHeader(url));
 
   FetchRequest fetchRequest = FetchRequest(url, FetchInitiatorInfo());
   Resource* newResource = MockResource::fetch(fetchRequest, fetcher);
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp
index a421b17..a887e42 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp
@@ -90,4 +90,61 @@
   resource->responseReceived(revalidatingResponse, nullptr);
 }
 
+TEST(ResourceTest, Vary) {
+  ScopedTestingPlatformSupport<MockPlatform> mock;
+  KURL url(ParsedURLString, "http://127.0.0.1:8000/foo.html");
+  ResourceResponse response;
+  response.setURL(url);
+  response.setHTTPStatusCode(200);
+
+  Resource* resource = RawResource::create(url, Resource::Raw);
+  resource->responseReceived(response, nullptr);
+  resource->finish();
+
+  ResourceRequest newRequest(url);
+  EXPECT_FALSE(resource->mustReloadDueToVaryHeader(newRequest));
+
+  response.setHTTPHeaderField(HTTPNames::Vary, "*");
+  resource->setResponse(response);
+  EXPECT_TRUE(resource->mustReloadDueToVaryHeader(newRequest));
+
+  // Irrelevant header
+  response.setHTTPHeaderField(HTTPNames::Vary, "definitelynotarealheader");
+  resource->setResponse(response);
+  EXPECT_FALSE(resource->mustReloadDueToVaryHeader(newRequest));
+
+  // Header present on new but not old
+  newRequest.setHTTPHeaderField(HTTPNames::User_Agent, "something");
+  response.setHTTPHeaderField(HTTPNames::Vary, HTTPNames::User_Agent);
+  resource->setResponse(response);
+  EXPECT_TRUE(resource->mustReloadDueToVaryHeader(newRequest));
+  newRequest.clearHTTPHeaderField(HTTPNames::User_Agent);
+
+  ResourceRequest oldRequest(url);
+  oldRequest.setHTTPHeaderField(HTTPNames::User_Agent, "something");
+  oldRequest.setHTTPHeaderField(HTTPNames::Referer, "http://foo.com");
+  resource = RawResource::create(oldRequest, Resource::Raw);
+  resource->responseReceived(response, nullptr);
+  resource->finish();
+
+  // Header present on old but not new
+  newRequest.clearHTTPHeaderField(HTTPNames::User_Agent);
+  response.setHTTPHeaderField(HTTPNames::Vary, HTTPNames::User_Agent);
+  resource->setResponse(response);
+  EXPECT_TRUE(resource->mustReloadDueToVaryHeader(newRequest));
+
+  // Header present on both
+  newRequest.setHTTPHeaderField(HTTPNames::User_Agent, "something");
+  EXPECT_FALSE(resource->mustReloadDueToVaryHeader(newRequest));
+
+  // One matching, one mismatching
+  response.setHTTPHeaderField(HTTPNames::Vary, "User-Agent, Referer");
+  resource->setResponse(response);
+  EXPECT_TRUE(resource->mustReloadDueToVaryHeader(newRequest));
+
+  // Two matching
+  newRequest.setHTTPHeaderField(HTTPNames::Referer, "http://foo.com");
+  EXPECT_FALSE(resource->mustReloadDueToVaryHeader(newRequest));
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/web/WebIDBKey.cpp b/third_party/WebKit/Source/web/WebIDBKey.cpp
index 187ee5d..ebc288b5 100644
--- a/third_party/WebKit/Source/web/WebIDBKey.cpp
+++ b/third_party/WebKit/Source/web/WebIDBKey.cpp
@@ -139,7 +139,7 @@
       case IDBKey::InvalidType:
         keys[i] = WebIDBKey::createInvalid();
         break;
-      case IDBKey::MinType:
+      case IDBKey::TypeEnumMax:
         NOTREACHED();
         break;
     }
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff.py
index 5600033..2b04891 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff.py
@@ -11,6 +11,7 @@
 although it outputs a larger and more complex HTML table than we need.
 """
 
+import cgi
 import difflib
 
 _TEMPLATE = """<html>
@@ -53,12 +54,12 @@
     if tag == 'replace':
         return _format_delete(a_chunk) + _format_insert(b_chunk)
     assert tag == 'equal'
-    return a_chunk
+    return cgi.escape(a_chunk)
 
 
 def _format_insert(chunk):
-    return '<span class="add">%s</span>' % chunk
+    return '<span class="add">%s</span>' % cgi.escape(chunk)
 
 
 def _format_delete(chunk):
-    return '<span class="del">%s</span>' % chunk
+    return '<span class="del">%s</span>' % cgi.escape(chunk)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff_unittest.py
index 47bbf351..7779775 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/html_diff_unittest.py
@@ -29,16 +29,25 @@
         self.assertEqual(
             html_diff_body(['one line\n'], ['one line\n']),
             'one line\n')
+        self.assertEqual(
+            html_diff_body(['<script>\n'], ['<script>\n']),
+            '&lt;script&gt;\n')
 
     def test_html_diff_delete(self):
         self.assertEqual(
             html_diff_body(['one line\n'], []),
             '<span class="del">one line\n</span>')
+        self.assertEqual(
+            html_diff_body(['</pre>\n'], []),
+            '<span class="del">&lt;/pre&gt;\n</span>')
 
     def test_html_diff_insert(self):
         self.assertEqual(
             html_diff_body([], ['one line\n']),
             '<span class="add">one line\n</span>')
+        self.assertEqual(
+            html_diff_body([], ['<!--\n']),
+            '<span class="add">&lt;!--\n</span>')
 
     def test_html_diff_ending_newline(self):
         self.assertEqual(
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
index 251335f7..3b504fe 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
@@ -77,12 +77,15 @@
         if options.target == 'wpt' and not options.ignore_exportable_commits:
             commits = self.exportable_but_not_exported_commits(temp_repo_path)
             if commits:
-                _log.error('There were exportable but not-yet-exported commits:')
+                # If there are exportable commits, then there's no more work
+                # to do for now. This isn't really an error case; we expect
+                # to hit this case some of the time.
+                _log.info('There were exportable but not-yet-exported commits:')
                 for commit in commits:
-                    _log.error('  https://chromium.googlesource.com/chromium/src/+/%s', commit.sha)
-                _log.error('Aborting import to prevent clobbering these commits.')
+                    _log.info('  https://chromium.googlesource.com/chromium/src/+/%s', commit.sha)
+                _log.info('Aborting import to prevent clobbering these commits.')
                 self.clean_up_temp_repo(temp_repo_path)
-                return 1
+                return 0
 
         import_commit = self.update(dest_dir_name, temp_repo_path, options.revision)
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
index 506d77b3..f984fc6 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
@@ -22,13 +22,13 @@
             MockChromiumCommit(sha='deadbeef', position=123)]
         importer.checkout_is_okay = lambda _: True
         return_code = importer.main(['wpt'])
-        self.assertEqual(return_code, 1)
+        self.assertEqual(return_code, 0)
         self.assertLog([
             'INFO: Cloning repo: https://chromium.googlesource.com/external/w3c/web-platform-tests.git\n',
             'INFO: Local path: /mock-checkout/third_party/WebKit/wpt\n',
-            'ERROR: There were exportable but not-yet-exported commits:\n',
-            'ERROR:   https://chromium.googlesource.com/chromium/src/+/deadbeef\n',
-            'ERROR: Aborting import to prevent clobbering these commits.\n',
+            'INFO: There were exportable but not-yet-exported commits:\n',
+            'INFO:   https://chromium.googlesource.com/chromium/src/+/deadbeef\n',
+            'INFO: Aborting import to prevent clobbering these commits.\n',
             'INFO: Deleting temp repo directory /mock-checkout/third_party/WebKit/wpt.\n',
         ])
 
diff --git a/third_party/WebKit/Tools/Scripts/wpt-export b/third_party/WebKit/Tools/Scripts/wpt-export
index f9b3f2b..c107e70 100755
--- a/third_party/WebKit/Tools/Scripts/wpt-export
+++ b/third_party/WebKit/Tools/Scripts/wpt-export
@@ -46,7 +46,7 @@
     host = Host()
 
     if not args.gh_user:
-        args.user = host.environ.get('GH_USER')
+        args.gh_user = host.environ.get('GH_USER')
     if not args.gh_token:
         args.gh_token = host.environ.get('GH_TOKEN')
     if args.github_credentials_json:
diff --git a/third_party/WebKit/public/platform/WebFeaturePolicy.h b/third_party/WebKit/public/platform/WebFeaturePolicy.h
index b0394a5..5b8bdfb 100644
--- a/third_party/WebKit/public/platform/WebFeaturePolicy.h
+++ b/third_party/WebKit/public/platform/WebFeaturePolicy.h
@@ -11,6 +11,42 @@
 
 namespace blink {
 
+// These values map to the features which can be controlled by Feature Policy.
+// TODO(iclelland): Link to the spec where the behaviour for each of these is
+// defined.
+enum class WebFeaturePolicyFeature {
+  NotFound = 0,
+  // Controls access to document.cookie attribute.
+  DocumentCookie,
+  // Contols access to document.domain attribute.
+  DocumentDomain,
+  // Controls access to document.write and document.writeln methods.
+  DocumentWrite,
+  // Controls whether Element.requestFullscreen is allowed.
+  Fullscreen,
+  // Controls access to Geolocation interface.
+  Geolocation,
+  // Controls access to requestMIDIAccess method.
+  MidiFeature,
+  // Controls access to Notification interface.
+  Notifications,
+  // Controls access to PaymentRequest interface.
+  Payment,
+  // Controls access to PushManager interface.
+  Push,
+  // Controls whether synchronous script elements will run.
+  SyncScript,
+  // Controls use of synchronous XMLHTTPRequest API.
+  SyncXHR,
+  // Controls access to NavigatorUserMedia interface.
+  Usermedia,
+  // Controls access to navigator.vibrate method.
+  Vibrate,
+  // Controls access to RTCPeerConnection interface.
+  WebRTC,
+  LAST_FEATURE = WebRTC
+};
+
 struct WebParsedFeaturePolicyDeclaration {
   WebParsedFeaturePolicyDeclaration() : matchesAllOrigins(false) {}
   WebString featureName;
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index a3ef4ae2..539e6baf 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -46045,6 +46045,28 @@
   </summary>
 </histogram>
 
+<histogram name="Permissions.AutoBlocker.SafeBrowsingResponse"
+    enum="SafeBrowsingResponse">
+  <owner>dominickn@chromium.org</owner>
+  <owner>kcarattini@chromium.org</owner>
+  <summary>
+    Tracks the response (if received) from Safe Browsing when the API blacklist
+    is queried for an (origin, permission) pair. The response could be that the
+    origin was blacklisted, not blacklisted, or Safe Browsing timed out before a
+    response was received.
+  </summary>
+</histogram>
+
+<histogram name="Permissions.AutoBlocker.SafeBrowsingResponseTime" units="ms">
+  <owner>dominickn@chromium.org</owner>
+  <owner>kcarattini@chromium.org</owner>
+  <summary>
+    Records the elapsed time between the client sending a request to Safe
+    Browsing and receiving a result, or the maximum wait time is exceeded and
+    Safe Browsing is deemed to have timed out.
+  </summary>
+</histogram>
+
 <histogram name="Permissions.Prompt.Accepted" enum="PermissionRequestType">
   <owner>dominickn@chromium.org</owner>
   <owner>kcarattini@chromium.org</owner>
@@ -54102,6 +54124,9 @@
 </histogram>
 
 <histogram name="Renderer4.ReadyToDrawTileDrawStatus" enum="UsedInDraw">
+  <obsolete>
+    Deprecated 02/2017 in Issue 675840.
+  </obsolete>
   <owner>vmpstr@chromium.org</owner>
   <summary>
     For each tile that was ready to draw at some point, logs whether the tile
@@ -70917,12 +70942,11 @@
   <summary>The status when loading UKM PersistedLogs from Prefs.</summary>
 </histogram>
 
-<histogram name="UKM.Sources.MaxSourcesHit" units="BooleanHit">
+<histogram name="UKM.Sources.Dropped" enum="UkmSourceDroppedReason">
   <owner>holte@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <summary>
-    Counter for the number of times an UKM source was discarded due to the max
-    in-memory limit being hit.
+    Counters for the rate at which UKM Sources are dropped for various reasons.
   </summary>
 </histogram>
 
@@ -74691,6 +74715,26 @@
   </summary>
 </histogram>
 
+<histogram name="WebCore.IndexedDB.ObjectStore.IndexEntry.KeyType"
+    enum="IDBKeyType">
+  <owner>jsbell@chromium.org</owner>
+  <summary>
+    The type of key (number, string, etc.) used for an index entry for a record
+    being newly stored or updated in an Indexed DB object store. For array keys,
+    the types of sub-keys are not recorded.
+  </summary>
+</histogram>
+
+<histogram name="WebCore.IndexedDB.ObjectStore.Record.KeyType"
+    enum="IDBKeyType">
+  <owner>jsbell@chromium.org</owner>
+  <summary>
+    The type of key (number, string, etc.) used for a record being newly stored
+    or updated in an Indexed DB object store. For array keys, the types of
+    sub-keys are not recorded.
+  </summary>
+</histogram>
+
 <histogram name="WebCore.IndexedDB.OpenTime.Blocked" units="ms">
   <owner>cmumford@chromium.org</owner>
   <summary>
@@ -93983,6 +94027,15 @@
   <int value="2" label="Array">Key path is an array of strings.</int>
 </enum>
 
+<enum name="IDBKeyType" type="int">
+  <int value="0" label="Invalid">Invalid key.</int>
+  <int value="1" label="Array">Key is an array.</int>
+  <int value="2" label="Binary">Key is a binary buffer.</int>
+  <int value="3" label="String">Key is a string.</int>
+  <int value="4" label="Date">Key is a date.</int>
+  <int value="5" label="Number">Key is a number.</int>
+</enum>
+
 <enum name="IDBLevelDBBackingStoreInternalErrorType" type="int">
   <int value="0" label="IDBLevelDBBackingStoreReadError">
     IndexedDB encountered an error attempting to read or decode a value from the
@@ -104910,6 +104963,12 @@
   <int value="4" label="NO_STATE_ERROR"/>
 </enum>
 
+<enum name="SafeBrowsingResponse" type="int">
+  <int value="0" label="NOT_BLACKLISTED"/>
+  <int value="1" label="TIMEOUT"/>
+  <int value="2" label="BLACKLISTED"/>
+</enum>
+
 <enum name="SafeBrowsingV4ApplyUpdateResult" type="int">
   <int value="0" label="APPLY_UPDATE_SUCCESS"/>
   <int value="1" label="UNEXPECTED_APPLY_UPDATE_FAILURE"/>
@@ -109377,6 +109436,12 @@
   <int value="36" label="Tap unconfirmed"/>
 </enum>
 
+<enum name="UkmSourceDroppedReason" type="int">
+  <int value="0" label="Not dropped"/>
+  <int value="1" label="Recording disabled"/>
+  <int value="2" label="Max sources hit"/>
+</enum>
+
 <enum name="UmaCleanExitConsistency" type="int">
   <int value="0" label="Dirty/Dirty (Registry/Local State)"/>
   <int value="1" label="Dirty/Clean (Registry/Local State)"/>
@@ -109648,6 +109713,9 @@
 </enum>
 
 <enum name="UsedInDraw" type="int">
+  <obsolete>
+    Deprecated 02/2017 in Issue 675840.
+  </obsolete>
   <int value="0" label="Was not used in draw"/>
   <int value="1" label="Was used in draw"/>
 </enum>
diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc
index b71391b..ec6baf2 100644
--- a/ui/aura/mus/window_tree_client.cc
+++ b/ui/aura/mus/window_tree_client.cc
@@ -145,6 +145,21 @@
       .device_scale_factor();
 }
 
+void ConvertEventLocationToDip(int64_t display_id, ui::LocatedEvent* event) {
+  display::Screen* screen = display::Screen::GetScreen();
+  display::Display display;
+  if (!screen->GetDisplayWithDisplayId(display_id, &display) ||
+      display.device_scale_factor() == 1.f) {
+    return;
+  }
+  const gfx::Point host_location =
+      gfx::ConvertPointToDIP(display.device_scale_factor(), event->location());
+  event->set_location(host_location);
+  const gfx::Point root_location = gfx::ConvertPointToDIP(
+      display.device_scale_factor(), event->root_location());
+  event->set_root_location(root_location);
+}
+
 }  // namespace
 
 WindowTreeClient::WindowTreeClient(
@@ -1114,6 +1129,7 @@
 
 void WindowTreeClient::OnWindowInputEvent(uint32_t event_id,
                                           Id window_id,
+                                          int64_t display_id,
                                           std::unique_ptr<ui::Event> event,
                                           bool matches_pointer_watcher) {
   DCHECK(event);
@@ -1134,13 +1150,13 @@
 
   if (matches_pointer_watcher && has_pointer_watcher_) {
     DCHECK(event->IsPointerEvent());
-    delegate_->OnPointerEventObserved(*event->AsPointerEvent(),
+    std::unique_ptr<ui::Event> event_in_dip(ui::Event::Clone(*event));
+    ConvertEventLocationToDip(display_id, event_in_dip->AsLocatedEvent());
+    delegate_->OnPointerEventObserved(*event_in_dip->AsPointerEvent(),
                                       window ? window->GetWindow() : nullptr);
   }
 
-  // TODO: deal with no window or host here. This could happen if during
-  // dispatch a window is deleted or moved. In either case we still need to
-  // dispatch. Most likely need the display id.
+  // TODO: use |display_id| to find host and send there.
   if (!window || !window->GetWindow()->GetHost()) {
     tree_->OnWindowInputEventAck(event_id, ui::mojom::EventResult::UNHANDLED);
     return;
@@ -1179,12 +1195,14 @@
 }
 
 void WindowTreeClient::OnPointerEventObserved(std::unique_ptr<ui::Event> event,
-                                              uint32_t window_id) {
+                                              uint32_t window_id,
+                                              int64_t display_id) {
   DCHECK(event);
   DCHECK(event->IsPointerEvent());
   if (!has_pointer_watcher_)
     return;
 
+  ConvertEventLocationToDip(display_id, event->AsLocatedEvent());
   WindowMus* target_window = GetWindowByServerId(window_id);
   delegate_->OnPointerEventObserved(
       *event->AsPointerEvent(),
diff --git a/ui/aura/mus/window_tree_client.h b/ui/aura/mus/window_tree_client.h
index 09dc89ba..4640e87a 100644
--- a/ui/aura/mus/window_tree_client.h
+++ b/ui/aura/mus/window_tree_client.h
@@ -334,10 +334,12 @@
       const base::Optional<std::vector<uint8_t>>& transport_data) override;
   void OnWindowInputEvent(uint32_t event_id,
                           Id window_id,
+                          int64_t display_id,
                           std::unique_ptr<ui::Event> event,
                           bool matches_pointer_watcher) override;
   void OnPointerEventObserved(std::unique_ptr<ui::Event> event,
-                              uint32_t window_id) override;
+                              uint32_t window_id,
+                              int64_t display_id) override;
   void OnWindowFocused(Id focused_window_id) override;
   void OnWindowPredefinedCursorChanged(Id window_id,
                                        ui::mojom::Cursor cursor) override;
diff --git a/ui/aura/mus/window_tree_client_unittest.cc b/ui/aura/mus/window_tree_client_unittest.cc
index a804d3b..76dcf10 100644
--- a/ui/aura/mus/window_tree_client_unittest.cc
+++ b/ui/aura/mus/window_tree_client_unittest.cc
@@ -36,9 +36,12 @@
 #include "ui/aura/window_tree_host_observer.h"
 #include "ui/base/class_property.h"
 #include "ui/compositor/compositor.h"
+#include "ui/display/display.h"
 #include "ui/display/display_switches.h"
+#include "ui/display/screen.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
+#include "ui/gfx/geometry/dip_util.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace aura {
@@ -109,14 +112,23 @@
   WindowTreeClientClientTestHighDPI() {}
   ~WindowTreeClientClientTestHighDPI() override {}
 
+  const ui::PointerEvent* last_event_observed() const {
+    return last_event_observed_.get();
+  }
+
   // WindowTreeClientClientTest:
   void SetUp() override {
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
         switches::kForceDeviceScaleFactor, "2");
     WindowTreeClientClientTest::SetUp();
   }
+  void OnPointerEventObserved(const ui::PointerEvent& event,
+                              Window* target) override {
+    last_event_observed_.reset(new ui::PointerEvent(event));
+  }
 
  private:
+  std::unique_ptr<ui::PointerEvent> last_event_observed_;
   DISALLOW_COPY_AND_ASSIGN(WindowTreeClientClientTestHighDPI);
 };
 
@@ -534,7 +546,7 @@
                          gfx::Point(), ui::EventTimeForNow(), ui::EF_NONE, 0));
   window_tree_client()->OnWindowInputEvent(
       InputEventBasicTestWindowDelegate::kEventId, server_id(&child),
-      ui::Event::Clone(*ui_event.get()), 0);
+      window_tree_host.display_id(), ui::Event::Clone(*ui_event.get()), 0);
   EXPECT_TRUE(window_tree()->WasEventAcked(
       InputEventBasicTestWindowDelegate::kEventId));
   EXPECT_EQ(ui::mojom::EventResult::HANDLED,
@@ -585,7 +597,7 @@
       0, ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH),
       base::TimeTicks()));
   window_tree_client()->OnPointerEventObserved(std::move(pointer_event_down),
-                                               0u);
+                                               0u, 0);
 
   // Delegate sensed the event.
   const ui::PointerEvent* last_event = last_event_observed();
@@ -602,7 +614,8 @@
       ui::ET_POINTER_UP, gfx::Point(), gfx::Point(), ui::EF_CONTROL_DOWN, 1, 0,
       ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH),
       base::TimeTicks()));
-  window_tree_client()->OnPointerEventObserved(std::move(pointer_event_up), 0u);
+  window_tree_client()->OnPointerEventObserved(std::move(pointer_event_up), 0u,
+                                               0);
 
   // No event was sensed.
   EXPECT_FALSE(last_event_observed());
@@ -625,7 +638,7 @@
       ui::ET_POINTER_DOWN, gfx::Point(), gfx::Point(), ui::EF_CONTROL_DOWN, 1,
       0, ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH),
       base::TimeTicks::Now()));
-  window_tree_client()->OnWindowInputEvent(1, server_id(top_level.get()),
+  window_tree_client()->OnWindowInputEvent(1, server_id(top_level.get()), 0,
                                            std::move(pointer_event_down), true);
 
   // Delegate sensed the event.
@@ -1575,4 +1588,38 @@
   EXPECT_EQ(gfx::Rect(2, 4, 6, 8), top_level->GetHost()->GetBoundsInPixels());
 }
 
+TEST_F(WindowTreeClientClientTestHighDPI, PointerEventsInDips) {
+  display::Screen* screen = display::Screen::GetScreen();
+  const display::Display primary_display = screen->GetPrimaryDisplay();
+  ASSERT_EQ(2.0f, primary_display.device_scale_factor());
+
+  std::unique_ptr<Window> top_level(base::MakeUnique<Window>(nullptr));
+  top_level->SetType(ui::wm::WINDOW_TYPE_NORMAL);
+  top_level->Init(ui::LAYER_NOT_DRAWN);
+  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
+  top_level->Show();
+
+  // Start a pointer watcher for all events excluding move events.
+  window_tree_client_impl()->StartPointerWatcher(false /* want_moves */);
+
+  // Simulate the server sending an observed event.
+  const gfx::Point location_pixels(10, 12);
+  const gfx::Point root_location_pixels(14, 16);
+  std::unique_ptr<ui::PointerEvent> pointer_event_down(new ui::PointerEvent(
+      ui::ET_POINTER_DOWN, location_pixels, root_location_pixels,
+      ui::EF_CONTROL_DOWN, 1, 0,
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH),
+      base::TimeTicks()));
+  window_tree_client()->OnPointerEventObserved(std::move(pointer_event_down),
+                                               0u, primary_display.id());
+
+  // Delegate received the event in Dips.
+  const ui::PointerEvent* last_event = last_event_observed();
+  ASSERT_TRUE(last_event);
+  EXPECT_EQ(gfx::ConvertPointToDIP(2.0f, location_pixels),
+            last_event->location());
+  EXPECT_EQ(gfx::ConvertPointToDIP(2.0f, root_location_pixels),
+            last_event->root_location());
+}
+
 }  // namespace aura
diff --git a/ui/aura/test/mus/window_tree_client_private.cc b/ui/aura/test/mus/window_tree_client_private.cc
index 92c4212..c1255bf 100644
--- a/ui/aura/test/mus/window_tree_client_private.cc
+++ b/ui/aura/test/mus/window_tree_client_private.cc
@@ -56,9 +56,10 @@
     std::unique_ptr<ui::Event> event) {
   const uint32_t event_id = 0u;
   const uint32_t observer_id = 0u;
-  tree_client_impl_->OnWindowInputEvent(event_id,
-                                        WindowPortMus::Get(window)->server_id(),
-                                        std::move(event), observer_id);
+  const int64_t display_id = 0;
+  tree_client_impl_->OnWindowInputEvent(
+      event_id, WindowPortMus::Get(window)->server_id(), display_id,
+      std::move(event), observer_id);
 }
 
 void WindowTreeClientPrivate::CallOnCaptureChanged(Window* new_capture,
diff --git a/ui/views/focus/focus_manager.cc b/ui/views/focus/focus_manager.cc
index f429dbdc..adb1612 100644
--- a/ui/views/focus/focus_manager.cc
+++ b/ui/views/focus/focus_manager.cc
@@ -9,7 +9,6 @@
 
 #include "base/auto_reset.h"
 #include "base/logging.h"
-#include "build/build_config.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/text_input_client.h"
@@ -28,18 +27,13 @@
 
 bool FocusManager::arrow_key_traversal_enabled_ = false;
 
-FocusManager::FocusManager(Widget* widget, FocusManagerDelegate* delegate)
+FocusManager::FocusManager(Widget* widget,
+                           std::unique_ptr<FocusManagerDelegate> delegate)
     : widget_(widget),
-      delegate_(delegate),
-      focused_view_(NULL),
-      accelerator_manager_(new ui::AcceleratorManager),
-      shortcut_handling_suspended_(false),
-      focus_change_reason_(kReasonDirectFocusChange),
-      is_changing_focus_(false),
-      keyboard_accessible_(false) {
+      delegate_(std::move(delegate)),
+      stored_focused_view_storage_id_(
+          ViewStorage::GetInstance()->CreateStorageID()) {
   DCHECK(widget_);
-  stored_focused_view_storage_id_ =
-      ViewStorage::GetInstance()->CreateStorageID();
 }
 
 FocusManager::~FocusManager() {
@@ -59,7 +53,7 @@
   if (event.type() == ui::ET_KEY_PRESSED) {
     // If the focused view wants to process the key event as is, let it be.
     if (focused_view_ && focused_view_->SkipDefaultKeyEventProcessing(event) &&
-        !accelerator_manager_->HasPriorityHandler(accelerator))
+        !accelerator_manager_.HasPriorityHandler(accelerator))
       return true;
 
     // Intercept Tab related messages for focus traversal.
@@ -108,16 +102,11 @@
   return true;
 }
 
-void FocusManager::ValidateFocusedView() {
-  if (focused_view_ && !ContainsView(focused_view_))
-    ClearFocus();
-}
-
 // Tests whether a view is valid, whether it still belongs to the window
 // hierarchy of the FocusManager.
 bool FocusManager::ContainsView(View* view) {
   Widget* widget = view->GetWidget();
-  return widget ? widget->GetFocusManager() == this : false;
+  return widget && widget->GetFocusManager() == this;
 }
 
 void FocusManager::AdvanceFocus(bool reverse) {
@@ -204,10 +193,10 @@
                                          Widget* starting_widget,
                                          bool reverse,
                                          bool dont_loop) {
-  FocusTraversable* focus_traversable = NULL;
+  DCHECK(!focused_view_ || ContainsView(focused_view_)) << " focus_view="
+                                                        << focused_view_;
 
-  // Let's revalidate the focused view.
-  ValidateFocusedView();
+  FocusTraversable* focus_traversable = NULL;
 
   View* starting_view = NULL;
   if (original_starting_view) {
@@ -328,7 +317,6 @@
   }
 #endif
 
-  base::AutoReset<bool> auto_changing_focus(&is_changing_focus_, true);
   // Update the reason for the focus change (since this is checked by
   // some listeners), then notify all listeners.
   focus_change_reason_ = reason;
@@ -497,20 +485,20 @@
     const ui::Accelerator& accelerator,
     ui::AcceleratorManager::HandlerPriority priority,
     ui::AcceleratorTarget* target) {
-  accelerator_manager_->Register({accelerator}, priority, target);
+  accelerator_manager_.Register({accelerator}, priority, target);
 }
 
 void FocusManager::UnregisterAccelerator(const ui::Accelerator& accelerator,
                                          ui::AcceleratorTarget* target) {
-  accelerator_manager_->Unregister(accelerator, target);
+  accelerator_manager_.Unregister(accelerator, target);
 }
 
 void FocusManager::UnregisterAccelerators(ui::AcceleratorTarget* target) {
-  accelerator_manager_->UnregisterAll(target);
+  accelerator_manager_.UnregisterAll(target);
 }
 
 bool FocusManager::ProcessAccelerator(const ui::Accelerator& accelerator) {
-  if (accelerator_manager_->Process(accelerator))
+  if (accelerator_manager_.Process(accelerator))
     return true;
   if (delegate_.get())
     return delegate_->ProcessAccelerator(accelerator);
@@ -519,7 +507,7 @@
 
 bool FocusManager::HasPriorityHandler(
     const ui::Accelerator& accelerator) const {
-  return accelerator_manager_->HasPriorityHandler(accelerator);
+  return accelerator_manager_.HasPriorityHandler(accelerator);
 }
 
 // static
diff --git a/ui/views/focus/focus_manager.h b/ui/views/focus/focus_manager.h
index 9b24220..02fe0ab 100644
--- a/ui/views/focus/focus_manager.h
+++ b/ui/views/focus/focus_manager.h
@@ -5,15 +5,11 @@
 #ifndef UI_VIEWS_FOCUS_FOCUS_MANAGER_H_
 #define UI_VIEWS_FOCUS_FOCUS_MANAGER_H_
 
-#include <list>
-#include <map>
 #include <memory>
 
 #include "base/macros.h"
 #include "base/observer_list.h"
-#include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/accelerator_manager.h"
-#include "ui/gfx/native_widget_types.h"
 #include "ui/views/views_export.h"
 
 // FocusManager handles focus traversal, stores and restores focused views, and
@@ -75,7 +71,7 @@
 // AccessibleToolbarView is FocusTraversable.
 
 namespace ui {
-class AcceleratorManager;
+class Accelerator;
 class AcceleratorTarget;
 class KeyEvent;
 }
@@ -149,7 +145,7 @@
     kNoWrap
   };
 
-  FocusManager(Widget* widget, FocusManagerDelegate* delegate);
+  FocusManager(Widget* widget, std::unique_ptr<FocusManagerDelegate> delegate);
   virtual ~FocusManager();
 
   // Processes the passed key event for accelerators and keyboard traversal.
@@ -189,10 +185,6 @@
   // is no view available to advance focus to, focus will be cleared.
   void AdvanceFocusIfNecessary();
 
-  // Validates the focused view, clearing it if the window it belongs too is not
-  // attached to the window hierarchy anymore.
-  void ValidateFocusedView();
-
   // Stores the focused view. Used when the widget loses activation.
   // |clear_native_focus| indicates whether this should invoke ClearFocus().
   // Typically |true| should be passed in.
@@ -216,9 +208,6 @@
   // Clears the stored focused view.
   void ClearStoredFocusedView();
 
-  // Returns true if in the process of changing the focused view.
-  bool is_changing_focus() const { return is_changing_focus_; }
-
   // Disable shortcut handling.
   void set_shortcut_handling_suspended(bool suspended) {
     shortcut_handling_suspended_ = suspended;
@@ -353,35 +342,31 @@
   std::unique_ptr<FocusManagerDelegate> delegate_;
 
   // The view that currently is focused.
-  View* focused_view_;
+  View* focused_view_ = nullptr;
 
   // The AcceleratorManager this FocusManager is associated with.
-  std::unique_ptr<ui::AcceleratorManager> accelerator_manager_;
+  ui::AcceleratorManager accelerator_manager_;
 
   // Keeps track of whether shortcut handling is currently suspended.
-  bool shortcut_handling_suspended_;
+  bool shortcut_handling_suspended_ = false;
 
   // The storage id used in the ViewStorage to store/restore the view that last
   // had focus.
-  int stored_focused_view_storage_id_;
+  const int stored_focused_view_storage_id_;
 
   // The reason why the focus most recently changed.
-  FocusChangeReason focus_change_reason_;
+  FocusChangeReason focus_change_reason_ = kReasonDirectFocusChange;
 
   // The list of registered FocusChange listeners.
   base::ObserverList<FocusChangeListener, true> focus_change_listeners_;
 
-  // See description above getter.
-  bool is_changing_focus_;
-
   // This is true if full keyboard accessibility is needed. This causes
   // IsAccessibilityFocusable() to be checked rather than IsFocusable(). This
   // can be set depending on platform constraints. FocusSearch uses this in
   // addition to its own accessibility mode, which handles accessibility at the
   // FocusTraversable level. Currently only used on Mac, when Full Keyboard
   // access is enabled.
-  // Default value is false.
-  bool keyboard_accessible_;
+  bool keyboard_accessible_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(FocusManager);
 };
diff --git a/ui/views/focus/focus_manager_factory.cc b/ui/views/focus/focus_manager_factory.cc
index 14956a65..a5393cf 100644
--- a/ui/views/focus/focus_manager_factory.cc
+++ b/ui/views/focus/focus_manager_factory.cc
@@ -4,9 +4,8 @@
 
 #include "ui/views/focus/focus_manager_factory.h"
 
-#include "base/compiler_specific.h"
-#include "base/macros.h"
 #include "ui/views/focus/focus_manager.h"
+#include "ui/views/focus/focus_manager_delegate.h"
 
 namespace views {
 
@@ -20,14 +19,14 @@
  protected:
   FocusManager* CreateFocusManager(Widget* widget,
                                    bool desktop_widget) override {
-    return new FocusManager(widget, NULL /* delegate */);
+    return new FocusManager(widget, nullptr /* delegate */);
   }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DefaultFocusManagerFactory);
 };
 
-FocusManagerFactory* focus_manager_factory = NULL;
+FocusManagerFactory* focus_manager_factory = nullptr;
 
 }  // namespace
 
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc
index 26f1f658..bafea1e 100644
--- a/ui/views/focus/focus_manager_unittest.cc
+++ b/ui/views/focus/focus_manager_unittest.cc
@@ -15,6 +15,7 @@
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/views/accessible_pane_view.h"
+#include "ui/views/focus/focus_manager_delegate.h"
 #include "ui/views/focus/focus_manager_factory.h"
 #include "ui/views/focus/widget_focus_manager.h"
 #include "ui/views/test/focus_manager_test.h"