diff --git a/chrome/android/java/res/layout/new_tab_page_all_dismissed.xml b/chrome/android/java/res/layout/new_tab_page_all_dismissed.xml
index fdb4addc..71af575 100644
--- a/chrome/android/java/res/layout/new_tab_page_all_dismissed.xml
+++ b/chrome/android/java/res/layout/new_tab_page_all_dismissed.xml
@@ -31,7 +31,7 @@
         android:layout_below="@id/image"
         android:layout_alignParentStart="true"
         android:gravity="center_horizontal"
-        android:text="@string/ntp_all_dismissed_title_text"
+        android:text="@string/ntp_title_no_suggestions"
         android:textSize="16sp"
         android:textColor="@color/snippets_headline_text_color"
         chrome:leading="24dp" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java
index c68445a..59c05cb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusItem.java
@@ -27,7 +27,7 @@
         @Override
         @StringRes
         public int getHeader() {
-            return R.string.ntp_status_card_title_no_suggestions;
+            return R.string.ntp_title_no_suggestions;
         }
 
         @Override
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index fdb29a0..f6da2cc 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1964,7 +1964,7 @@
         Add account
       </message>
       <message name="IDS_SIGNIN_OPEN_ADD_GOOGLE_ACCOUNT_PAGE_FAILED" desc="Message for opening add Google Account page in device's Settings app failed">
-        Add a Google Account from the Accounts page in your device's Settings app.
+        Add a Google Account from the Accounts page in your device’s Settings app.
       </message>
       <message name="IDS_SIGNIN_OPEN_SETTINGS_ACCOUNTS" desc="Text for button to open Accounts page in device's Settings app">
         Open settings
@@ -2092,9 +2092,6 @@
       <message name="IDS_NTP_LEARN_MORE_ABOUT_SUGGESTED_CONTENT" desc="Text in the footer of the New Tab Page. Part of the text is a link to a help center page where the user can learn more about suggested content.">
         <ph name="BEGIN_LINK">&lt;link&gt;</ph>Learn more<ph name="END_LINK">&lt;/link&gt;</ph> about suggested content
       </message>
-      <message name="IDS_NTP_ALL_DISMISSED_TITLE_TEXT" desc="Title text shown on the New Tab Page when all suggested content has been dismissed.">
-        That's all for now
-      </message>
       <message name="IDS_NTP_ALL_DISMISSED_BODY_TEXT_MORNING" desc="Body text shown in the morning on the New Tab Page when all suggested content has been dismissed.">
         More articles will appear soon. Enjoy your morning.
       </message>
@@ -2583,7 +2580,7 @@
         Delete app data?
       </message>
       <message name="IDS_STORAGE_MANAGEMENT_RESET_APP_DIALOG_TEXT" desc="Text of the reset app dialoag in the storage UI.">
-        All Chrome's app data will be deleted permanently. This includes all files, settings, accounts, databases, etc.
+        All Chrome’s app data will be deleted permanently. This includes all files, settings, accounts, databases, etc.
       </message>
 
       <message name="IDS_STORAGE_CLEAR_BUTTON_TITLE" desc="Title of a button in the storage UI used to clear all storage data. [CHAR-LIMIT=24]">
@@ -2614,7 +2611,7 @@
 You must have Bluetooth and Location turned on in order to use the Physical Web.
       </message>
       <message name="IDS_PHYSICAL_WEB_LAUNCH_BUTTON" desc="The label for a button that opens a list of nearby URLs">
-        See what's nearby
+        See what’s nearby
       </message>
       <message name="IDS_PHYSICAL_WEB_SHARE_ACTIVITY_TITLE" desc="Title of the Physical Web Share activity that will appear in the Android share dialog.">
         Physical Web
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc
index 06a4c76a7..f58540c 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -43,6 +43,7 @@
 #include "chrome/browser/policy/profile_policy_connector_factory.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/pref_names.h"
+#include "chromeos/audio/cras_audio_handler.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/update_engine_client.h"
 #include "chromeos/disks/disk_mount_manager.h"
@@ -989,6 +990,11 @@
     status->add_cpu_utilization_pct(usage.cpu_usage_percent);
     status->add_system_ram_free(usage.bytes_of_ram_free);
   }
+
+  // Get the current device sound volume level.
+  chromeos::CrasAudioHandler* audio_handler = chromeos::CrasAudioHandler::Get();
+  status->set_sound_volume(audio_handler->GetOutputVolumePercent());
+
   return true;
 }
 
diff --git a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
index 20278f2..bbaaef7 100644
--- a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
@@ -39,6 +39,7 @@
 #include "chrome/test/base/chrome_unit_test_suite.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/audio/cras_audio_handler.h"
 #include "chromeos/dbus/cros_disks_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/fake_update_engine_client.h"
@@ -345,6 +346,8 @@
         chromeos::DBusThreadManager::GetSetterForTesting();
     dbus_setter->SetUpdateEngineClient(
         base::WrapUnique<chromeos::UpdateEngineClient>(update_engine_client_));
+
+    chromeos::CrasAudioHandler::InitializeForTesting();
   }
 
   void AddMountPoint(const std::string& mount_point) {
@@ -356,6 +359,7 @@
   }
 
   ~DeviceStatusCollectorTest() override {
+    chromeos::CrasAudioHandler::Shutdown();
     chromeos::KioskAppManager::Shutdown();
     TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
 
@@ -1295,6 +1299,26 @@
   EXPECT_FALSE(app.has_error());
 }
 
+TEST_F(DeviceStatusCollectorTest, TestSoundVolume) {
+  // Expect the sound volume to be reported by default (default sound volume
+  // used in testing is 75).
+  GetStatus();
+  EXPECT_EQ(75, device_status_.sound_volume());
+
+  // When the pref to collect this data is not enabled, expect that the field
+  // isn't present in the protobuf.
+  settings_helper_.SetBoolean(chromeos::kReportDeviceHardwareStatus, false);
+  GetStatus();
+  EXPECT_FALSE(device_status_.has_sound_volume());
+
+  // Try setting a custom volume value and check that it matches.
+  const int kCustomVolume = 42;
+  settings_helper_.SetBoolean(chromeos::kReportDeviceHardwareStatus, true);
+  chromeos::CrasAudioHandler::Get()->SetOutputVolumePercent(kCustomVolume);
+  GetStatus();
+  EXPECT_EQ(kCustomVolume, device_status_.sound_volume());
+}
+
 // Fake device state.
 struct FakeDeviceData {
   const char* device_path;
diff --git a/chrome/browser/lifetime/browser_close_manager_browsertest.cc b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
index 2e18057c..1214656 100644
--- a/chrome/browser/lifetime/browser_close_manager_browsertest.cc
+++ b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
@@ -744,8 +744,14 @@
   EXPECT_TRUE(BrowserList::GetInstance()->empty());
 }
 
+#if defined(OS_MACOSX)
+// Flaky on Mac OSX. See http://crbug.com/700271.
+#define MAYBE_AddBeforeUnloadDuringClosing DISABLED_AddBeforeUnloadDuringClosing
+#else
+#define MAYBE_AddBeforeUnloadDuringClosing AddBeforeUnloadDuringClosing
+#endif
 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
-                       AddBeforeUnloadDuringClosing) {
+                       MAYBE_AddBeforeUnloadDuringClosing) {
   // TODO(crbug.com/250305): Currently FastUnloadController is broken.
   // And it is difficult to fix this issue without fixing that one.
   if (GetParam())
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index c46ac57..dd590e1 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -149,8 +149,6 @@
     "search/search_model_observer.h",
     "search/search_tab_helper.cc",
     "search/search_tab_helper.h",
-    "search/search_tab_helper_delegate.cc",
-    "search/search_tab_helper_delegate.h",
     "search_engines/edit_search_engine_controller.cc",
     "search_engines/edit_search_engine_controller.h",
     "search_engines/keyword_editor_controller.cc",
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index c4c4a2d..e92315d8 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -962,9 +962,9 @@
                             bool foreground) {
   SetAsDelegate(contents, true);
 
-  SessionTabHelper* session_tab_helper =
-      SessionTabHelper::FromWebContents(contents);
-  session_tab_helper->SetWindowID(session_id());
+  SessionTabHelper::FromWebContents(contents)->SetWindowID(session_id());
+
+  SearchTabHelper::FromWebContents(contents)->OnTabAttachedToWindow(window_);
 
   content::NotificationService::current()->Notify(
       chrome::NOTIFICATION_TAB_PARENTED,
@@ -1983,13 +1983,6 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-// Browser, SearchTabHelperDelegate implementation:
-
-OmniboxView* Browser::GetOmniboxView() {
-  return window_->GetLocationBar()->GetOmniboxView();
-}
-
-///////////////////////////////////////////////////////////////////////////////
 // Browser, web_modal::WebContentsModalDialogManagerDelegate implementation:
 
 void Browser::SetWebContentsBlocked(content::WebContents* web_contents,
@@ -2429,7 +2422,6 @@
   WebContentsModalDialogManager::FromWebContents(web_contents)->
       SetDelegate(delegate);
   CoreTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
-  SearchTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
   translate::ContentTranslateDriver& content_translate_driver =
       ChromeTranslateClient::FromWebContents(web_contents)->translate_driver();
   if (delegate) {
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index cbfe174..8da77109 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -28,7 +28,6 @@
 #include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
 #include "chrome/browser/ui/profile_chooser_constants.h"
-#include "chrome/browser/ui/search/search_tab_helper_delegate.h"
 #include "chrome/browser/ui/signin_view_controller.h"
 #include "chrome/browser/ui/tab_contents/core_tab_helper_delegate.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
@@ -106,7 +105,6 @@
 class Browser : public TabStripModelObserver,
                 public content::WebContentsDelegate,
                 public CoreTabHelperDelegate,
-                public SearchTabHelperDelegate,
                 public ChromeWebModalDialogManagerDelegate,
                 public BookmarkTabHelperDelegate,
                 public zoom::ZoomObserver,
@@ -719,9 +717,6 @@
   bool CanReloadContents(content::WebContents* web_contents) const override;
   bool CanSaveContents(content::WebContents* web_contents) const override;
 
-  // Overridden from SearchTabHelperDelegate:
-  OmniboxView* GetOmniboxView() override;
-
   // Overridden from WebContentsModalDialogManagerDelegate:
   void SetWebContentsBlocked(content::WebContents* web_contents,
                              bool blocked) override;
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
index 42b2bba4..3a33851 100644
--- a/chrome/browser/ui/search/search_tab_helper.cc
+++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/ui/omnibox/clipboard_utils.h"
 #include "chrome/browser/ui/search/instant_tab.h"
 #include "chrome/browser/ui/search/search_ipc_router_policy_impl.h"
-#include "chrome/browser/ui/search/search_tab_helper_delegate.h"
 #include "chrome/browser/ui/tab_contents/core_tab_helper.h"
 #include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h"
 #include "chrome/common/url_constants.h"
@@ -141,8 +140,8 @@
           web_contents,
           this,
           base::WrapUnique(new SearchIPCRouterPolicyImpl(web_contents))),
-      instant_service_(NULL),
-      delegate_(NULL) {
+      instant_service_(nullptr),
+      omnibox_view_(nullptr) {
   if (!is_search_enabled_)
     return;
 
@@ -177,7 +176,7 @@
   // Don't send oninputstart/oninputend updates in response to focus changes
   // if there's a navigation in progress. This prevents Chrome from sending
   // a spurious oninputend when the user accepts a match in the omnibox.
-  if (web_contents_->GetController().GetPendingEntry() == NULL)
+  if (web_contents_->GetController().GetPendingEntry() == nullptr)
     ipc_router_.SetInputInProgress(IsInputInProgress());
 }
 
@@ -198,6 +197,10 @@
   ipc_router_.Submit(text, params);
 }
 
+void SearchTabHelper::OnTabAttachedToWindow(BrowserWindow* window) {
+  omnibox_view_ = window->GetLocationBar()->GetOmniboxView();
+}
+
 void SearchTabHelper::OnTabActivated() {
   ipc_router_.OnTabActivated();
 
@@ -341,8 +344,7 @@
 void SearchTabHelper::FocusOmnibox(OmniboxFocusState state) {
 // TODO(kmadhusu): Move platform specific code from here and get rid of #ifdef.
 #if !defined(OS_ANDROID)
-  OmniboxView* omnibox = GetOmniboxView();
-  if (!omnibox)
+  if (!omnibox_view_)
     return;
 
   // Do not add a default case in the switch block for the following reasons:
@@ -354,25 +356,25 @@
   // doing nothing instead of crashing the browser process (intentional no-op).
   switch (state) {
     case OMNIBOX_FOCUS_VISIBLE:
-      omnibox->SetFocus();
-      omnibox->model()->SetCaretVisibility(true);
+      omnibox_view_->SetFocus();
+      omnibox_view_->model()->SetCaretVisibility(true);
       break;
     case OMNIBOX_FOCUS_INVISIBLE:
-      omnibox->SetFocus();
-      omnibox->model()->SetCaretVisibility(false);
+      omnibox_view_->SetFocus();
+      omnibox_view_->model()->SetCaretVisibility(false);
       // If the user clicked on the fakebox, any text already in the omnibox
       // should get cleared when they start typing. Selecting all the existing
       // text is a convenient way to accomplish this. It also gives a slight
       // visual cue to users who really understand selection state about what
       // will happen if they start typing.
-      omnibox->SelectAll(false);
-      omnibox->ShowImeIfNeeded();
+      omnibox_view_->SelectAll(false);
+      omnibox_view_->ShowImeIfNeeded();
       break;
     case OMNIBOX_FOCUS_NONE:
       // Remove focus only if the popup is closed. This will prevent someone
       // from changing the omnibox value and closing the popup without user
       // interaction.
-      if (!omnibox->model()->popup_model()->IsOpen())
+      if (!omnibox_view_->model()->popup_model()->IsOpen())
         web_contents()->Focus();
       break;
   }
@@ -428,26 +430,26 @@
 void SearchTabHelper::PasteIntoOmnibox(const base::string16& text) {
 // TODO(kmadhusu): Move platform specific code from here and get rid of #ifdef.
 #if !defined(OS_ANDROID)
-  OmniboxView* omnibox = GetOmniboxView();
-  if (!omnibox)
+  if (!omnibox_view_)
     return;
   // The first case is for right click to paste, where the text is retrieved
   // from the clipboard already sanitized. The second case is needed to handle
   // drag-and-drop value and it has to be sanitazed before setting it into the
   // omnibox.
   base::string16 text_to_paste =
-      text.empty() ? GetClipboardText() : omnibox->SanitizeTextForPaste(text);
+      text.empty() ? GetClipboardText()
+                   : omnibox_view_->SanitizeTextForPaste(text);
 
   if (text_to_paste.empty())
     return;
 
-  if (!omnibox->model()->has_focus())
-    omnibox->SetFocus();
+  if (!omnibox_view_->model()->has_focus())
+    omnibox_view_->SetFocus();
 
-  omnibox->OnBeforePossibleChange();
-  omnibox->model()->OnPaste();
-  omnibox->SetUserText(text_to_paste);
-  omnibox->OnAfterPossibleChange(true);
+  omnibox_view_->OnBeforePossibleChange();
+  omnibox_view_->model()->OnPaste();
+  omnibox_view_->SetUserText(text_to_paste);
+  omnibox_view_->OnAfterPossibleChange(true);
 #endif
 }
 
@@ -487,8 +489,7 @@
   if (!update_origin)
     origin = model_.mode().origin;
 
-  OmniboxView* omnibox = GetOmniboxView();
-  if (omnibox && omnibox->model()->user_input_in_progress())
+  if (omnibox_view_ && omnibox_view_->model()->user_input_in_progress())
     type = SearchMode::MODE_SEARCH_SUGGESTIONS;
 
   SearchMode old_mode(model_.mode());
@@ -518,11 +519,6 @@
 }
 
 bool SearchTabHelper::IsInputInProgress() const {
-  OmniboxView* omnibox = GetOmniboxView();
-  return !model_.mode().is_ntp() && omnibox &&
-      omnibox->model()->focus_state() == OMNIBOX_FOCUS_VISIBLE;
-}
-
-OmniboxView* SearchTabHelper::GetOmniboxView() const {
-  return delegate_ ? delegate_->GetOmniboxView() : NULL;
+  return !model_.mode().is_ntp() && omnibox_view_ &&
+         omnibox_view_->model()->focus_state() == OMNIBOX_FOCUS_VISIBLE;
 }
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h
index 095abf6..fea025a 100644
--- a/chrome/browser/ui/search/search_tab_helper.h
+++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -27,13 +27,13 @@
 struct LoadCommittedDetails;
 }
 
+class BrowserWindow;
 class GURL;
 class InstantService;
 class InstantTabTest;
 class OmniboxView;
 class Profile;
 class SearchIPCRouterTest;
-class SearchTabHelperDelegate;
 
 // Per-tab search "helper".  Acts as the owner and controller of the tab's
 // search UI model.
@@ -75,14 +75,16 @@
   void Submit(const base::string16& text,
               const EmbeddedSearchRequestParams& params);
 
+  // Called when the tab corresponding to |this| instance is attached to a
+  // browser window.
+  void OnTabAttachedToWindow(BrowserWindow* window);
+
   // Called when the tab corresponding to |this| instance is activated.
   void OnTabActivated();
 
   // Called when the tab corresponding to |this| instance is deactivated.
   void OnTabDeactivated();
 
-  void set_delegate(SearchTabHelperDelegate* delegate) { delegate_ = delegate; }
-
   SearchIPCRouter& ipc_router_for_testing() { return ipc_router_; }
 
  private:
@@ -176,9 +178,6 @@
   // active tab is in mode SEARCH_SUGGESTIONS.
   bool IsInputInProgress() const;
 
-  // Returns the OmniboxView for |web_contents_| or NULL if not available.
-  OmniboxView* GetOmniboxView() const;
-
   const bool is_search_enabled_;
 
   // Model object for UI that cares about search state.
@@ -190,10 +189,7 @@
 
   InstantService* instant_service_;
 
-  // Delegate for notifying our owner about the SearchTabHelper state. Not owned
-  // by us.
-  // NULL on iOS and Android because they don't use the Instant framework.
-  SearchTabHelperDelegate* delegate_;
+  OmniboxView* omnibox_view_;
 
   DISALLOW_COPY_AND_ASSIGN(SearchTabHelper);
 };
diff --git a/chrome/browser/ui/search/search_tab_helper_delegate.cc b/chrome/browser/ui/search/search_tab_helper_delegate.cc
deleted file mode 100644
index ec110fd..0000000
--- a/chrome/browser/ui/search/search_tab_helper_delegate.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/search/search_tab_helper_delegate.h"
-
-OmniboxView* SearchTabHelperDelegate::GetOmniboxView() {
-  return nullptr;
-}
-
-SearchTabHelperDelegate::~SearchTabHelperDelegate() {
-}
diff --git a/chrome/browser/ui/search/search_tab_helper_delegate.h b/chrome/browser/ui/search/search_tab_helper_delegate.h
deleted file mode 100644
index f0e7330..0000000
--- a/chrome/browser/ui/search/search_tab_helper_delegate.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_DELEGATE_H_
-#define CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_DELEGATE_H_
-
-class OmniboxView;
-
-// Objects implement this interface to provide necessary functionality to
-// SearchTabHelper.
-class SearchTabHelperDelegate {
- public:
-  // Returns the OmniboxView or NULL if not available.
-  virtual OmniboxView* GetOmniboxView();
-
- protected:
-  virtual ~SearchTabHelperDelegate();
-};
-
-#endif  // CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_DELEGATE_H_
diff --git a/components/ntp_snippets_strings.grdp b/components/ntp_snippets_strings.grdp
index 25c61a7..db49267 100644
--- a/components/ntp_snippets_strings.grdp
+++ b/components/ntp_snippets_strings.grdp
@@ -8,7 +8,7 @@
     <message name="IDS_SNIPPETS_DISABLED_GENERIC_PROMPT" desc="Title of the card explaining what action the user can take to get personalized content suggestions on the New Tab Page." formatter_data="android_java">
       Get personalized content
     </message>
-    <message name="IDS_NTP_STATUS_CARD_TITLE_NO_SUGGESTIONS" desc="On the New Tab Page, title of the status card explaining that there is no new content available in the section." formatter_data="android_java">
+    <message name="IDS_NTP_TITLE_NO_SUGGESTIONS" desc="On the New Tab Page, title text explaining there is no content." formatter_data="android_java">
       That’s all for now
     </message>
   </if>
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 845a752..1bb72401 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -767,6 +767,9 @@
   // Set only when there is an auto launched with zero delay kiosk app
   // and it is currently running. Otherwise, this field is empty.
   optional AppStatus running_kiosk_app = 18;
+
+  // Sound output volume level in range [0,100].
+  optional int32 sound_volume = 19;
 }
 
 message OsUpdateStatus {
diff --git a/content/browser/notifications/notification_database.cc b/content/browser/notifications/notification_database.cc
index 677a327..19236820 100644
--- a/content/browser/notifications/notification_database.cc
+++ b/content/browser/notifications/notification_database.cc
@@ -328,6 +328,11 @@
       continue;
     }
 
+    // Silently ignore the notification if it doesn't have an ID assigned.
+    // TODO(peter): Remove this clause when Chrome 55 has branched.
+    if (notification_database_data.notification_id.empty())
+      continue;
+
     notification_data_vector->push_back(notification_database_data);
   }
 
diff --git a/content/browser/notifications/platform_notification_context_impl.cc b/content/browser/notifications/platform_notification_context_impl.cc
index b2b372f..c7a6b2c 100644
--- a/content/browser/notifications/platform_notification_context_impl.cc
+++ b/content/browser/notifications/platform_notification_context_impl.cc
@@ -252,10 +252,10 @@
   UMA_HISTOGRAM_ENUMERATION("Notifications.Database.ReadForServiceWorkerResult",
                             status, NotificationDatabase::STATUS_COUNT);
 
-  std::vector<std::string> obsolete_notifications;
-
   if (status == NotificationDatabase::STATUS_OK) {
     if (synchronization_supported) {
+      // Filter out notifications that are not actually on display anymore.
+      // TODO(miguelg) synchronize the database if there are inconsistencies.
       for (auto it = notification_datas.begin();
            it != notification_datas.end();) {
         // The database is only used for persistent notifications.
@@ -264,7 +264,6 @@
         if (displayed_notifications->count(it->notification_id)) {
           ++it;
         } else {
-          obsolete_notifications.push_back(it->notification_id);
           it = notification_datas.erase(it);
         }
       }
@@ -273,10 +272,6 @@
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
         base::Bind(callback, true /* success */, notification_datas));
-
-    // Remove notifications that are not actually on display anymore.
-    for (const auto& it : obsolete_notifications)
-      database_->DeleteNotificationData(it, origin);
     return;
   }
 
diff --git a/content/browser/notifications/platform_notification_context_unittest.cc b/content/browser/notifications/platform_notification_context_unittest.cc
index 945fd16a..4aee64b 100644
--- a/content/browser/notifications/platform_notification_context_unittest.cc
+++ b/content/browser/notifications/platform_notification_context_unittest.cc
@@ -15,11 +15,8 @@
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/browser/notification_database_data.h"
-#include "content/public/common/notification_resources.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "content/test/mock_platform_notification_service.h"
-#include "content/test/test_content_browser_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -28,19 +25,6 @@
 // Fake Service Worker registration id to use in tests requiring one.
 const int64_t kFakeServiceWorkerRegistrationId = 42;
 
-class NotificationBrowserClient : public TestContentBrowserClient {
- public:
-  NotificationBrowserClient()
-      : platform_notification_service_(new MockPlatformNotificationService()) {}
-
-  PlatformNotificationService* GetPlatformNotificationService() override {
-    return platform_notification_service_.get();
-  }
-
- private:
-  std::unique_ptr<PlatformNotificationService> platform_notification_service_;
-};
-
 class PlatformNotificationContextTest : public ::testing::Test {
  public:
   PlatformNotificationContextTest()
@@ -500,69 +484,4 @@
   }
 }
 
-TEST_F(PlatformNotificationContextTest, SynchronizeNotifications) {
-  NotificationBrowserClient notification_browser_client;
-  SetBrowserClientForTesting(&notification_browser_client);
-
-  scoped_refptr<PlatformNotificationContextImpl> context =
-      CreatePlatformNotificationContext();
-
-  GURL origin("https://example.com");
-  NotificationDatabaseData notification_database_data;
-  notification_database_data.service_worker_registration_id =
-      kFakeServiceWorkerRegistrationId;
-  PlatformNotificationData notification_data;
-  content::NotificationResources notification_resources;
-
-  context->WriteNotificationData(
-      origin, notification_database_data,
-      base::Bind(&PlatformNotificationContextTest::DidWriteNotificationData,
-                 base::Unretained(this)));
-
-  base::RunLoop().RunUntilIdle();
-  ASSERT_TRUE(success());
-  EXPECT_FALSE(notification_id().empty());
-
-  PlatformNotificationService* service =
-      notification_browser_client.GetPlatformNotificationService();
-
-  service->DisplayPersistentNotification(browser_context(), notification_id(),
-                                         origin, origin, notification_data,
-                                         notification_resources);
-
-  std::vector<NotificationDatabaseData> notification_database_datas;
-  context->ReadAllNotificationDataForServiceWorkerRegistration(
-      origin, kFakeServiceWorkerRegistrationId,
-      base::Bind(&PlatformNotificationContextTest::DidReadAllNotificationDatas,
-                 base::Unretained(this), &notification_database_datas));
-
-  base::RunLoop().RunUntilIdle();
-
-  ASSERT_TRUE(success());
-  ASSERT_EQ(1u, notification_database_datas.size());
-
-  // Delete the notification from the display service without removing it from
-  // the database. It should automatically synchronize on the next read.
-  service->ClosePersistentNotification(browser_context(), notification_id());
-  context->ReadAllNotificationDataForServiceWorkerRegistration(
-      origin, kFakeServiceWorkerRegistrationId,
-      base::Bind(&PlatformNotificationContextTest::DidReadAllNotificationDatas,
-                 base::Unretained(this), &notification_database_datas));
-  base::RunLoop().RunUntilIdle();
-
-  ASSERT_TRUE(success());
-  ASSERT_EQ(0u, notification_database_datas.size());
-
-  context->ReadNotificationData(
-      notification_id(), origin,
-      base::Bind(&PlatformNotificationContextTest::DidReadNotificationData,
-                 base::Unretained(this)));
-
-  base::RunLoop().RunUntilIdle();
-
-  // The notification was removed, so we shouldn't be able to read it from
-  // the database anymore.
-  EXPECT_FALSE(success());
-}
-
 }  // namespace content
diff --git a/content/shell/browser/layout_test/layout_test_notification_manager.cc b/content/shell/browser/layout_test/layout_test_notification_manager.cc
index 791e3700..cfac368 100644
--- a/content/shell/browser/layout_test/layout_test_notification_manager.cc
+++ b/content/shell/browser/layout_test/layout_test_notification_manager.cc
@@ -4,16 +4,189 @@
 
 #include "content/shell/browser/layout_test/layout_test_notification_manager.h"
 
+#include "base/guid.h"
+#include "base/strings/nullable_string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/desktop_notification_delegate.h"
+#include "content/public/browser/notification_event_dispatcher.h"
 #include "content/public/browser/permission_type.h"
+#include "content/public/common/persistent_notification_status.h"
+#include "content/public/common/platform_notification_data.h"
 #include "content/shell/browser/layout_test/layout_test_browser_context.h"
 #include "content/shell/browser/layout_test/layout_test_content_browser_client.h"
 #include "content/shell/browser/layout_test/layout_test_permission_manager.h"
 
 namespace content {
+namespace {
 
-LayoutTestNotificationManager::LayoutTestNotificationManager() {}
+// The Web Notification layout tests don't care about the lifetime of the
+// Service Worker when a notificationclick event has been dispatched.
+void OnEventDispatchComplete(PersistentNotificationStatus status) {}
+
+}  // namespace
+
+LayoutTestNotificationManager::LayoutTestNotificationManager()
+    : weak_factory_(this) {}
+
 LayoutTestNotificationManager::~LayoutTestNotificationManager() {}
 
+void LayoutTestNotificationManager::DisplayNotification(
+    BrowserContext* browser_context,
+    const std::string& notification_id,
+    const GURL& origin,
+    const PlatformNotificationData& notification_data,
+    const NotificationResources& notification_resources,
+    std::unique_ptr<DesktopNotificationDelegate> delegate,
+    base::Closure* cancel_callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(cancel_callback);
+
+  *cancel_callback = base::Bind(&LayoutTestNotificationManager::Close,
+                                weak_factory_.GetWeakPtr(), notification_id);
+
+  ReplaceNotificationIfNeeded(notification_id);
+
+  non_persistent_notifications_[notification_id] = std::move(delegate);
+  non_persistent_notifications_[notification_id]->NotificationDisplayed();
+
+  notification_id_map_[base::UTF16ToUTF8(notification_data.title)] =
+      notification_id;
+}
+
+void LayoutTestNotificationManager::DisplayPersistentNotification(
+    BrowserContext* browser_context,
+    const std::string& notification_id,
+    const GURL& service_worker_scope,
+    const GURL& origin,
+    const PlatformNotificationData& notification_data,
+    const NotificationResources& notification_resources) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  ReplaceNotificationIfNeeded(notification_id);
+
+  PersistentNotification notification;
+  notification.browser_context = browser_context;
+  notification.origin = origin;
+
+  persistent_notifications_[notification_id] = notification;
+
+  notification_id_map_[base::UTF16ToUTF8(notification_data.title)] =
+      notification_id;
+}
+
+void LayoutTestNotificationManager::ClosePersistentNotification(
+    BrowserContext* browser_context,
+    const std::string& notification_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  persistent_notifications_.erase(notification_id);
+}
+
+bool LayoutTestNotificationManager::GetDisplayedNotifications(
+    BrowserContext* browser_context,
+    std::set<std::string>* displayed_notifications) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(displayed_notifications);
+
+  // Notifications will never outlive the lifetime of running layout tests.
+  return false;
+}
+
+void LayoutTestNotificationManager::SimulateClick(
+    const std::string& title,
+    int action_index,
+    const base::NullableString16& reply) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  const auto notification_id_iter = notification_id_map_.find(title);
+  if (notification_id_iter == notification_id_map_.end())
+    return;
+
+  const std::string& notification_id = notification_id_iter->second;
+
+  const auto persistent_iter = persistent_notifications_.find(notification_id);
+  const auto non_persistent_iter =
+      non_persistent_notifications_.find(notification_id);
+
+  if (persistent_iter != persistent_notifications_.end()) {
+    DCHECK(non_persistent_iter == non_persistent_notifications_.end());
+
+    const PersistentNotification& notification = persistent_iter->second;
+    content::NotificationEventDispatcher::GetInstance()
+        ->DispatchNotificationClickEvent(
+            notification.browser_context, notification_id, notification.origin,
+            action_index, reply, base::Bind(&OnEventDispatchComplete));
+  } else if (non_persistent_iter != non_persistent_notifications_.end()) {
+    DCHECK_EQ(action_index, -1) << "Action buttons are only supported for "
+                                   "persistent notifications";
+
+    non_persistent_iter->second->NotificationClick();
+  }
+}
+
+void LayoutTestNotificationManager::SimulateClose(const std::string& title,
+                                                  bool by_user) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  const auto notification_id_iter = notification_id_map_.find(title);
+  if (notification_id_iter == notification_id_map_.end())
+    return;
+
+  const std::string& notification_id = notification_id_iter->second;
+
+  const auto& persistent_iter = persistent_notifications_.find(notification_id);
+  if (persistent_iter == persistent_notifications_.end())
+    return;
+
+  const PersistentNotification& notification = persistent_iter->second;
+  content::NotificationEventDispatcher::GetInstance()
+      ->DispatchNotificationCloseEvent(
+          notification.browser_context, notification_id, notification.origin,
+          by_user, base::Bind(&OnEventDispatchComplete));
+}
+
+blink::mojom::PermissionStatus
+LayoutTestNotificationManager::CheckPermissionOnUIThread(
+    BrowserContext* browser_context,
+    const GURL& origin,
+    int render_process_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  return CheckPermission(origin);
+}
+
+blink::mojom::PermissionStatus
+LayoutTestNotificationManager::CheckPermissionOnIOThread(
+    ResourceContext* resource_context,
+    const GURL& origin,
+    int render_process_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  return CheckPermission(origin);
+}
+
+void LayoutTestNotificationManager::Close(const std::string& notification_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  auto iterator = non_persistent_notifications_.find(notification_id);
+  if (iterator == non_persistent_notifications_.end())
+    return;
+
+  iterator->second->NotificationClosed();
+}
+
+void LayoutTestNotificationManager::ReplaceNotificationIfNeeded(
+    const std::string& notification_id) {
+  const auto persistent_iter = persistent_notifications_.find(notification_id);
+  const auto non_persistent_iter =
+      non_persistent_notifications_.find(notification_id);
+
+  if (persistent_iter != persistent_notifications_.end()) {
+    DCHECK(non_persistent_iter == non_persistent_notifications_.end());
+    persistent_notifications_.erase(persistent_iter);
+  } else if (non_persistent_iter != non_persistent_notifications_.end()) {
+    non_persistent_iter->second->NotificationClosed();
+    non_persistent_notifications_.erase(non_persistent_iter);
+  }
+}
 
 blink::mojom::PermissionStatus
 LayoutTestNotificationManager::CheckPermission(const GURL& origin) {
diff --git a/content/shell/browser/layout_test/layout_test_notification_manager.h b/content/shell/browser/layout_test/layout_test_notification_manager.h
index 658d0f7..25ce88f 100644
--- a/content/shell/browser/layout_test/layout_test_notification_manager.h
+++ b/content/shell/browser/layout_test/layout_test_notification_manager.h
@@ -5,10 +5,14 @@
 #ifndef CONTENT_SHELL_BROWSER_LAYOUT_TEST_LAYOUT_TEST_NOTIFICATION_MANAGER_H_
 #define CONTENT_SHELL_BROWSER_LAYOUT_TEST_LAYOUT_TEST_NOTIFICATION_MANAGER_H_
 
+#include <stdint.h>
 #include <string>
+#include <unordered_map>
 
+#include "base/callback.h"
 #include "base/macros.h"
-#include "content/test/mock_platform_notification_service.h"
+#include "base/memory/weak_ptr.h"
+#include "content/public/browser/platform_notification_service.h"
 #include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h"
 #include "url/gurl.h"
 
@@ -18,15 +22,87 @@
 
 namespace content {
 
+class DesktopNotificationDelegate;
+struct NotificationResources;
+struct PlatformNotificationData;
+
 // Responsible for tracking active notifications and allowed origins for the
 // Web Notification API when running layout tests.
-class LayoutTestNotificationManager : public MockPlatformNotificationService {
+class LayoutTestNotificationManager : public PlatformNotificationService {
  public:
   LayoutTestNotificationManager();
   ~LayoutTestNotificationManager() override;
 
+  // Simulates a click on the notification titled |title|. |action_index|
+  // indicates which action was clicked, or -1 if the main notification body was
+  // clicked. |reply| indicates the user reply, if any.
+  // Must be called on the UI thread.
+  void SimulateClick(const std::string& title,
+                     int action_index,
+                     const base::NullableString16& reply);
+
+  // Simulates the closing a notification titled |title|. Must be called on
+  // the UI thread.
+  void SimulateClose(const std::string& title, bool by_user);
+
+  // PlatformNotificationService implementation.
+  blink::mojom::PermissionStatus CheckPermissionOnUIThread(
+      BrowserContext* browser_context,
+      const GURL& origin,
+      int render_process_id) override;
+  blink::mojom::PermissionStatus CheckPermissionOnIOThread(
+      ResourceContext* resource_context,
+      const GURL& origin,
+      int render_process_id) override;
+  void DisplayNotification(
+      BrowserContext* browser_context,
+      const std::string& notification_id,
+      const GURL& origin,
+      const PlatformNotificationData& notification_data,
+      const NotificationResources& notification_resources,
+      std::unique_ptr<DesktopNotificationDelegate> delegate,
+      base::Closure* cancel_callback) override;
+  void DisplayPersistentNotification(
+      BrowserContext* browser_context,
+      const std::string& notification_id,
+      const GURL& service_worker_scope,
+      const GURL& origin,
+      const PlatformNotificationData& notification_data,
+      const NotificationResources& notification_resources) override;
+  void ClosePersistentNotification(BrowserContext* browser_context,
+                                   const std::string& notification_id) override;
+  bool GetDisplayedNotifications(
+      BrowserContext* browser_context,
+      std::set<std::string>* displayed_notifications) override;
+
  private:
-  blink::mojom::PermissionStatus CheckPermission(const GURL& origin) override;
+  // Structure to represent the information of a persistent notification.
+  struct PersistentNotification {
+    BrowserContext* browser_context = nullptr;
+    GURL origin;
+  };
+
+  // Closes the notification titled |title|. Must be called on the UI thread.
+  void Close(const std::string& title);
+
+  // Fakes replacing the notification identified by |notification_id|. Both
+  // persistent and non-persistent notifications will be considered for this.
+  void ReplaceNotificationIfNeeded(const std::string& notification_id);
+
+  // Checks if |origin| has permission to display notifications. May be called
+  // on both the IO and the UI threads.
+  blink::mojom::PermissionStatus CheckPermission(const GURL& origin);
+
+  std::unordered_map<std::string, PersistentNotification>
+      persistent_notifications_;
+  std::unordered_map<std::string, std::unique_ptr<DesktopNotificationDelegate>>
+      non_persistent_notifications_;
+
+  // Mapping of titles to notification ids giving test a usable identifier.
+  std::unordered_map<std::string, std::string> notification_id_map_;
+
+  base::WeakPtrFactory<LayoutTestNotificationManager> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(LayoutTestNotificationManager);
 };
 
diff --git a/content/shell/browser/layout_test/layout_test_permission_manager.cc b/content/shell/browser/layout_test/layout_test_permission_manager.cc
index c2324c0..94c6c4f 100644
--- a/content/shell/browser/layout_test/layout_test_permission_manager.cc
+++ b/content/shell/browser/layout_test/layout_test_permission_manager.cc
@@ -15,6 +15,7 @@
 #include "content/public/browser/permission_type.h"
 #include "content/public/browser/web_contents.h"
 #include "content/shell/browser/layout_test/layout_test_content_browser_client.h"
+#include "content/shell/browser/layout_test/layout_test_notification_manager.h"
 
 namespace content {
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 4a83870..02d9c0fe 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -167,8 +167,6 @@
     "mock_leveldb_database.h",
     "mock_permission_manager.cc",
     "mock_permission_manager.h",
-    "mock_platform_notification_service.cc",
-    "mock_platform_notification_service.h",
     "mock_render_process.cc",
     "mock_render_process.h",
     "mock_ssl_host_state_delegate.cc",
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 68a132f..72744530 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2482,4 +2482,4 @@
 crbug.com/698521 external/wpt/preload/preload-with-type.html [ Failure Pass ]
 
 # Sheriff failures 2017-03-10
-crbug.com/402805 [ Mac10.11 ] inspector-protocol/input/emulateTouchFromMouseEvent.html [ Timeout ]
+crbug.com/402805 [ Mac10.10 Mac10.11 ] inspector-protocol/input/emulateTouchFromMouseEvent.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/ranges/Range-surroundContents-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/ranges/Range-surroundContents-expected.txt
deleted file mode 100644
index 7ed3f13..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/ranges/Range-surroundContents-expected.txt
+++ /dev/null
@@ -1,1676 +0,0 @@
-This is a testharness.js-based test.
-Found 1672 tests; 1480 PASS, 192 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS 0,0: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0] 
-PASS 0,0: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0] 
-PASS 0,1: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0].firstChild 
-PASS 0,1: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0].firstChild 
-PASS 0,2: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[1].firstChild 
-PASS 0,2: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[1].firstChild 
-PASS 0,3: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignPara1 
-PASS 0,3: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignPara1 
-PASS 0,4: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignPara1.firstChild 
-PASS 0,4: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignPara1.firstChild 
-PASS 0,5: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedPara1 
-PASS 0,5: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedPara1 
-PASS 0,6: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedPara1.firstChild 
-PASS 0,6: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedPara1.firstChild 
-PASS 0,7: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node document 
-PASS 0,7: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node document 
-PASS 0,8: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedDiv 
-PASS 0,8: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedDiv 
-PASS 0,9: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignDoc 
-PASS 0,9: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignDoc 
-PASS 0,10: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignPara2 
-PASS 0,10: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignPara2 
-PASS 0,11: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node xmlDoc 
-PASS 0,11: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node xmlDoc 
-PASS 0,12: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node xmlElement 
-PASS 0,12: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node xmlElement 
-PASS 0,13: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedTextNode 
-PASS 0,13: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedTextNode 
-PASS 0,14: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignTextNode 
-PASS 0,14: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignTextNode 
-PASS 0,15: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node processingInstruction 
-PASS 0,15: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node processingInstruction 
-PASS 0,16: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedProcessingInstruction 
-PASS 0,16: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedProcessingInstruction 
-PASS 0,17: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node comment 
-PASS 0,17: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node comment 
-PASS 0,18: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedComment 
-PASS 0,18: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node detachedComment 
-PASS 0,19: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node docfrag 
-PASS 0,19: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node docfrag 
-PASS 0,20: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node doctype 
-PASS 0,20: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node doctype 
-PASS 0,21: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignDoctype 
-PASS 0,21: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignDoctype 
-PASS 1,0: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0] 
-PASS 1,0: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0] 
-PASS 1,1: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0].firstChild 
-PASS 1,1: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0].firstChild 
-PASS 1,2: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[1].firstChild 
-PASS 1,2: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[1].firstChild 
-PASS 1,3: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignPara1 
-PASS 1,3: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignPara1 
-PASS 1,4: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignPara1.firstChild 
-PASS 1,4: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignPara1.firstChild 
-PASS 1,5: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedPara1 
-PASS 1,5: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedPara1 
-PASS 1,6: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedPara1.firstChild 
-PASS 1,6: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedPara1.firstChild 
-PASS 1,7: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node document 
-PASS 1,7: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node document 
-PASS 1,8: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedDiv 
-PASS 1,8: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedDiv 
-PASS 1,9: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignDoc 
-PASS 1,9: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignDoc 
-PASS 1,10: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignPara2 
-PASS 1,10: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignPara2 
-PASS 1,11: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node xmlDoc 
-PASS 1,11: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node xmlDoc 
-PASS 1,12: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node xmlElement 
-PASS 1,12: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node xmlElement 
-PASS 1,13: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedTextNode 
-PASS 1,13: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedTextNode 
-PASS 1,14: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignTextNode 
-PASS 1,14: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignTextNode 
-PASS 1,15: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node processingInstruction 
-PASS 1,15: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node processingInstruction 
-PASS 1,16: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedProcessingInstruction 
-PASS 1,16: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedProcessingInstruction 
-PASS 1,17: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node comment 
-PASS 1,17: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node comment 
-PASS 1,18: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedComment 
-PASS 1,18: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node detachedComment 
-PASS 1,19: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node docfrag 
-PASS 1,19: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node docfrag 
-PASS 1,20: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node doctype 
-PASS 1,20: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node doctype 
-PASS 1,21: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignDoctype 
-PASS 1,21: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignDoctype 
-PASS 2,0: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0] 
-PASS 2,0: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0] 
-PASS 2,1: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0].firstChild 
-PASS 2,1: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0].firstChild 
-PASS 2,2: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[1].firstChild 
-PASS 2,2: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[1].firstChild 
-PASS 2,3: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignPara1 
-PASS 2,3: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignPara1 
-PASS 2,4: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignPara1.firstChild 
-PASS 2,4: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignPara1.firstChild 
-PASS 2,5: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedPara1 
-PASS 2,5: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedPara1 
-PASS 2,6: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedPara1.firstChild 
-PASS 2,6: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedPara1.firstChild 
-PASS 2,7: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node document 
-PASS 2,7: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node document 
-PASS 2,8: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedDiv 
-PASS 2,8: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedDiv 
-PASS 2,9: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignDoc 
-PASS 2,9: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignDoc 
-PASS 2,10: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignPara2 
-PASS 2,10: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignPara2 
-PASS 2,11: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node xmlDoc 
-PASS 2,11: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node xmlDoc 
-PASS 2,12: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node xmlElement 
-PASS 2,12: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node xmlElement 
-PASS 2,13: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedTextNode 
-PASS 2,13: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedTextNode 
-PASS 2,14: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignTextNode 
-PASS 2,14: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignTextNode 
-PASS 2,15: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node processingInstruction 
-PASS 2,15: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node processingInstruction 
-PASS 2,16: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedProcessingInstruction 
-PASS 2,16: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedProcessingInstruction 
-PASS 2,17: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node comment 
-PASS 2,17: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node comment 
-PASS 2,18: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedComment 
-PASS 2,18: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node detachedComment 
-PASS 2,19: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node docfrag 
-PASS 2,19: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node docfrag 
-PASS 2,20: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node doctype 
-PASS 2,20: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node doctype 
-PASS 2,21: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignDoctype 
-PASS 2,21: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignDoctype 
-PASS 3,0: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0] 
-PASS 3,0: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0] 
-PASS 3,1: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0].firstChild 
-PASS 3,1: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0].firstChild 
-PASS 3,2: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[1].firstChild 
-PASS 3,2: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[1].firstChild 
-PASS 3,3: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignPara1 
-PASS 3,3: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignPara1 
-PASS 3,4: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignPara1.firstChild 
-PASS 3,4: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignPara1.firstChild 
-PASS 3,5: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedPara1 
-PASS 3,5: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedPara1 
-PASS 3,6: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedPara1.firstChild 
-PASS 3,6: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedPara1.firstChild 
-PASS 3,7: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node document 
-PASS 3,7: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node document 
-PASS 3,8: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedDiv 
-PASS 3,8: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedDiv 
-PASS 3,9: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignDoc 
-PASS 3,9: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignDoc 
-PASS 3,10: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignPara2 
-PASS 3,10: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignPara2 
-PASS 3,11: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node xmlDoc 
-PASS 3,11: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node xmlDoc 
-PASS 3,12: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node xmlElement 
-PASS 3,12: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node xmlElement 
-PASS 3,13: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedTextNode 
-PASS 3,13: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedTextNode 
-PASS 3,14: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignTextNode 
-PASS 3,14: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignTextNode 
-PASS 3,15: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node processingInstruction 
-PASS 3,15: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node processingInstruction 
-PASS 3,16: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedProcessingInstruction 
-PASS 3,16: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedProcessingInstruction 
-PASS 3,17: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node comment 
-PASS 3,17: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node comment 
-PASS 3,18: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedComment 
-PASS 3,18: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node detachedComment 
-PASS 3,19: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node docfrag 
-PASS 3,19: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node docfrag 
-PASS 3,20: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node doctype 
-PASS 3,20: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node doctype 
-PASS 3,21: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignDoctype 
-PASS 3,21: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignDoctype 
-PASS 4,0: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[0] 
-PASS 4,0: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[0] 
-PASS 4,1: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
-PASS 4,1: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
-PASS 4,2: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
-PASS 4,2: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
-PASS 4,3: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara1 
-PASS 4,3: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara1 
-PASS 4,4: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara1.firstChild 
-PASS 4,4: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara1.firstChild 
-PASS 4,5: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedPara1 
-PASS 4,5: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedPara1 
-PASS 4,6: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedPara1.firstChild 
-PASS 4,6: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedPara1.firstChild 
-PASS 4,7: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node document 
-PASS 4,7: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node document 
-PASS 4,8: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedDiv 
-PASS 4,8: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedDiv 
-PASS 4,9: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignDoc 
-PASS 4,9: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignDoc 
-PASS 4,10: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara2 
-PASS 4,10: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara2 
-PASS 4,11: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node xmlDoc 
-PASS 4,11: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node xmlDoc 
-PASS 4,12: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node xmlElement 
-PASS 4,12: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node xmlElement 
-PASS 4,13: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedTextNode 
-PASS 4,13: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedTextNode 
-PASS 4,14: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignTextNode 
-PASS 4,14: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignTextNode 
-PASS 4,15: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node processingInstruction 
-PASS 4,15: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node processingInstruction 
-PASS 4,16: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedProcessingInstruction 
-PASS 4,16: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedProcessingInstruction 
-PASS 4,17: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node comment 
-PASS 4,17: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node comment 
-PASS 4,18: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedComment 
-PASS 4,18: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node detachedComment 
-PASS 4,19: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node docfrag 
-PASS 4,19: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node docfrag 
-PASS 4,20: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node doctype 
-PASS 4,20: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node doctype 
-PASS 4,21: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignDoctype 
-PASS 4,21: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignDoctype 
-PASS 5,0: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[0] 
-PASS 5,0: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[0] 
-PASS 5,1: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[0].firstChild 
-PASS 5,1: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[0].firstChild 
-PASS 5,2: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[1].firstChild 
-PASS 5,2: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[1].firstChild 
-PASS 5,3: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara1 
-PASS 5,3: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara1 
-PASS 5,4: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara1.firstChild 
-PASS 5,4: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara1.firstChild 
-PASS 5,5: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedPara1 
-PASS 5,5: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedPara1 
-PASS 5,6: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedPara1.firstChild 
-PASS 5,6: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedPara1.firstChild 
-PASS 5,7: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node document 
-PASS 5,7: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node document 
-PASS 5,8: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedDiv 
-PASS 5,8: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedDiv 
-PASS 5,9: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignDoc 
-PASS 5,9: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignDoc 
-PASS 5,10: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara2 
-PASS 5,10: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara2 
-PASS 5,11: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node xmlDoc 
-PASS 5,11: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node xmlDoc 
-PASS 5,12: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node xmlElement 
-PASS 5,12: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node xmlElement 
-PASS 5,13: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedTextNode 
-PASS 5,13: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedTextNode 
-PASS 5,14: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignTextNode 
-PASS 5,14: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignTextNode 
-PASS 5,15: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node processingInstruction 
-PASS 5,15: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node processingInstruction 
-PASS 5,16: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedProcessingInstruction 
-PASS 5,16: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedProcessingInstruction 
-PASS 5,17: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node comment 
-PASS 5,17: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node comment 
-PASS 5,18: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedComment 
-PASS 5,18: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node detachedComment 
-PASS 5,19: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node docfrag 
-PASS 5,19: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node docfrag 
-PASS 5,20: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node doctype 
-PASS 5,20: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node doctype 
-PASS 5,21: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignDoctype 
-PASS 5,21: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignDoctype 
-PASS 6,0: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node paras[0] 
-PASS 6,0: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node paras[0] 
-PASS 6,1: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node paras[0].firstChild 
-PASS 6,1: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node paras[0].firstChild 
-PASS 6,2: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node paras[1].firstChild 
-PASS 6,2: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node paras[1].firstChild 
-PASS 6,3: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignPara1 
-PASS 6,3: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignPara1 
-PASS 6,4: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignPara1.firstChild 
-PASS 6,4: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignPara1.firstChild 
-PASS 6,5: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1 
-PASS 6,5: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1 
-PASS 6,6: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1.firstChild 
-PASS 6,6: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1.firstChild 
-PASS 6,7: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node document 
-PASS 6,7: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node document 
-PASS 6,8: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedDiv 
-PASS 6,8: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedDiv 
-PASS 6,9: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignDoc 
-PASS 6,9: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignDoc 
-PASS 6,10: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignPara2 
-PASS 6,10: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignPara2 
-PASS 6,11: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node xmlDoc 
-PASS 6,11: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node xmlDoc 
-PASS 6,12: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node xmlElement 
-PASS 6,12: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node xmlElement 
-PASS 6,13: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedTextNode 
-PASS 6,13: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedTextNode 
-PASS 6,14: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignTextNode 
-PASS 6,14: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignTextNode 
-PASS 6,15: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node processingInstruction 
-PASS 6,15: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node processingInstruction 
-PASS 6,16: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedProcessingInstruction 
-PASS 6,16: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedProcessingInstruction 
-PASS 6,17: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node comment 
-PASS 6,17: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node comment 
-PASS 6,18: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedComment 
-PASS 6,18: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedComment 
-PASS 6,19: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node docfrag 
-PASS 6,19: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node docfrag 
-PASS 6,20: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node doctype 
-PASS 6,20: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node doctype 
-PASS 6,21: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignDoctype 
-PASS 6,21: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignDoctype 
-PASS 7,0: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node paras[0] 
-PASS 7,0: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node paras[0] 
-PASS 7,1: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node paras[0].firstChild 
-PASS 7,1: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node paras[0].firstChild 
-PASS 7,2: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node paras[1].firstChild 
-PASS 7,2: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node paras[1].firstChild 
-PASS 7,3: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignPara1 
-PASS 7,3: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignPara1 
-PASS 7,4: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignPara1.firstChild 
-PASS 7,4: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignPara1.firstChild 
-PASS 7,5: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1 
-PASS 7,5: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1 
-PASS 7,6: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1.firstChild 
-PASS 7,6: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1.firstChild 
-PASS 7,7: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node document 
-PASS 7,7: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node document 
-PASS 7,8: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedDiv 
-PASS 7,8: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedDiv 
-PASS 7,9: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignDoc 
-PASS 7,9: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignDoc 
-PASS 7,10: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignPara2 
-PASS 7,10: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignPara2 
-PASS 7,11: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node xmlDoc 
-PASS 7,11: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node xmlDoc 
-PASS 7,12: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node xmlElement 
-PASS 7,12: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node xmlElement 
-PASS 7,13: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedTextNode 
-PASS 7,13: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedTextNode 
-PASS 7,14: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignTextNode 
-PASS 7,14: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignTextNode 
-PASS 7,15: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node processingInstruction 
-PASS 7,15: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node processingInstruction 
-PASS 7,16: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedProcessingInstruction 
-PASS 7,16: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedProcessingInstruction 
-PASS 7,17: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node comment 
-PASS 7,17: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node comment 
-PASS 7,18: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedComment 
-PASS 7,18: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedComment 
-PASS 7,19: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node docfrag 
-PASS 7,19: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node docfrag 
-PASS 7,20: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node doctype 
-PASS 7,20: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node doctype 
-PASS 7,21: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignDoctype 
-PASS 7,21: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignDoctype 
-PASS 8,0: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node paras[0] 
-PASS 8,0: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node paras[0] 
-PASS 8,1: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node paras[0].firstChild 
-PASS 8,1: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node paras[0].firstChild 
-PASS 8,2: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node paras[1].firstChild 
-PASS 8,2: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node paras[1].firstChild 
-PASS 8,3: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1 
-PASS 8,3: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1 
-PASS 8,4: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1.firstChild 
-PASS 8,4: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1.firstChild 
-PASS 8,5: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedPara1 
-PASS 8,5: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedPara1 
-PASS 8,6: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedPara1.firstChild 
-PASS 8,6: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedPara1.firstChild 
-PASS 8,7: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node document 
-PASS 8,7: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node document 
-PASS 8,8: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedDiv 
-PASS 8,8: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedDiv 
-PASS 8,9: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignDoc 
-PASS 8,9: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignDoc 
-PASS 8,10: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara2 
-PASS 8,10: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara2 
-PASS 8,11: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node xmlDoc 
-PASS 8,11: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node xmlDoc 
-PASS 8,12: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node xmlElement 
-PASS 8,12: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node xmlElement 
-PASS 8,13: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedTextNode 
-PASS 8,13: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedTextNode 
-PASS 8,14: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignTextNode 
-PASS 8,14: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignTextNode 
-PASS 8,15: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node processingInstruction 
-PASS 8,15: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node processingInstruction 
-PASS 8,16: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedProcessingInstruction 
-PASS 8,16: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedProcessingInstruction 
-PASS 8,17: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node comment 
-PASS 8,17: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node comment 
-PASS 8,18: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedComment 
-PASS 8,18: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedComment 
-PASS 8,19: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node docfrag 
-PASS 8,19: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node docfrag 
-PASS 8,20: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node doctype 
-PASS 8,20: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node doctype 
-PASS 8,21: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignDoctype 
-PASS 8,21: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignDoctype 
-PASS 9,0: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node paras[0] 
-PASS 9,0: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node paras[0] 
-PASS 9,1: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node paras[0].firstChild 
-PASS 9,1: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node paras[0].firstChild 
-PASS 9,2: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node paras[1].firstChild 
-PASS 9,2: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node paras[1].firstChild 
-PASS 9,3: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1 
-PASS 9,3: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1 
-PASS 9,4: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1.firstChild 
-PASS 9,4: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1.firstChild 
-PASS 9,5: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedPara1 
-PASS 9,5: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedPara1 
-PASS 9,6: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedPara1.firstChild 
-PASS 9,6: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedPara1.firstChild 
-PASS 9,7: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node document 
-PASS 9,7: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node document 
-PASS 9,8: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedDiv 
-PASS 9,8: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedDiv 
-PASS 9,9: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignDoc 
-PASS 9,9: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignDoc 
-PASS 9,10: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara2 
-PASS 9,10: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara2 
-PASS 9,11: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node xmlDoc 
-PASS 9,11: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node xmlDoc 
-PASS 9,12: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node xmlElement 
-PASS 9,12: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node xmlElement 
-PASS 9,13: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedTextNode 
-PASS 9,13: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedTextNode 
-PASS 9,14: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignTextNode 
-PASS 9,14: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignTextNode 
-PASS 9,15: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node processingInstruction 
-PASS 9,15: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node processingInstruction 
-PASS 9,16: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedProcessingInstruction 
-PASS 9,16: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedProcessingInstruction 
-PASS 9,17: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node comment 
-PASS 9,17: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node comment 
-PASS 9,18: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedComment 
-PASS 9,18: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedComment 
-PASS 9,19: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node docfrag 
-PASS 9,19: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node docfrag 
-PASS 9,20: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node doctype 
-PASS 9,20: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node doctype 
-PASS 9,21: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignDoctype 
-PASS 9,21: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignDoctype 
-PASS 10,0: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node paras[0] 
-PASS 10,0: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node paras[0] 
-PASS 10,1: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node paras[0].firstChild 
-PASS 10,1: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node paras[0].firstChild 
-PASS 10,2: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node paras[1].firstChild 
-PASS 10,2: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node paras[1].firstChild 
-PASS 10,3: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node foreignPara1 
-PASS 10,3: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node foreignPara1 
-PASS 10,4: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node foreignPara1.firstChild 
-PASS 10,4: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node foreignPara1.firstChild 
-PASS 10,5: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node detachedPara1 
-PASS 10,5: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node detachedPara1 
-PASS 10,6: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node detachedPara1.firstChild 
-PASS 10,6: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node detachedPara1.firstChild 
-PASS 10,7: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node document 
-PASS 10,7: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node document 
-PASS 10,8: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node detachedDiv 
-PASS 10,8: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node detachedDiv 
-PASS 10,9: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node foreignDoc 
-PASS 10,9: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node foreignDoc 
-PASS 10,10: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node foreignPara2 
-PASS 10,10: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node foreignPara2 
-PASS 10,11: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node xmlDoc 
-PASS 10,11: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node xmlDoc 
-PASS 10,12: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node xmlElement 
-PASS 10,12: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node xmlElement 
-PASS 10,13: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node detachedTextNode 
-PASS 10,13: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node detachedTextNode 
-PASS 10,14: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node foreignTextNode 
-PASS 10,14: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node foreignTextNode 
-PASS 10,15: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node processingInstruction 
-PASS 10,15: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node processingInstruction 
-PASS 10,16: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node detachedProcessingInstruction 
-PASS 10,16: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node detachedProcessingInstruction 
-PASS 10,17: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node comment 
-PASS 10,17: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node comment 
-PASS 10,18: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node detachedComment 
-PASS 10,18: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node detachedComment 
-PASS 10,19: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node docfrag 
-PASS 10,19: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node docfrag 
-PASS 10,20: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node doctype 
-PASS 10,20: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node doctype 
-PASS 10,21: resulting DOM for range [document.documentElement, 0, document.documentElement, 1], node foreignDoctype 
-PASS 10,21: resulting range position for range [document.documentElement, 0, document.documentElement, 1], node foreignDoctype 
-PASS 11,0: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node paras[0] 
-PASS 11,0: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node paras[0] 
-PASS 11,1: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node paras[0].firstChild 
-PASS 11,1: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node paras[0].firstChild 
-PASS 11,2: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node paras[1].firstChild 
-PASS 11,2: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node paras[1].firstChild 
-PASS 11,3: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node foreignPara1 
-PASS 11,3: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node foreignPara1 
-PASS 11,4: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node foreignPara1.firstChild 
-PASS 11,4: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node foreignPara1.firstChild 
-PASS 11,5: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node detachedPara1 
-PASS 11,5: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node detachedPara1 
-PASS 11,6: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node detachedPara1.firstChild 
-PASS 11,6: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node detachedPara1.firstChild 
-PASS 11,7: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node document 
-PASS 11,7: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node document 
-PASS 11,8: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node detachedDiv 
-PASS 11,8: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node detachedDiv 
-PASS 11,9: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node foreignDoc 
-PASS 11,9: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node foreignDoc 
-PASS 11,10: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node foreignPara2 
-PASS 11,10: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node foreignPara2 
-PASS 11,11: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node xmlDoc 
-PASS 11,11: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node xmlDoc 
-PASS 11,12: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node xmlElement 
-PASS 11,12: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node xmlElement 
-PASS 11,13: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node detachedTextNode 
-PASS 11,13: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node detachedTextNode 
-PASS 11,14: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node foreignTextNode 
-PASS 11,14: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node foreignTextNode 
-PASS 11,15: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node processingInstruction 
-PASS 11,15: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node processingInstruction 
-PASS 11,16: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node detachedProcessingInstruction 
-PASS 11,16: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node detachedProcessingInstruction 
-PASS 11,17: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node comment 
-PASS 11,17: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node comment 
-PASS 11,18: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node detachedComment 
-PASS 11,18: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node detachedComment 
-PASS 11,19: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node docfrag 
-PASS 11,19: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node docfrag 
-PASS 11,20: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node doctype 
-PASS 11,20: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node doctype 
-PASS 11,21: resulting DOM for range [document.documentElement, 0, document.documentElement, 2], node foreignDoctype 
-PASS 11,21: resulting range position for range [document.documentElement, 0, document.documentElement, 2], node foreignDoctype 
-PASS 12,0: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node paras[0] 
-PASS 12,0: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node paras[0] 
-PASS 12,1: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node paras[0].firstChild 
-PASS 12,1: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node paras[0].firstChild 
-PASS 12,2: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node paras[1].firstChild 
-PASS 12,2: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node paras[1].firstChild 
-PASS 12,3: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node foreignPara1 
-PASS 12,3: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node foreignPara1 
-PASS 12,4: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node foreignPara1.firstChild 
-PASS 12,4: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node foreignPara1.firstChild 
-PASS 12,5: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node detachedPara1 
-PASS 12,5: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node detachedPara1 
-PASS 12,6: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node detachedPara1.firstChild 
-PASS 12,6: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node detachedPara1.firstChild 
-PASS 12,7: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node document 
-PASS 12,7: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node document 
-PASS 12,8: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node detachedDiv 
-PASS 12,8: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node detachedDiv 
-PASS 12,9: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node foreignDoc 
-PASS 12,9: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node foreignDoc 
-PASS 12,10: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node foreignPara2 
-PASS 12,10: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node foreignPara2 
-PASS 12,11: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node xmlDoc 
-PASS 12,11: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node xmlDoc 
-PASS 12,12: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node xmlElement 
-PASS 12,12: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node xmlElement 
-PASS 12,13: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node detachedTextNode 
-PASS 12,13: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node detachedTextNode 
-PASS 12,14: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node foreignTextNode 
-PASS 12,14: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node foreignTextNode 
-PASS 12,15: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node processingInstruction 
-PASS 12,15: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node processingInstruction 
-PASS 12,16: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node detachedProcessingInstruction 
-PASS 12,16: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node detachedProcessingInstruction 
-PASS 12,17: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node comment 
-PASS 12,17: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node comment 
-PASS 12,18: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node detachedComment 
-PASS 12,18: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node detachedComment 
-PASS 12,19: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node docfrag 
-PASS 12,19: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node docfrag 
-PASS 12,20: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node doctype 
-PASS 12,20: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node doctype 
-PASS 12,21: resulting DOM for range [document.documentElement, 1, document.documentElement, 2], node foreignDoctype 
-PASS 12,21: resulting range position for range [document.documentElement, 1, document.documentElement, 2], node foreignDoctype 
-PASS 13,0: resulting DOM for range [document.head, 1, document.head, 1], node paras[0] 
-PASS 13,0: resulting range position for range [document.head, 1, document.head, 1], node paras[0] 
-PASS 13,1: resulting DOM for range [document.head, 1, document.head, 1], node paras[0].firstChild 
-PASS 13,1: resulting range position for range [document.head, 1, document.head, 1], node paras[0].firstChild 
-PASS 13,2: resulting DOM for range [document.head, 1, document.head, 1], node paras[1].firstChild 
-PASS 13,2: resulting range position for range [document.head, 1, document.head, 1], node paras[1].firstChild 
-PASS 13,3: resulting DOM for range [document.head, 1, document.head, 1], node foreignPara1 
-PASS 13,3: resulting range position for range [document.head, 1, document.head, 1], node foreignPara1 
-PASS 13,4: resulting DOM for range [document.head, 1, document.head, 1], node foreignPara1.firstChild 
-PASS 13,4: resulting range position for range [document.head, 1, document.head, 1], node foreignPara1.firstChild 
-PASS 13,5: resulting DOM for range [document.head, 1, document.head, 1], node detachedPara1 
-PASS 13,5: resulting range position for range [document.head, 1, document.head, 1], node detachedPara1 
-PASS 13,6: resulting DOM for range [document.head, 1, document.head, 1], node detachedPara1.firstChild 
-PASS 13,6: resulting range position for range [document.head, 1, document.head, 1], node detachedPara1.firstChild 
-PASS 13,7: resulting DOM for range [document.head, 1, document.head, 1], node document 
-PASS 13,7: resulting range position for range [document.head, 1, document.head, 1], node document 
-PASS 13,8: resulting DOM for range [document.head, 1, document.head, 1], node detachedDiv 
-PASS 13,8: resulting range position for range [document.head, 1, document.head, 1], node detachedDiv 
-PASS 13,9: resulting DOM for range [document.head, 1, document.head, 1], node foreignDoc 
-PASS 13,9: resulting range position for range [document.head, 1, document.head, 1], node foreignDoc 
-PASS 13,10: resulting DOM for range [document.head, 1, document.head, 1], node foreignPara2 
-PASS 13,10: resulting range position for range [document.head, 1, document.head, 1], node foreignPara2 
-PASS 13,11: resulting DOM for range [document.head, 1, document.head, 1], node xmlDoc 
-PASS 13,11: resulting range position for range [document.head, 1, document.head, 1], node xmlDoc 
-PASS 13,12: resulting DOM for range [document.head, 1, document.head, 1], node xmlElement 
-PASS 13,12: resulting range position for range [document.head, 1, document.head, 1], node xmlElement 
-PASS 13,13: resulting DOM for range [document.head, 1, document.head, 1], node detachedTextNode 
-PASS 13,13: resulting range position for range [document.head, 1, document.head, 1], node detachedTextNode 
-PASS 13,14: resulting DOM for range [document.head, 1, document.head, 1], node foreignTextNode 
-PASS 13,14: resulting range position for range [document.head, 1, document.head, 1], node foreignTextNode 
-PASS 13,15: resulting DOM for range [document.head, 1, document.head, 1], node processingInstruction 
-PASS 13,15: resulting range position for range [document.head, 1, document.head, 1], node processingInstruction 
-PASS 13,16: resulting DOM for range [document.head, 1, document.head, 1], node detachedProcessingInstruction 
-PASS 13,16: resulting range position for range [document.head, 1, document.head, 1], node detachedProcessingInstruction 
-PASS 13,17: resulting DOM for range [document.head, 1, document.head, 1], node comment 
-PASS 13,17: resulting range position for range [document.head, 1, document.head, 1], node comment 
-PASS 13,18: resulting DOM for range [document.head, 1, document.head, 1], node detachedComment 
-PASS 13,18: resulting range position for range [document.head, 1, document.head, 1], node detachedComment 
-PASS 13,19: resulting DOM for range [document.head, 1, document.head, 1], node docfrag 
-PASS 13,19: resulting range position for range [document.head, 1, document.head, 1], node docfrag 
-PASS 13,20: resulting DOM for range [document.head, 1, document.head, 1], node doctype 
-PASS 13,20: resulting range position for range [document.head, 1, document.head, 1], node doctype 
-PASS 13,21: resulting DOM for range [document.head, 1, document.head, 1], node foreignDoctype 
-PASS 13,21: resulting range position for range [document.head, 1, document.head, 1], node foreignDoctype 
-PASS 14,0: resulting DOM for range [document.body, 4, document.body, 5], node paras[0] 
-PASS 14,0: resulting range position for range [document.body, 4, document.body, 5], node paras[0] 
-PASS 14,1: resulting DOM for range [document.body, 4, document.body, 5], node paras[0].firstChild 
-PASS 14,1: resulting range position for range [document.body, 4, document.body, 5], node paras[0].firstChild 
-PASS 14,2: resulting DOM for range [document.body, 4, document.body, 5], node paras[1].firstChild 
-PASS 14,2: resulting range position for range [document.body, 4, document.body, 5], node paras[1].firstChild 
-PASS 14,3: resulting DOM for range [document.body, 4, document.body, 5], node foreignPara1 
-PASS 14,3: resulting range position for range [document.body, 4, document.body, 5], node foreignPara1 
-PASS 14,4: resulting DOM for range [document.body, 4, document.body, 5], node foreignPara1.firstChild 
-PASS 14,4: resulting range position for range [document.body, 4, document.body, 5], node foreignPara1.firstChild 
-PASS 14,5: resulting DOM for range [document.body, 4, document.body, 5], node detachedPara1 
-PASS 14,5: resulting range position for range [document.body, 4, document.body, 5], node detachedPara1 
-PASS 14,6: resulting DOM for range [document.body, 4, document.body, 5], node detachedPara1.firstChild 
-PASS 14,6: resulting range position for range [document.body, 4, document.body, 5], node detachedPara1.firstChild 
-PASS 14,7: resulting DOM for range [document.body, 4, document.body, 5], node document 
-PASS 14,7: resulting range position for range [document.body, 4, document.body, 5], node document 
-PASS 14,8: resulting DOM for range [document.body, 4, document.body, 5], node detachedDiv 
-PASS 14,8: resulting range position for range [document.body, 4, document.body, 5], node detachedDiv 
-PASS 14,9: resulting DOM for range [document.body, 4, document.body, 5], node foreignDoc 
-PASS 14,9: resulting range position for range [document.body, 4, document.body, 5], node foreignDoc 
-PASS 14,10: resulting DOM for range [document.body, 4, document.body, 5], node foreignPara2 
-PASS 14,10: resulting range position for range [document.body, 4, document.body, 5], node foreignPara2 
-PASS 14,11: resulting DOM for range [document.body, 4, document.body, 5], node xmlDoc 
-PASS 14,11: resulting range position for range [document.body, 4, document.body, 5], node xmlDoc 
-PASS 14,12: resulting DOM for range [document.body, 4, document.body, 5], node xmlElement 
-PASS 14,12: resulting range position for range [document.body, 4, document.body, 5], node xmlElement 
-PASS 14,13: resulting DOM for range [document.body, 4, document.body, 5], node detachedTextNode 
-PASS 14,13: resulting range position for range [document.body, 4, document.body, 5], node detachedTextNode 
-PASS 14,14: resulting DOM for range [document.body, 4, document.body, 5], node foreignTextNode 
-PASS 14,14: resulting range position for range [document.body, 4, document.body, 5], node foreignTextNode 
-PASS 14,15: resulting DOM for range [document.body, 4, document.body, 5], node processingInstruction 
-PASS 14,15: resulting range position for range [document.body, 4, document.body, 5], node processingInstruction 
-PASS 14,16: resulting DOM for range [document.body, 4, document.body, 5], node detachedProcessingInstruction 
-PASS 14,16: resulting range position for range [document.body, 4, document.body, 5], node detachedProcessingInstruction 
-PASS 14,17: resulting DOM for range [document.body, 4, document.body, 5], node comment 
-PASS 14,17: resulting range position for range [document.body, 4, document.body, 5], node comment 
-PASS 14,18: resulting DOM for range [document.body, 4, document.body, 5], node detachedComment 
-PASS 14,18: resulting range position for range [document.body, 4, document.body, 5], node detachedComment 
-PASS 14,19: resulting DOM for range [document.body, 4, document.body, 5], node docfrag 
-PASS 14,19: resulting range position for range [document.body, 4, document.body, 5], node docfrag 
-PASS 14,20: resulting DOM for range [document.body, 4, document.body, 5], node doctype 
-PASS 14,20: resulting range position for range [document.body, 4, document.body, 5], node doctype 
-PASS 14,21: resulting DOM for range [document.body, 4, document.body, 5], node foreignDoctype 
-PASS 14,21: resulting range position for range [document.body, 4, document.body, 5], node foreignDoctype 
-PASS 15,0: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node paras[0] 
-PASS 15,0: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node paras[0] 
-PASS 15,1: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node paras[0].firstChild 
-PASS 15,1: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node paras[0].firstChild 
-PASS 15,2: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node paras[1].firstChild 
-PASS 15,2: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node paras[1].firstChild 
-PASS 15,3: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignPara1 
-PASS 15,3: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignPara1 
-PASS 15,4: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignPara1.firstChild 
-PASS 15,4: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignPara1.firstChild 
-PASS 15,5: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedPara1 
-PASS 15,5: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedPara1 
-PASS 15,6: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedPara1.firstChild 
-PASS 15,6: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedPara1.firstChild 
-PASS 15,7: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node document 
-PASS 15,7: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node document 
-PASS 15,8: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedDiv 
-PASS 15,8: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedDiv 
-PASS 15,9: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignDoc 
-PASS 15,9: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignDoc 
-PASS 15,10: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignPara2 
-PASS 15,10: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignPara2 
-PASS 15,11: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node xmlDoc 
-PASS 15,11: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node xmlDoc 
-PASS 15,12: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node xmlElement 
-PASS 15,12: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node xmlElement 
-PASS 15,13: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedTextNode 
-PASS 15,13: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedTextNode 
-PASS 15,14: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignTextNode 
-PASS 15,14: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignTextNode 
-PASS 15,15: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node processingInstruction 
-PASS 15,15: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node processingInstruction 
-PASS 15,16: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedProcessingInstruction 
-PASS 15,16: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedProcessingInstruction 
-PASS 15,17: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node comment 
-PASS 15,17: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node comment 
-PASS 15,18: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedComment 
-PASS 15,18: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node detachedComment 
-PASS 15,19: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node docfrag 
-PASS 15,19: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node docfrag 
-PASS 15,20: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node doctype 
-PASS 15,20: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node doctype 
-PASS 15,21: resulting DOM for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignDoctype 
-PASS 15,21: resulting range position for range [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1], node foreignDoctype 
-PASS 16,0: resulting DOM for range [paras[0], 0, paras[0], 1], node paras[0] 
-PASS 16,0: resulting range position for range [paras[0], 0, paras[0], 1], node paras[0] 
-PASS 16,1: resulting DOM for range [paras[0], 0, paras[0], 1], node paras[0].firstChild 
-PASS 16,1: resulting range position for range [paras[0], 0, paras[0], 1], node paras[0].firstChild 
-PASS 16,2: resulting DOM for range [paras[0], 0, paras[0], 1], node paras[1].firstChild 
-PASS 16,2: resulting range position for range [paras[0], 0, paras[0], 1], node paras[1].firstChild 
-PASS 16,3: resulting DOM for range [paras[0], 0, paras[0], 1], node foreignPara1 
-PASS 16,3: resulting range position for range [paras[0], 0, paras[0], 1], node foreignPara1 
-PASS 16,4: resulting DOM for range [paras[0], 0, paras[0], 1], node foreignPara1.firstChild 
-PASS 16,4: resulting range position for range [paras[0], 0, paras[0], 1], node foreignPara1.firstChild 
-PASS 16,5: resulting DOM for range [paras[0], 0, paras[0], 1], node detachedPara1 
-PASS 16,5: resulting range position for range [paras[0], 0, paras[0], 1], node detachedPara1 
-PASS 16,6: resulting DOM for range [paras[0], 0, paras[0], 1], node detachedPara1.firstChild 
-PASS 16,6: resulting range position for range [paras[0], 0, paras[0], 1], node detachedPara1.firstChild 
-PASS 16,7: resulting DOM for range [paras[0], 0, paras[0], 1], node document 
-PASS 16,7: resulting range position for range [paras[0], 0, paras[0], 1], node document 
-PASS 16,8: resulting DOM for range [paras[0], 0, paras[0], 1], node detachedDiv 
-PASS 16,8: resulting range position for range [paras[0], 0, paras[0], 1], node detachedDiv 
-PASS 16,9: resulting DOM for range [paras[0], 0, paras[0], 1], node foreignDoc 
-PASS 16,9: resulting range position for range [paras[0], 0, paras[0], 1], node foreignDoc 
-PASS 16,10: resulting DOM for range [paras[0], 0, paras[0], 1], node foreignPara2 
-PASS 16,10: resulting range position for range [paras[0], 0, paras[0], 1], node foreignPara2 
-PASS 16,11: resulting DOM for range [paras[0], 0, paras[0], 1], node xmlDoc 
-PASS 16,11: resulting range position for range [paras[0], 0, paras[0], 1], node xmlDoc 
-PASS 16,12: resulting DOM for range [paras[0], 0, paras[0], 1], node xmlElement 
-PASS 16,12: resulting range position for range [paras[0], 0, paras[0], 1], node xmlElement 
-PASS 16,13: resulting DOM for range [paras[0], 0, paras[0], 1], node detachedTextNode 
-PASS 16,13: resulting range position for range [paras[0], 0, paras[0], 1], node detachedTextNode 
-PASS 16,14: resulting DOM for range [paras[0], 0, paras[0], 1], node foreignTextNode 
-PASS 16,14: resulting range position for range [paras[0], 0, paras[0], 1], node foreignTextNode 
-PASS 16,15: resulting DOM for range [paras[0], 0, paras[0], 1], node processingInstruction 
-PASS 16,15: resulting range position for range [paras[0], 0, paras[0], 1], node processingInstruction 
-PASS 16,16: resulting DOM for range [paras[0], 0, paras[0], 1], node detachedProcessingInstruction 
-PASS 16,16: resulting range position for range [paras[0], 0, paras[0], 1], node detachedProcessingInstruction 
-PASS 16,17: resulting DOM for range [paras[0], 0, paras[0], 1], node comment 
-PASS 16,17: resulting range position for range [paras[0], 0, paras[0], 1], node comment 
-PASS 16,18: resulting DOM for range [paras[0], 0, paras[0], 1], node detachedComment 
-PASS 16,18: resulting range position for range [paras[0], 0, paras[0], 1], node detachedComment 
-PASS 16,19: resulting DOM for range [paras[0], 0, paras[0], 1], node docfrag 
-PASS 16,19: resulting range position for range [paras[0], 0, paras[0], 1], node docfrag 
-PASS 16,20: resulting DOM for range [paras[0], 0, paras[0], 1], node doctype 
-PASS 16,20: resulting range position for range [paras[0], 0, paras[0], 1], node doctype 
-PASS 16,21: resulting DOM for range [paras[0], 0, paras[0], 1], node foreignDoctype 
-PASS 16,21: resulting range position for range [paras[0], 0, paras[0], 1], node foreignDoctype 
-PASS 17,0: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node paras[0] 
-PASS 17,0: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node paras[0] 
-PASS 17,1: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node paras[0].firstChild 
-PASS 17,1: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node paras[0].firstChild 
-PASS 17,2: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node paras[1].firstChild 
-PASS 17,2: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node paras[1].firstChild 
-PASS 17,3: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node foreignPara1 
-PASS 17,3: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node foreignPara1 
-PASS 17,4: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node foreignPara1.firstChild 
-PASS 17,4: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node foreignPara1.firstChild 
-PASS 17,5: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node detachedPara1 
-PASS 17,5: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node detachedPara1 
-PASS 17,6: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node detachedPara1.firstChild 
-PASS 17,6: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node detachedPara1.firstChild 
-PASS 17,7: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node document 
-PASS 17,7: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node document 
-PASS 17,8: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node detachedDiv 
-PASS 17,8: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node detachedDiv 
-PASS 17,9: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node foreignDoc 
-PASS 17,9: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node foreignDoc 
-PASS 17,10: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node foreignPara2 
-PASS 17,10: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node foreignPara2 
-PASS 17,11: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node xmlDoc 
-PASS 17,11: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node xmlDoc 
-PASS 17,12: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node xmlElement 
-PASS 17,12: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node xmlElement 
-PASS 17,13: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node detachedTextNode 
-PASS 17,13: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node detachedTextNode 
-PASS 17,14: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node foreignTextNode 
-PASS 17,14: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node foreignTextNode 
-PASS 17,15: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node processingInstruction 
-PASS 17,15: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node processingInstruction 
-PASS 17,16: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node detachedProcessingInstruction 
-PASS 17,16: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node detachedProcessingInstruction 
-PASS 17,17: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node comment 
-PASS 17,17: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node comment 
-PASS 17,18: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node detachedComment 
-PASS 17,18: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node detachedComment 
-PASS 17,19: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node docfrag 
-PASS 17,19: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node docfrag 
-PASS 17,20: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node doctype 
-PASS 17,20: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node doctype 
-PASS 17,21: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node foreignDoctype 
-PASS 17,21: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node foreignDoctype 
-PASS 18,0: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0] 
-PASS 18,0: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0] 
-PASS 18,1: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
-PASS 18,1: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
-PASS 18,2: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
-PASS 18,2: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
-PASS 18,3: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignPara1 
-PASS 18,3: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignPara1 
-PASS 18,4: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignPara1.firstChild 
-PASS 18,4: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignPara1.firstChild 
-PASS 18,5: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedPara1 
-PASS 18,5: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedPara1 
-PASS 18,6: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedPara1.firstChild 
-PASS 18,6: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedPara1.firstChild 
-PASS 18,7: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node document 
-PASS 18,7: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node document 
-PASS 18,8: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedDiv 
-PASS 18,8: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedDiv 
-PASS 18,9: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignDoc 
-PASS 18,9: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignDoc 
-PASS 18,10: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignPara2 
-PASS 18,10: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignPara2 
-PASS 18,11: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node xmlDoc 
-PASS 18,11: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node xmlDoc 
-PASS 18,12: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node xmlElement 
-PASS 18,12: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node xmlElement 
-PASS 18,13: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedTextNode 
-PASS 18,13: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedTextNode 
-PASS 18,14: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignTextNode 
-PASS 18,14: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignTextNode 
-PASS 18,15: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node processingInstruction 
-PASS 18,15: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node processingInstruction 
-PASS 18,16: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedProcessingInstruction 
-PASS 18,16: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedProcessingInstruction 
-PASS 18,17: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node comment 
-PASS 18,17: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node comment 
-PASS 18,18: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedComment 
-PASS 18,18: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node detachedComment 
-PASS 18,19: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node docfrag 
-PASS 18,19: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node docfrag 
-PASS 18,20: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node doctype 
-PASS 18,20: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node doctype 
-PASS 18,21: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignDoctype 
-PASS 18,21: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignDoctype 
-PASS 19,0: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0] 
-PASS 19,0: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0] 
-PASS 19,1: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0].firstChild 
-PASS 19,1: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0].firstChild 
-PASS 19,2: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[1].firstChild 
-PASS 19,2: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[1].firstChild 
-PASS 19,3: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignPara1 
-PASS 19,3: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignPara1 
-PASS 19,4: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignPara1.firstChild 
-PASS 19,4: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignPara1.firstChild 
-PASS 19,5: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedPara1 
-PASS 19,5: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedPara1 
-PASS 19,6: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedPara1.firstChild 
-PASS 19,6: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedPara1.firstChild 
-PASS 19,7: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node document 
-PASS 19,7: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node document 
-PASS 19,8: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedDiv 
-PASS 19,8: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedDiv 
-PASS 19,9: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignDoc 
-PASS 19,9: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignDoc 
-PASS 19,10: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignPara2 
-PASS 19,10: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignPara2 
-PASS 19,11: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node xmlDoc 
-PASS 19,11: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node xmlDoc 
-PASS 19,12: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node xmlElement 
-PASS 19,12: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node xmlElement 
-PASS 19,13: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedTextNode 
-PASS 19,13: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedTextNode 
-PASS 19,14: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignTextNode 
-PASS 19,14: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignTextNode 
-PASS 19,15: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node processingInstruction 
-PASS 19,15: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node processingInstruction 
-PASS 19,16: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedProcessingInstruction 
-PASS 19,16: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedProcessingInstruction 
-PASS 19,17: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node comment 
-PASS 19,17: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node comment 
-PASS 19,18: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedComment 
-PASS 19,18: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node detachedComment 
-PASS 19,19: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node docfrag 
-PASS 19,19: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node docfrag 
-PASS 19,20: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node doctype 
-PASS 19,20: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node doctype 
-PASS 19,21: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignDoctype 
-PASS 19,21: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignDoctype 
-PASS 20,0: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node paras[0] 
-PASS 20,0: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node paras[0] 
-PASS 20,1: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node paras[0].firstChild 
-PASS 20,1: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node paras[0].firstChild 
-PASS 20,2: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node paras[1].firstChild 
-PASS 20,2: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node paras[1].firstChild 
-PASS 20,3: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node foreignPara1 
-PASS 20,3: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node foreignPara1 
-PASS 20,4: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node foreignPara1.firstChild 
-PASS 20,4: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node foreignPara1.firstChild 
-PASS 20,5: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node detachedPara1 
-PASS 20,5: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node detachedPara1 
-PASS 20,6: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node detachedPara1.firstChild 
-PASS 20,6: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node detachedPara1.firstChild 
-PASS 20,7: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node document 
-PASS 20,7: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node document 
-PASS 20,8: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node detachedDiv 
-PASS 20,8: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node detachedDiv 
-PASS 20,9: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node foreignDoc 
-PASS 20,9: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node foreignDoc 
-PASS 20,10: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node foreignPara2 
-PASS 20,10: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node foreignPara2 
-PASS 20,11: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node xmlDoc 
-PASS 20,11: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node xmlDoc 
-PASS 20,12: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node xmlElement 
-PASS 20,12: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node xmlElement 
-PASS 20,13: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node detachedTextNode 
-PASS 20,13: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node detachedTextNode 
-PASS 20,14: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node foreignTextNode 
-PASS 20,14: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node foreignTextNode 
-PASS 20,15: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node processingInstruction 
-PASS 20,15: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node processingInstruction 
-PASS 20,16: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node detachedProcessingInstruction 
-PASS 20,16: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node detachedProcessingInstruction 
-PASS 20,17: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node comment 
-PASS 20,17: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node comment 
-PASS 20,18: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node detachedComment 
-PASS 20,18: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node detachedComment 
-PASS 20,19: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node docfrag 
-PASS 20,19: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node docfrag 
-PASS 20,20: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node doctype 
-PASS 20,20: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node doctype 
-PASS 20,21: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node foreignDoctype 
-PASS 20,21: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node foreignDoctype 
-PASS 21,0: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node paras[0] 
-PASS 21,0: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node paras[0] 
-PASS 21,1: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node paras[0].firstChild 
-PASS 21,1: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node paras[0].firstChild 
-PASS 21,2: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node paras[1].firstChild 
-PASS 21,2: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node paras[1].firstChild 
-PASS 21,3: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node foreignPara1 
-PASS 21,3: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node foreignPara1 
-PASS 21,4: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node foreignPara1.firstChild 
-PASS 21,4: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node foreignPara1.firstChild 
-PASS 21,5: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node detachedPara1 
-PASS 21,5: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node detachedPara1 
-PASS 21,6: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node detachedPara1.firstChild 
-PASS 21,6: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node detachedPara1.firstChild 
-PASS 21,7: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node document 
-PASS 21,7: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node document 
-PASS 21,8: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node detachedDiv 
-PASS 21,8: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node detachedDiv 
-PASS 21,9: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node foreignDoc 
-PASS 21,9: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node foreignDoc 
-PASS 21,10: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node foreignPara2 
-PASS 21,10: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node foreignPara2 
-PASS 21,11: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node xmlDoc 
-PASS 21,11: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node xmlDoc 
-PASS 21,12: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node xmlElement 
-PASS 21,12: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node xmlElement 
-PASS 21,13: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node detachedTextNode 
-PASS 21,13: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node detachedTextNode 
-PASS 21,14: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node foreignTextNode 
-PASS 21,14: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node foreignTextNode 
-PASS 21,15: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node processingInstruction 
-PASS 21,15: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node processingInstruction 
-PASS 21,16: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node detachedProcessingInstruction 
-PASS 21,16: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node detachedProcessingInstruction 
-PASS 21,17: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node comment 
-PASS 21,17: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node comment 
-PASS 21,18: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node detachedComment 
-PASS 21,18: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node detachedComment 
-PASS 21,19: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node docfrag 
-PASS 21,19: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node docfrag 
-PASS 21,20: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node doctype 
-PASS 21,20: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node doctype 
-PASS 21,21: resulting DOM for range [paras[0], 0, paras[0].firstChild, 7], node foreignDoctype 
-PASS 21,21: resulting range position for range [paras[0], 0, paras[0].firstChild, 7], node foreignDoctype 
-PASS 22,0: resulting DOM for range [testDiv, 2, paras[4], 1], node paras[0] 
-PASS 22,0: resulting range position for range [testDiv, 2, paras[4], 1], node paras[0] 
-PASS 22,1: resulting DOM for range [testDiv, 2, paras[4], 1], node paras[0].firstChild 
-PASS 22,1: resulting range position for range [testDiv, 2, paras[4], 1], node paras[0].firstChild 
-PASS 22,2: resulting DOM for range [testDiv, 2, paras[4], 1], node paras[1].firstChild 
-PASS 22,2: resulting range position for range [testDiv, 2, paras[4], 1], node paras[1].firstChild 
-PASS 22,3: resulting DOM for range [testDiv, 2, paras[4], 1], node foreignPara1 
-PASS 22,3: resulting range position for range [testDiv, 2, paras[4], 1], node foreignPara1 
-PASS 22,4: resulting DOM for range [testDiv, 2, paras[4], 1], node foreignPara1.firstChild 
-PASS 22,4: resulting range position for range [testDiv, 2, paras[4], 1], node foreignPara1.firstChild 
-PASS 22,5: resulting DOM for range [testDiv, 2, paras[4], 1], node detachedPara1 
-PASS 22,5: resulting range position for range [testDiv, 2, paras[4], 1], node detachedPara1 
-PASS 22,6: resulting DOM for range [testDiv, 2, paras[4], 1], node detachedPara1.firstChild 
-PASS 22,6: resulting range position for range [testDiv, 2, paras[4], 1], node detachedPara1.firstChild 
-PASS 22,7: resulting DOM for range [testDiv, 2, paras[4], 1], node document 
-PASS 22,7: resulting range position for range [testDiv, 2, paras[4], 1], node document 
-PASS 22,8: resulting DOM for range [testDiv, 2, paras[4], 1], node detachedDiv 
-PASS 22,8: resulting range position for range [testDiv, 2, paras[4], 1], node detachedDiv 
-PASS 22,9: resulting DOM for range [testDiv, 2, paras[4], 1], node foreignDoc 
-PASS 22,9: resulting range position for range [testDiv, 2, paras[4], 1], node foreignDoc 
-PASS 22,10: resulting DOM for range [testDiv, 2, paras[4], 1], node foreignPara2 
-PASS 22,10: resulting range position for range [testDiv, 2, paras[4], 1], node foreignPara2 
-PASS 22,11: resulting DOM for range [testDiv, 2, paras[4], 1], node xmlDoc 
-PASS 22,11: resulting range position for range [testDiv, 2, paras[4], 1], node xmlDoc 
-PASS 22,12: resulting DOM for range [testDiv, 2, paras[4], 1], node xmlElement 
-PASS 22,12: resulting range position for range [testDiv, 2, paras[4], 1], node xmlElement 
-PASS 22,13: resulting DOM for range [testDiv, 2, paras[4], 1], node detachedTextNode 
-PASS 22,13: resulting range position for range [testDiv, 2, paras[4], 1], node detachedTextNode 
-PASS 22,14: resulting DOM for range [testDiv, 2, paras[4], 1], node foreignTextNode 
-PASS 22,14: resulting range position for range [testDiv, 2, paras[4], 1], node foreignTextNode 
-PASS 22,15: resulting DOM for range [testDiv, 2, paras[4], 1], node processingInstruction 
-PASS 22,15: resulting range position for range [testDiv, 2, paras[4], 1], node processingInstruction 
-PASS 22,16: resulting DOM for range [testDiv, 2, paras[4], 1], node detachedProcessingInstruction 
-PASS 22,16: resulting range position for range [testDiv, 2, paras[4], 1], node detachedProcessingInstruction 
-PASS 22,17: resulting DOM for range [testDiv, 2, paras[4], 1], node comment 
-PASS 22,17: resulting range position for range [testDiv, 2, paras[4], 1], node comment 
-PASS 22,18: resulting DOM for range [testDiv, 2, paras[4], 1], node detachedComment 
-PASS 22,18: resulting range position for range [testDiv, 2, paras[4], 1], node detachedComment 
-PASS 22,19: resulting DOM for range [testDiv, 2, paras[4], 1], node docfrag 
-PASS 22,19: resulting range position for range [testDiv, 2, paras[4], 1], node docfrag 
-PASS 22,20: resulting DOM for range [testDiv, 2, paras[4], 1], node doctype 
-PASS 22,20: resulting range position for range [testDiv, 2, paras[4], 1], node doctype 
-PASS 22,21: resulting DOM for range [testDiv, 2, paras[4], 1], node foreignDoctype 
-PASS 22,21: resulting range position for range [testDiv, 2, paras[4], 1], node foreignDoctype 
-PASS 23,0: resulting DOM for range [document, 0, document, 1], node paras[0] 
-PASS 23,0: resulting range position for range [document, 0, document, 1], node paras[0] 
-PASS 23,1: resulting DOM for range [document, 0, document, 1], node paras[0].firstChild 
-PASS 23,1: resulting range position for range [document, 0, document, 1], node paras[0].firstChild 
-PASS 23,2: resulting DOM for range [document, 0, document, 1], node paras[1].firstChild 
-PASS 23,2: resulting range position for range [document, 0, document, 1], node paras[1].firstChild 
-PASS 23,3: resulting DOM for range [document, 0, document, 1], node foreignPara1 
-PASS 23,3: resulting range position for range [document, 0, document, 1], node foreignPara1 
-PASS 23,4: resulting DOM for range [document, 0, document, 1], node foreignPara1.firstChild 
-PASS 23,4: resulting range position for range [document, 0, document, 1], node foreignPara1.firstChild 
-PASS 23,5: resulting DOM for range [document, 0, document, 1], node detachedPara1 
-PASS 23,5: resulting range position for range [document, 0, document, 1], node detachedPara1 
-PASS 23,6: resulting DOM for range [document, 0, document, 1], node detachedPara1.firstChild 
-PASS 23,6: resulting range position for range [document, 0, document, 1], node detachedPara1.firstChild 
-PASS 23,7: resulting DOM for range [document, 0, document, 1], node document 
-PASS 23,7: resulting range position for range [document, 0, document, 1], node document 
-PASS 23,8: resulting DOM for range [document, 0, document, 1], node detachedDiv 
-PASS 23,8: resulting range position for range [document, 0, document, 1], node detachedDiv 
-PASS 23,9: resulting DOM for range [document, 0, document, 1], node foreignDoc 
-PASS 23,9: resulting range position for range [document, 0, document, 1], node foreignDoc 
-PASS 23,10: resulting DOM for range [document, 0, document, 1], node foreignPara2 
-PASS 23,10: resulting range position for range [document, 0, document, 1], node foreignPara2 
-PASS 23,11: resulting DOM for range [document, 0, document, 1], node xmlDoc 
-PASS 23,11: resulting range position for range [document, 0, document, 1], node xmlDoc 
-PASS 23,12: resulting DOM for range [document, 0, document, 1], node xmlElement 
-PASS 23,12: resulting range position for range [document, 0, document, 1], node xmlElement 
-PASS 23,13: resulting DOM for range [document, 0, document, 1], node detachedTextNode 
-PASS 23,13: resulting range position for range [document, 0, document, 1], node detachedTextNode 
-PASS 23,14: resulting DOM for range [document, 0, document, 1], node foreignTextNode 
-PASS 23,14: resulting range position for range [document, 0, document, 1], node foreignTextNode 
-PASS 23,15: resulting DOM for range [document, 0, document, 1], node processingInstruction 
-PASS 23,15: resulting range position for range [document, 0, document, 1], node processingInstruction 
-PASS 23,16: resulting DOM for range [document, 0, document, 1], node detachedProcessingInstruction 
-PASS 23,16: resulting range position for range [document, 0, document, 1], node detachedProcessingInstruction 
-PASS 23,17: resulting DOM for range [document, 0, document, 1], node comment 
-PASS 23,17: resulting range position for range [document, 0, document, 1], node comment 
-PASS 23,18: resulting DOM for range [document, 0, document, 1], node detachedComment 
-PASS 23,18: resulting range position for range [document, 0, document, 1], node detachedComment 
-PASS 23,19: resulting DOM for range [document, 0, document, 1], node docfrag 
-PASS 23,19: resulting range position for range [document, 0, document, 1], node docfrag 
-PASS 23,20: resulting DOM for range [document, 0, document, 1], node doctype 
-PASS 23,20: resulting range position for range [document, 0, document, 1], node doctype 
-PASS 23,21: resulting DOM for range [document, 0, document, 1], node foreignDoctype 
-PASS 23,21: resulting range position for range [document, 0, document, 1], node foreignDoctype 
-PASS 24,0: resulting DOM for range [document, 0, document, 2], node paras[0] 
-PASS 24,0: resulting range position for range [document, 0, document, 2], node paras[0] 
-PASS 24,1: resulting DOM for range [document, 0, document, 2], node paras[0].firstChild 
-PASS 24,1: resulting range position for range [document, 0, document, 2], node paras[0].firstChild 
-PASS 24,2: resulting DOM for range [document, 0, document, 2], node paras[1].firstChild 
-PASS 24,2: resulting range position for range [document, 0, document, 2], node paras[1].firstChild 
-PASS 24,3: resulting DOM for range [document, 0, document, 2], node foreignPara1 
-PASS 24,3: resulting range position for range [document, 0, document, 2], node foreignPara1 
-PASS 24,4: resulting DOM for range [document, 0, document, 2], node foreignPara1.firstChild 
-PASS 24,4: resulting range position for range [document, 0, document, 2], node foreignPara1.firstChild 
-PASS 24,5: resulting DOM for range [document, 0, document, 2], node detachedPara1 
-PASS 24,5: resulting range position for range [document, 0, document, 2], node detachedPara1 
-PASS 24,6: resulting DOM for range [document, 0, document, 2], node detachedPara1.firstChild 
-PASS 24,6: resulting range position for range [document, 0, document, 2], node detachedPara1.firstChild 
-PASS 24,7: resulting DOM for range [document, 0, document, 2], node document 
-PASS 24,7: resulting range position for range [document, 0, document, 2], node document 
-PASS 24,8: resulting DOM for range [document, 0, document, 2], node detachedDiv 
-PASS 24,8: resulting range position for range [document, 0, document, 2], node detachedDiv 
-PASS 24,9: resulting DOM for range [document, 0, document, 2], node foreignDoc 
-PASS 24,9: resulting range position for range [document, 0, document, 2], node foreignDoc 
-PASS 24,10: resulting DOM for range [document, 0, document, 2], node foreignPara2 
-PASS 24,10: resulting range position for range [document, 0, document, 2], node foreignPara2 
-PASS 24,11: resulting DOM for range [document, 0, document, 2], node xmlDoc 
-PASS 24,11: resulting range position for range [document, 0, document, 2], node xmlDoc 
-PASS 24,12: resulting DOM for range [document, 0, document, 2], node xmlElement 
-PASS 24,12: resulting range position for range [document, 0, document, 2], node xmlElement 
-PASS 24,13: resulting DOM for range [document, 0, document, 2], node detachedTextNode 
-PASS 24,13: resulting range position for range [document, 0, document, 2], node detachedTextNode 
-PASS 24,14: resulting DOM for range [document, 0, document, 2], node foreignTextNode 
-PASS 24,14: resulting range position for range [document, 0, document, 2], node foreignTextNode 
-PASS 24,15: resulting DOM for range [document, 0, document, 2], node processingInstruction 
-PASS 24,15: resulting range position for range [document, 0, document, 2], node processingInstruction 
-PASS 24,16: resulting DOM for range [document, 0, document, 2], node detachedProcessingInstruction 
-PASS 24,16: resulting range position for range [document, 0, document, 2], node detachedProcessingInstruction 
-PASS 24,17: resulting DOM for range [document, 0, document, 2], node comment 
-PASS 24,17: resulting range position for range [document, 0, document, 2], node comment 
-PASS 24,18: resulting DOM for range [document, 0, document, 2], node detachedComment 
-PASS 24,18: resulting range position for range [document, 0, document, 2], node detachedComment 
-PASS 24,19: resulting DOM for range [document, 0, document, 2], node docfrag 
-PASS 24,19: resulting range position for range [document, 0, document, 2], node docfrag 
-PASS 24,20: resulting DOM for range [document, 0, document, 2], node doctype 
-PASS 24,20: resulting range position for range [document, 0, document, 2], node doctype 
-PASS 24,21: resulting DOM for range [document, 0, document, 2], node foreignDoctype 
-PASS 24,21: resulting range position for range [document, 0, document, 2], node foreignDoctype 
-PASS 25,0: resulting DOM for range [comment, 2, comment, 3], node paras[0] 
-PASS 25,0: resulting range position for range [comment, 2, comment, 3], node paras[0] 
-PASS 25,1: resulting DOM for range [comment, 2, comment, 3], node paras[0].firstChild 
-PASS 25,1: resulting range position for range [comment, 2, comment, 3], node paras[0].firstChild 
-PASS 25,2: resulting DOM for range [comment, 2, comment, 3], node paras[1].firstChild 
-PASS 25,2: resulting range position for range [comment, 2, comment, 3], node paras[1].firstChild 
-PASS 25,3: resulting DOM for range [comment, 2, comment, 3], node foreignPara1 
-PASS 25,3: resulting range position for range [comment, 2, comment, 3], node foreignPara1 
-PASS 25,4: resulting DOM for range [comment, 2, comment, 3], node foreignPara1.firstChild 
-PASS 25,4: resulting range position for range [comment, 2, comment, 3], node foreignPara1.firstChild 
-PASS 25,5: resulting DOM for range [comment, 2, comment, 3], node detachedPara1 
-PASS 25,5: resulting range position for range [comment, 2, comment, 3], node detachedPara1 
-PASS 25,6: resulting DOM for range [comment, 2, comment, 3], node detachedPara1.firstChild 
-PASS 25,6: resulting range position for range [comment, 2, comment, 3], node detachedPara1.firstChild 
-PASS 25,7: resulting DOM for range [comment, 2, comment, 3], node document 
-PASS 25,7: resulting range position for range [comment, 2, comment, 3], node document 
-PASS 25,8: resulting DOM for range [comment, 2, comment, 3], node detachedDiv 
-PASS 25,8: resulting range position for range [comment, 2, comment, 3], node detachedDiv 
-PASS 25,9: resulting DOM for range [comment, 2, comment, 3], node foreignDoc 
-PASS 25,9: resulting range position for range [comment, 2, comment, 3], node foreignDoc 
-PASS 25,10: resulting DOM for range [comment, 2, comment, 3], node foreignPara2 
-PASS 25,10: resulting range position for range [comment, 2, comment, 3], node foreignPara2 
-PASS 25,11: resulting DOM for range [comment, 2, comment, 3], node xmlDoc 
-PASS 25,11: resulting range position for range [comment, 2, comment, 3], node xmlDoc 
-PASS 25,12: resulting DOM for range [comment, 2, comment, 3], node xmlElement 
-PASS 25,12: resulting range position for range [comment, 2, comment, 3], node xmlElement 
-PASS 25,13: resulting DOM for range [comment, 2, comment, 3], node detachedTextNode 
-PASS 25,13: resulting range position for range [comment, 2, comment, 3], node detachedTextNode 
-PASS 25,14: resulting DOM for range [comment, 2, comment, 3], node foreignTextNode 
-PASS 25,14: resulting range position for range [comment, 2, comment, 3], node foreignTextNode 
-PASS 25,15: resulting DOM for range [comment, 2, comment, 3], node processingInstruction 
-PASS 25,15: resulting range position for range [comment, 2, comment, 3], node processingInstruction 
-PASS 25,16: resulting DOM for range [comment, 2, comment, 3], node detachedProcessingInstruction 
-PASS 25,16: resulting range position for range [comment, 2, comment, 3], node detachedProcessingInstruction 
-PASS 25,17: resulting DOM for range [comment, 2, comment, 3], node comment 
-PASS 25,17: resulting range position for range [comment, 2, comment, 3], node comment 
-PASS 25,18: resulting DOM for range [comment, 2, comment, 3], node detachedComment 
-PASS 25,18: resulting range position for range [comment, 2, comment, 3], node detachedComment 
-PASS 25,19: resulting DOM for range [comment, 2, comment, 3], node docfrag 
-PASS 25,19: resulting range position for range [comment, 2, comment, 3], node docfrag 
-PASS 25,20: resulting DOM for range [comment, 2, comment, 3], node doctype 
-PASS 25,20: resulting range position for range [comment, 2, comment, 3], node doctype 
-PASS 25,21: resulting DOM for range [comment, 2, comment, 3], node foreignDoctype 
-PASS 25,21: resulting range position for range [comment, 2, comment, 3], node foreignDoctype 
-PASS 26,0: resulting DOM for range [testDiv, 0, comment, 5], node paras[0] 
-PASS 26,0: resulting range position for range [testDiv, 0, comment, 5], node paras[0] 
-PASS 26,1: resulting DOM for range [testDiv, 0, comment, 5], node paras[0].firstChild 
-PASS 26,1: resulting range position for range [testDiv, 0, comment, 5], node paras[0].firstChild 
-PASS 26,2: resulting DOM for range [testDiv, 0, comment, 5], node paras[1].firstChild 
-PASS 26,2: resulting range position for range [testDiv, 0, comment, 5], node paras[1].firstChild 
-PASS 26,3: resulting DOM for range [testDiv, 0, comment, 5], node foreignPara1 
-PASS 26,3: resulting range position for range [testDiv, 0, comment, 5], node foreignPara1 
-PASS 26,4: resulting DOM for range [testDiv, 0, comment, 5], node foreignPara1.firstChild 
-PASS 26,4: resulting range position for range [testDiv, 0, comment, 5], node foreignPara1.firstChild 
-PASS 26,5: resulting DOM for range [testDiv, 0, comment, 5], node detachedPara1 
-PASS 26,5: resulting range position for range [testDiv, 0, comment, 5], node detachedPara1 
-PASS 26,6: resulting DOM for range [testDiv, 0, comment, 5], node detachedPara1.firstChild 
-PASS 26,6: resulting range position for range [testDiv, 0, comment, 5], node detachedPara1.firstChild 
-PASS 26,7: resulting DOM for range [testDiv, 0, comment, 5], node document 
-PASS 26,7: resulting range position for range [testDiv, 0, comment, 5], node document 
-PASS 26,8: resulting DOM for range [testDiv, 0, comment, 5], node detachedDiv 
-PASS 26,8: resulting range position for range [testDiv, 0, comment, 5], node detachedDiv 
-PASS 26,9: resulting DOM for range [testDiv, 0, comment, 5], node foreignDoc 
-PASS 26,9: resulting range position for range [testDiv, 0, comment, 5], node foreignDoc 
-PASS 26,10: resulting DOM for range [testDiv, 0, comment, 5], node foreignPara2 
-PASS 26,10: resulting range position for range [testDiv, 0, comment, 5], node foreignPara2 
-PASS 26,11: resulting DOM for range [testDiv, 0, comment, 5], node xmlDoc 
-PASS 26,11: resulting range position for range [testDiv, 0, comment, 5], node xmlDoc 
-PASS 26,12: resulting DOM for range [testDiv, 0, comment, 5], node xmlElement 
-PASS 26,12: resulting range position for range [testDiv, 0, comment, 5], node xmlElement 
-PASS 26,13: resulting DOM for range [testDiv, 0, comment, 5], node detachedTextNode 
-PASS 26,13: resulting range position for range [testDiv, 0, comment, 5], node detachedTextNode 
-PASS 26,14: resulting DOM for range [testDiv, 0, comment, 5], node foreignTextNode 
-PASS 26,14: resulting range position for range [testDiv, 0, comment, 5], node foreignTextNode 
-PASS 26,15: resulting DOM for range [testDiv, 0, comment, 5], node processingInstruction 
-PASS 26,15: resulting range position for range [testDiv, 0, comment, 5], node processingInstruction 
-PASS 26,16: resulting DOM for range [testDiv, 0, comment, 5], node detachedProcessingInstruction 
-PASS 26,16: resulting range position for range [testDiv, 0, comment, 5], node detachedProcessingInstruction 
-PASS 26,17: resulting DOM for range [testDiv, 0, comment, 5], node comment 
-PASS 26,17: resulting range position for range [testDiv, 0, comment, 5], node comment 
-PASS 26,18: resulting DOM for range [testDiv, 0, comment, 5], node detachedComment 
-PASS 26,18: resulting range position for range [testDiv, 0, comment, 5], node detachedComment 
-PASS 26,19: resulting DOM for range [testDiv, 0, comment, 5], node docfrag 
-PASS 26,19: resulting range position for range [testDiv, 0, comment, 5], node docfrag 
-PASS 26,20: resulting DOM for range [testDiv, 0, comment, 5], node doctype 
-PASS 26,20: resulting range position for range [testDiv, 0, comment, 5], node doctype 
-PASS 26,21: resulting DOM for range [testDiv, 0, comment, 5], node foreignDoctype 
-PASS 26,21: resulting range position for range [testDiv, 0, comment, 5], node foreignDoctype 
-PASS 27,0: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node paras[0] 
-PASS 27,0: resulting range position for range [foreignDoc, 1, foreignComment, 2], node paras[0] 
-PASS 27,1: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node paras[0].firstChild 
-PASS 27,1: resulting range position for range [foreignDoc, 1, foreignComment, 2], node paras[0].firstChild 
-PASS 27,2: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node paras[1].firstChild 
-PASS 27,2: resulting range position for range [foreignDoc, 1, foreignComment, 2], node paras[1].firstChild 
-PASS 27,3: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node foreignPara1 
-PASS 27,3: resulting range position for range [foreignDoc, 1, foreignComment, 2], node foreignPara1 
-PASS 27,4: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node foreignPara1.firstChild 
-PASS 27,4: resulting range position for range [foreignDoc, 1, foreignComment, 2], node foreignPara1.firstChild 
-PASS 27,5: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node detachedPara1 
-PASS 27,5: resulting range position for range [foreignDoc, 1, foreignComment, 2], node detachedPara1 
-PASS 27,6: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node detachedPara1.firstChild 
-PASS 27,6: resulting range position for range [foreignDoc, 1, foreignComment, 2], node detachedPara1.firstChild 
-PASS 27,7: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node document 
-PASS 27,7: resulting range position for range [foreignDoc, 1, foreignComment, 2], node document 
-PASS 27,8: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node detachedDiv 
-PASS 27,8: resulting range position for range [foreignDoc, 1, foreignComment, 2], node detachedDiv 
-PASS 27,9: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node foreignDoc 
-PASS 27,9: resulting range position for range [foreignDoc, 1, foreignComment, 2], node foreignDoc 
-PASS 27,10: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node foreignPara2 
-PASS 27,10: resulting range position for range [foreignDoc, 1, foreignComment, 2], node foreignPara2 
-PASS 27,11: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node xmlDoc 
-PASS 27,11: resulting range position for range [foreignDoc, 1, foreignComment, 2], node xmlDoc 
-PASS 27,12: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node xmlElement 
-PASS 27,12: resulting range position for range [foreignDoc, 1, foreignComment, 2], node xmlElement 
-PASS 27,13: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node detachedTextNode 
-PASS 27,13: resulting range position for range [foreignDoc, 1, foreignComment, 2], node detachedTextNode 
-PASS 27,14: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node foreignTextNode 
-PASS 27,14: resulting range position for range [foreignDoc, 1, foreignComment, 2], node foreignTextNode 
-PASS 27,15: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node processingInstruction 
-PASS 27,15: resulting range position for range [foreignDoc, 1, foreignComment, 2], node processingInstruction 
-PASS 27,16: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node detachedProcessingInstruction 
-PASS 27,16: resulting range position for range [foreignDoc, 1, foreignComment, 2], node detachedProcessingInstruction 
-PASS 27,17: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node comment 
-PASS 27,17: resulting range position for range [foreignDoc, 1, foreignComment, 2], node comment 
-PASS 27,18: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node detachedComment 
-PASS 27,18: resulting range position for range [foreignDoc, 1, foreignComment, 2], node detachedComment 
-PASS 27,19: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node docfrag 
-PASS 27,19: resulting range position for range [foreignDoc, 1, foreignComment, 2], node docfrag 
-PASS 27,20: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node doctype 
-PASS 27,20: resulting range position for range [foreignDoc, 1, foreignComment, 2], node doctype 
-PASS 27,21: resulting DOM for range [foreignDoc, 1, foreignComment, 2], node foreignDoctype 
-PASS 27,21: resulting range position for range [foreignDoc, 1, foreignComment, 2], node foreignDoctype 
-PASS 28,0: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node paras[0] 
-PASS 28,0: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node paras[0] 
-PASS 28,1: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node paras[0].firstChild 
-PASS 28,1: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node paras[0].firstChild 
-PASS 28,2: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node paras[1].firstChild 
-PASS 28,2: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node paras[1].firstChild 
-PASS 28,3: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignPara1 
-PASS 28,3: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignPara1 
-PASS 28,4: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignPara1.firstChild 
-PASS 28,4: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignPara1.firstChild 
-PASS 28,5: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedPara1 
-PASS 28,5: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedPara1 
-PASS 28,6: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedPara1.firstChild 
-PASS 28,6: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedPara1.firstChild 
-PASS 28,7: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node document 
-PASS 28,7: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node document 
-PASS 28,8: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedDiv 
-PASS 28,8: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedDiv 
-PASS 28,9: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignDoc 
-PASS 28,9: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignDoc 
-PASS 28,10: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignPara2 
-PASS 28,10: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignPara2 
-PASS 28,11: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node xmlDoc 
-PASS 28,11: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node xmlDoc 
-PASS 28,12: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node xmlElement 
-PASS 28,12: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node xmlElement 
-PASS 28,13: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedTextNode 
-PASS 28,13: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedTextNode 
-PASS 28,14: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignTextNode 
-PASS 28,14: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignTextNode 
-PASS 28,15: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node processingInstruction 
-PASS 28,15: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node processingInstruction 
-PASS 28,16: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedProcessingInstruction 
-PASS 28,16: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedProcessingInstruction 
-PASS 28,17: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node comment 
-PASS 28,17: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node comment 
-PASS 28,18: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedComment 
-PASS 28,18: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node detachedComment 
-PASS 28,19: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node docfrag 
-PASS 28,19: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node docfrag 
-PASS 28,20: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node doctype 
-PASS 28,20: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node doctype 
-PASS 28,21: resulting DOM for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignDoctype 
-PASS 28,21: resulting range position for range [foreignDoc.body, 0, foreignTextNode, 36], node foreignDoctype 
-PASS 29,0: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node paras[0] 
-PASS 29,0: resulting range position for range [xmlDoc, 1, xmlComment, 0], node paras[0] 
-PASS 29,1: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node paras[0].firstChild 
-PASS 29,1: resulting range position for range [xmlDoc, 1, xmlComment, 0], node paras[0].firstChild 
-PASS 29,2: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node paras[1].firstChild 
-PASS 29,2: resulting range position for range [xmlDoc, 1, xmlComment, 0], node paras[1].firstChild 
-PASS 29,3: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node foreignPara1 
-PASS 29,3: resulting range position for range [xmlDoc, 1, xmlComment, 0], node foreignPara1 
-PASS 29,4: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node foreignPara1.firstChild 
-PASS 29,4: resulting range position for range [xmlDoc, 1, xmlComment, 0], node foreignPara1.firstChild 
-PASS 29,5: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node detachedPara1 
-PASS 29,5: resulting range position for range [xmlDoc, 1, xmlComment, 0], node detachedPara1 
-PASS 29,6: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node detachedPara1.firstChild 
-PASS 29,6: resulting range position for range [xmlDoc, 1, xmlComment, 0], node detachedPara1.firstChild 
-PASS 29,7: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node document 
-PASS 29,7: resulting range position for range [xmlDoc, 1, xmlComment, 0], node document 
-PASS 29,8: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node detachedDiv 
-PASS 29,8: resulting range position for range [xmlDoc, 1, xmlComment, 0], node detachedDiv 
-PASS 29,9: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node foreignDoc 
-PASS 29,9: resulting range position for range [xmlDoc, 1, xmlComment, 0], node foreignDoc 
-PASS 29,10: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node foreignPara2 
-PASS 29,10: resulting range position for range [xmlDoc, 1, xmlComment, 0], node foreignPara2 
-PASS 29,11: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node xmlDoc 
-PASS 29,11: resulting range position for range [xmlDoc, 1, xmlComment, 0], node xmlDoc 
-PASS 29,12: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node xmlElement 
-PASS 29,12: resulting range position for range [xmlDoc, 1, xmlComment, 0], node xmlElement 
-PASS 29,13: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node detachedTextNode 
-PASS 29,13: resulting range position for range [xmlDoc, 1, xmlComment, 0], node detachedTextNode 
-PASS 29,14: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node foreignTextNode 
-PASS 29,14: resulting range position for range [xmlDoc, 1, xmlComment, 0], node foreignTextNode 
-PASS 29,15: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node processingInstruction 
-PASS 29,15: resulting range position for range [xmlDoc, 1, xmlComment, 0], node processingInstruction 
-PASS 29,16: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node detachedProcessingInstruction 
-PASS 29,16: resulting range position for range [xmlDoc, 1, xmlComment, 0], node detachedProcessingInstruction 
-PASS 29,17: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node comment 
-PASS 29,17: resulting range position for range [xmlDoc, 1, xmlComment, 0], node comment 
-PASS 29,18: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node detachedComment 
-PASS 29,18: resulting range position for range [xmlDoc, 1, xmlComment, 0], node detachedComment 
-PASS 29,19: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node docfrag 
-PASS 29,19: resulting range position for range [xmlDoc, 1, xmlComment, 0], node docfrag 
-PASS 29,20: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node doctype 
-PASS 29,20: resulting range position for range [xmlDoc, 1, xmlComment, 0], node doctype 
-PASS 29,21: resulting DOM for range [xmlDoc, 1, xmlComment, 0], node foreignDoctype 
-PASS 29,21: resulting range position for range [xmlDoc, 1, xmlComment, 0], node foreignDoctype 
-FAIL 30,0: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node paras[0] assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,0: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node paras[0] assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,1: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,1: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,2: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node paras[1].firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,2: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node paras[1].firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,3: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node foreignPara1 assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,3: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node foreignPara1 assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,4: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node foreignPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,4: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node foreignPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,5: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node detachedPara1 assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,5: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node detachedPara1 assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,6: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node detachedPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,6: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node detachedPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 30,7: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node document 
-PASS 30,7: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node document 
-FAIL 30,8: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node detachedDiv assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,8: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node detachedDiv assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 30,9: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node foreignDoc 
-PASS 30,9: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node foreignDoc 
-FAIL 30,10: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node foreignPara2 assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,10: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node foreignPara2 assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 30,11: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node xmlDoc 
-PASS 30,11: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node xmlDoc 
-FAIL 30,12: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node xmlElement assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,12: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node xmlElement assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,13: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node detachedTextNode assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,13: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node detachedTextNode assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,14: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node foreignTextNode assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,14: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node foreignTextNode assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,15: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node processingInstruction assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,15: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node processingInstruction assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,16: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node detachedProcessingInstruction assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,16: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node detachedProcessingInstruction assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,17: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node comment assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,17: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node comment assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,18: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node detachedComment assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 30,18: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node detachedComment assert_true: First differing node: expected Text node "", got Text node "Uvwxyzab" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 30,19: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node docfrag 
-PASS 30,19: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node docfrag 
-PASS 30,20: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node doctype 
-PASS 30,20: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node doctype 
-PASS 30,21: resulting DOM for range [detachedTextNode, 0, detachedTextNode, 8], node foreignDoctype 
-PASS 30,21: resulting range position for range [detachedTextNode, 0, detachedTextNode, 8], node foreignDoctype 
-FAIL 31,0: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node paras[0] assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,0: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node paras[0] assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,1: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,1: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,2: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node paras[1].firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,2: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node paras[1].firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,3: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignPara1 assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,3: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignPara1 assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,4: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,4: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,5: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedPara1 assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,5: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedPara1 assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,6: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,6: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 31,7: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node document 
-PASS 31,7: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node document 
-FAIL 31,8: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedDiv assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,8: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedDiv assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 31,9: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignDoc 
-PASS 31,9: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignDoc 
-FAIL 31,10: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignPara2 assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,10: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignPara2 assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 31,11: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node xmlDoc 
-PASS 31,11: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node xmlDoc 
-FAIL 31,12: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node xmlElement assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,12: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node xmlElement assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,13: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedTextNode assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,13: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedTextNode assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,14: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignTextNode assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,14: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignTextNode assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,15: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node processingInstruction assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,15: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node processingInstruction assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,16: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedProcessingInstruction assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,16: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedProcessingInstruction assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,17: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node comment assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,17: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node comment assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,18: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedComment assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 31,18: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node detachedComment assert_true: First differing node: expected Text node "", got Text node "Cdefghij" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 31,19: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node docfrag 
-PASS 31,19: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node docfrag 
-PASS 31,20: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node doctype 
-PASS 31,20: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node doctype 
-PASS 31,21: resulting DOM for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignDoctype 
-PASS 31,21: resulting range position for range [detachedForeignTextNode, 0, detachedForeignTextNode, 8], node foreignDoctype 
-FAIL 32,0: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node paras[0] assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,0: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node paras[0] assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,1: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,1: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,2: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node paras[1].firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,2: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node paras[1].firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,3: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignPara1 assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,3: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignPara1 assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,4: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,4: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,5: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedPara1 assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,5: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedPara1 assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,6: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,6: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedPara1.firstChild assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 32,7: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node document 
-PASS 32,7: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node document 
-FAIL 32,8: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedDiv assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,8: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedDiv assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 32,9: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignDoc 
-PASS 32,9: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignDoc 
-FAIL 32,10: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignPara2 assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,10: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignPara2 assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 32,11: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node xmlDoc 
-PASS 32,11: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node xmlDoc 
-FAIL 32,12: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node xmlElement assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,12: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node xmlElement assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,13: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedTextNode assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,13: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedTextNode assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,14: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignTextNode assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,14: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignTextNode assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,15: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node processingInstruction assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,15: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node processingInstruction assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,16: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedProcessingInstruction assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,16: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedProcessingInstruction assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,17: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node comment assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,17: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node comment assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,18: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedComment assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 32,18: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node detachedComment assert_true: First differing node: expected Text node "", got Text node "Klmnopqr" [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 32,19: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node docfrag 
-PASS 32,19: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node docfrag 
-PASS 32,20: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node doctype 
-PASS 32,20: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node doctype 
-PASS 32,21: resulting DOM for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignDoctype 
-PASS 32,21: resulting range position for range [detachedXmlTextNode, 0, detachedXmlTextNode, 8], node foreignDoctype 
-FAIL 33,0: resulting DOM for range [detachedComment, 3, detachedComment, 4], node paras[0] assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,0: resulting range position for range [detachedComment, 3, detachedComment, 4], node paras[0] assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,1: resulting DOM for range [detachedComment, 3, detachedComment, 4], node paras[0].firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,1: resulting range position for range [detachedComment, 3, detachedComment, 4], node paras[0].firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,2: resulting DOM for range [detachedComment, 3, detachedComment, 4], node paras[1].firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,2: resulting range position for range [detachedComment, 3, detachedComment, 4], node paras[1].firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,3: resulting DOM for range [detachedComment, 3, detachedComment, 4], node foreignPara1 assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,3: resulting range position for range [detachedComment, 3, detachedComment, 4], node foreignPara1 assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,4: resulting DOM for range [detachedComment, 3, detachedComment, 4], node foreignPara1.firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,4: resulting range position for range [detachedComment, 3, detachedComment, 4], node foreignPara1.firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,5: resulting DOM for range [detachedComment, 3, detachedComment, 4], node detachedPara1 assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,5: resulting range position for range [detachedComment, 3, detachedComment, 4], node detachedPara1 assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,6: resulting DOM for range [detachedComment, 3, detachedComment, 4], node detachedPara1.firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,6: resulting range position for range [detachedComment, 3, detachedComment, 4], node detachedPara1.firstChild assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 33,7: resulting DOM for range [detachedComment, 3, detachedComment, 4], node document 
-PASS 33,7: resulting range position for range [detachedComment, 3, detachedComment, 4], node document 
-FAIL 33,8: resulting DOM for range [detachedComment, 3, detachedComment, 4], node detachedDiv assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,8: resulting range position for range [detachedComment, 3, detachedComment, 4], node detachedDiv assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 33,9: resulting DOM for range [detachedComment, 3, detachedComment, 4], node foreignDoc 
-PASS 33,9: resulting range position for range [detachedComment, 3, detachedComment, 4], node foreignDoc 
-FAIL 33,10: resulting DOM for range [detachedComment, 3, detachedComment, 4], node foreignPara2 assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,10: resulting range position for range [detachedComment, 3, detachedComment, 4], node foreignPara2 assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 33,11: resulting DOM for range [detachedComment, 3, detachedComment, 4], node xmlDoc 
-PASS 33,11: resulting range position for range [detachedComment, 3, detachedComment, 4], node xmlDoc 
-FAIL 33,12: resulting DOM for range [detachedComment, 3, detachedComment, 4], node xmlElement assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,12: resulting range position for range [detachedComment, 3, detachedComment, 4], node xmlElement assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,13: resulting DOM for range [detachedComment, 3, detachedComment, 4], node detachedTextNode assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,13: resulting range position for range [detachedComment, 3, detachedComment, 4], node detachedTextNode assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,14: resulting DOM for range [detachedComment, 3, detachedComment, 4], node foreignTextNode assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,14: resulting range position for range [detachedComment, 3, detachedComment, 4], node foreignTextNode assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,15: resulting DOM for range [detachedComment, 3, detachedComment, 4], node processingInstruction assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,15: resulting range position for range [detachedComment, 3, detachedComment, 4], node processingInstruction assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,16: resulting DOM for range [detachedComment, 3, detachedComment, 4], node detachedProcessingInstruction assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,16: resulting range position for range [detachedComment, 3, detachedComment, 4], node detachedProcessingInstruction assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,17: resulting DOM for range [detachedComment, 3, detachedComment, 4], node comment assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,17: resulting range position for range [detachedComment, 3, detachedComment, 4], node comment assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,18: resulting DOM for range [detachedComment, 3, detachedComment, 4], node detachedComment assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 33,18: resulting range position for range [detachedComment, 3, detachedComment, 4], node detachedComment assert_true: First differing node: expected Comment node <!--Stuwxyz-->, got Comment node <!--Stuvwxyz--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 33,19: resulting DOM for range [detachedComment, 3, detachedComment, 4], node docfrag 
-PASS 33,19: resulting range position for range [detachedComment, 3, detachedComment, 4], node docfrag 
-PASS 33,20: resulting DOM for range [detachedComment, 3, detachedComment, 4], node doctype 
-PASS 33,20: resulting range position for range [detachedComment, 3, detachedComment, 4], node doctype 
-PASS 33,21: resulting DOM for range [detachedComment, 3, detachedComment, 4], node foreignDoctype 
-PASS 33,21: resulting range position for range [detachedComment, 3, detachedComment, 4], node foreignDoctype 
-FAIL 34,0: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node paras[0] assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,0: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node paras[0] assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,1: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node paras[0].firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,1: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node paras[0].firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,2: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node paras[1].firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,2: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node paras[1].firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,3: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignPara1 assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,3: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignPara1 assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,4: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignPara1.firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,4: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignPara1.firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,5: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedPara1 assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,5: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedPara1 assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,6: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedPara1.firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,6: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedPara1.firstChild assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 34,7: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node document 
-PASS 34,7: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node document 
-FAIL 34,8: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedDiv assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,8: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedDiv assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 34,9: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignDoc 
-PASS 34,9: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignDoc 
-FAIL 34,10: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignPara2 assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,10: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignPara2 assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 34,11: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node xmlDoc 
-PASS 34,11: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node xmlDoc 
-FAIL 34,12: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node xmlElement assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,12: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node xmlElement assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,13: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedTextNode assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,13: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedTextNode assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,14: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignTextNode assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,14: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignTextNode assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,15: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node processingInstruction assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,15: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node processingInstruction assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,16: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedProcessingInstruction assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,16: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedProcessingInstruction assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,17: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node comment assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,17: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node comment assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,18: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedComment assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 34,18: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node detachedComment assert_true: First differing node: expected Comment node <!--ריה יהודה-->, got Comment node <!--אריה יהודה--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 34,19: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node docfrag 
-PASS 34,19: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node docfrag 
-PASS 34,20: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node doctype 
-PASS 34,20: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node doctype 
-PASS 34,21: resulting DOM for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignDoctype 
-PASS 34,21: resulting range position for range [detachedForeignComment, 0, detachedForeignComment, 1], node foreignDoctype 
-FAIL 35,0: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node paras[0] assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,0: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node paras[0] assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,1: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node paras[0].firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,1: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node paras[0].firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,2: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node paras[1].firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,2: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node paras[1].firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,3: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignPara1 assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,3: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignPara1 assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,4: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignPara1.firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,4: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignPara1.firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,5: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedPara1 assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,5: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedPara1 assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,6: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedPara1.firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,6: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedPara1.firstChild assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 35,7: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node document 
-PASS 35,7: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node document 
-FAIL 35,8: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedDiv assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,8: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedDiv assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 35,9: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignDoc 
-PASS 35,9: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignDoc 
-FAIL 35,10: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignPara2 assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,10: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignPara2 assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 35,11: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node xmlDoc 
-PASS 35,11: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node xmlDoc 
-FAIL 35,12: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node xmlElement assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,12: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node xmlElement assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,13: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedTextNode assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,13: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedTextNode assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,14: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignTextNode assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,14: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignTextNode assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,15: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node processingInstruction assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,15: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node processingInstruction assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,16: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedProcessingInstruction assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,16: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedProcessingInstruction assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,17: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node comment assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,17: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node comment assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,18: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedComment assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-FAIL 35,18: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node detachedComment assert_true: First differing node: expected Comment node <!--בןם אליעזר-->, got Comment node <!--בן חיים אליעזר--> [Actual and expected mismatch for range's tree root.  ] expected true got false
-PASS 35,19: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node docfrag 
-PASS 35,19: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node docfrag 
-PASS 35,20: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node doctype 
-PASS 35,20: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node doctype 
-PASS 35,21: resulting DOM for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignDoctype 
-PASS 35,21: resulting range position for range [detachedXmlComment, 2, detachedXmlComment, 6], node foreignDoctype 
-PASS 36,0: resulting DOM for range [docfrag, 0, docfrag, 0], node paras[0] 
-PASS 36,0: resulting range position for range [docfrag, 0, docfrag, 0], node paras[0] 
-PASS 36,1: resulting DOM for range [docfrag, 0, docfrag, 0], node paras[0].firstChild 
-PASS 36,1: resulting range position for range [docfrag, 0, docfrag, 0], node paras[0].firstChild 
-PASS 36,2: resulting DOM for range [docfrag, 0, docfrag, 0], node paras[1].firstChild 
-PASS 36,2: resulting range position for range [docfrag, 0, docfrag, 0], node paras[1].firstChild 
-PASS 36,3: resulting DOM for range [docfrag, 0, docfrag, 0], node foreignPara1 
-PASS 36,3: resulting range position for range [docfrag, 0, docfrag, 0], node foreignPara1 
-PASS 36,4: resulting DOM for range [docfrag, 0, docfrag, 0], node foreignPara1.firstChild 
-PASS 36,4: resulting range position for range [docfrag, 0, docfrag, 0], node foreignPara1.firstChild 
-PASS 36,5: resulting DOM for range [docfrag, 0, docfrag, 0], node detachedPara1 
-PASS 36,5: resulting range position for range [docfrag, 0, docfrag, 0], node detachedPara1 
-PASS 36,6: resulting DOM for range [docfrag, 0, docfrag, 0], node detachedPara1.firstChild 
-PASS 36,6: resulting range position for range [docfrag, 0, docfrag, 0], node detachedPara1.firstChild 
-PASS 36,7: resulting DOM for range [docfrag, 0, docfrag, 0], node document 
-PASS 36,7: resulting range position for range [docfrag, 0, docfrag, 0], node document 
-PASS 36,8: resulting DOM for range [docfrag, 0, docfrag, 0], node detachedDiv 
-PASS 36,8: resulting range position for range [docfrag, 0, docfrag, 0], node detachedDiv 
-PASS 36,9: resulting DOM for range [docfrag, 0, docfrag, 0], node foreignDoc 
-PASS 36,9: resulting range position for range [docfrag, 0, docfrag, 0], node foreignDoc 
-PASS 36,10: resulting DOM for range [docfrag, 0, docfrag, 0], node foreignPara2 
-PASS 36,10: resulting range position for range [docfrag, 0, docfrag, 0], node foreignPara2 
-PASS 36,11: resulting DOM for range [docfrag, 0, docfrag, 0], node xmlDoc 
-PASS 36,11: resulting range position for range [docfrag, 0, docfrag, 0], node xmlDoc 
-PASS 36,12: resulting DOM for range [docfrag, 0, docfrag, 0], node xmlElement 
-PASS 36,12: resulting range position for range [docfrag, 0, docfrag, 0], node xmlElement 
-PASS 36,13: resulting DOM for range [docfrag, 0, docfrag, 0], node detachedTextNode 
-PASS 36,13: resulting range position for range [docfrag, 0, docfrag, 0], node detachedTextNode 
-PASS 36,14: resulting DOM for range [docfrag, 0, docfrag, 0], node foreignTextNode 
-PASS 36,14: resulting range position for range [docfrag, 0, docfrag, 0], node foreignTextNode 
-PASS 36,15: resulting DOM for range [docfrag, 0, docfrag, 0], node processingInstruction 
-PASS 36,15: resulting range position for range [docfrag, 0, docfrag, 0], node processingInstruction 
-PASS 36,16: resulting DOM for range [docfrag, 0, docfrag, 0], node detachedProcessingInstruction 
-PASS 36,16: resulting range position for range [docfrag, 0, docfrag, 0], node detachedProcessingInstruction 
-PASS 36,17: resulting DOM for range [docfrag, 0, docfrag, 0], node comment 
-PASS 36,17: resulting range position for range [docfrag, 0, docfrag, 0], node comment 
-PASS 36,18: resulting DOM for range [docfrag, 0, docfrag, 0], node detachedComment 
-PASS 36,18: resulting range position for range [docfrag, 0, docfrag, 0], node detachedComment 
-PASS 36,19: resulting DOM for range [docfrag, 0, docfrag, 0], node docfrag 
-PASS 36,19: resulting range position for range [docfrag, 0, docfrag, 0], node docfrag 
-PASS 36,20: resulting DOM for range [docfrag, 0, docfrag, 0], node doctype 
-PASS 36,20: resulting range position for range [docfrag, 0, docfrag, 0], node doctype 
-PASS 36,21: resulting DOM for range [docfrag, 0, docfrag, 0], node foreignDoctype 
-PASS 36,21: resulting range position for range [docfrag, 0, docfrag, 0], node foreignDoctype 
-PASS 37,0: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node paras[0] 
-PASS 37,0: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node paras[0] 
-PASS 37,1: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node paras[0].firstChild 
-PASS 37,1: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node paras[0].firstChild 
-PASS 37,2: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node paras[1].firstChild 
-PASS 37,2: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node paras[1].firstChild 
-PASS 37,3: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node foreignPara1 
-PASS 37,3: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node foreignPara1 
-PASS 37,4: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node foreignPara1.firstChild 
-PASS 37,4: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node foreignPara1.firstChild 
-PASS 37,5: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node detachedPara1 
-PASS 37,5: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node detachedPara1 
-PASS 37,6: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node detachedPara1.firstChild 
-PASS 37,6: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node detachedPara1.firstChild 
-PASS 37,7: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node document 
-PASS 37,7: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node document 
-PASS 37,8: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node detachedDiv 
-PASS 37,8: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node detachedDiv 
-PASS 37,9: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node foreignDoc 
-PASS 37,9: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node foreignDoc 
-PASS 37,10: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node foreignPara2 
-PASS 37,10: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node foreignPara2 
-PASS 37,11: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node xmlDoc 
-PASS 37,11: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node xmlDoc 
-PASS 37,12: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node xmlElement 
-PASS 37,12: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node xmlElement 
-PASS 37,13: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node detachedTextNode 
-PASS 37,13: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node detachedTextNode 
-PASS 37,14: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node foreignTextNode 
-PASS 37,14: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node foreignTextNode 
-PASS 37,15: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node processingInstruction 
-PASS 37,15: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node processingInstruction 
-PASS 37,16: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node detachedProcessingInstruction 
-PASS 37,16: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node detachedProcessingInstruction 
-PASS 37,17: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node comment 
-PASS 37,17: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node comment 
-PASS 37,18: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node detachedComment 
-PASS 37,18: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node detachedComment 
-PASS 37,19: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node docfrag 
-PASS 37,19: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node docfrag 
-PASS 37,20: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node doctype 
-PASS 37,20: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node doctype 
-PASS 37,21: resulting DOM for range [processingInstruction, 0, processingInstruction, 4], node foreignDoctype 
-PASS 37,21: resulting range position for range [processingInstruction, 0, processingInstruction, 4], node foreignDoctype 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Range/31684-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Range/31684-expected.txt
deleted file mode 100644
index 1000491..0000000
--- a/third_party/WebKit/LayoutTests/fast/dom/Range/31684-expected.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-This test checks an orphan text node cannot be surrounded by the range. (bug31684)
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS range.surroundContents(element) threw exception HierarchyRequestError: Failed to execute 'surroundContents' on 'Range': The container node is a detached character data node; no parent node is available for insertion..
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Range/31684.html b/third_party/WebKit/LayoutTests/fast/dom/Range/31684.html
deleted file mode 100644
index 045f55a6..0000000
--- a/third_party/WebKit/LayoutTests/fast/dom/Range/31684.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src="../../../resources/js-test.js"></script>
-</head>
-<body>
-<script>
-description(
-    "This test checks an orphan text node cannot be surrounded by the range. (bug31684)"
-);
-
-var range = document.createRange();
-var text = document.createTextNode('hello');
-var element = document.createElement("div");
-range.selectNodeContents(text);
-
-shouldThrow("range.surroundContents(element)", '"HierarchyRequestError: Failed to execute \'surroundContents\' on \'Range\': The container node is a detached character data node; no parent node is available for insertion."');
-</script>
-</body>
-</html>
diff --git a/third_party/WebKit/Source/core/OWNERS b/third_party/WebKit/Source/core/OWNERS
index 9e87576e..6c8eed29 100644
--- a/third_party/WebKit/Source/core/OWNERS
+++ b/third_party/WebKit/Source/core/OWNERS
@@ -3,6 +3,8 @@
 
 # Reviewers (comments indicate areas of expertise):
 ager@chromium.org
+# alancutter reviews changes in core/animation, core/css and core/style.
+alancutter@chromium.org
 alexis.menard@intel.com
 # bokan reviews changes around viewport behavior, scrolling, cc/blink interaction, co-ordinate spaces and input events
 bokan@chromium.org
diff --git a/third_party/WebKit/Source/core/css/MediaValues.cpp b/third_party/WebKit/Source/core/css/MediaValues.cpp
index c35e294..5d6f585 100644
--- a/third_party/WebKit/Source/core/css/MediaValues.cpp
+++ b/third_party/WebKit/Source/core/css/MediaValues.cpp
@@ -32,16 +32,12 @@
 
 double MediaValues::calculateViewportWidth(LocalFrame* frame) {
   ASSERT(frame && frame->view() && frame->document());
-  int viewportWidth = frame->view()->layoutSize(IncludeScrollbars).width();
-  return adjustDoubleForAbsoluteZoom(
-      viewportWidth, frame->document()->layoutViewItem().styleRef());
+  return frame->view()->viewportSizeForMediaQueries().width();
 }
 
 double MediaValues::calculateViewportHeight(LocalFrame* frame) {
   ASSERT(frame && frame->view() && frame->document());
-  int viewportHeight = frame->view()->layoutSize(IncludeScrollbars).height();
-  return adjustDoubleForAbsoluteZoom(
-      viewportHeight, frame->document()->layoutViewItem().styleRef());
+  return frame->view()->viewportSizeForMediaQueries().height();
 }
 
 int MediaValues::calculateDeviceWidth(LocalFrame* frame) {
diff --git a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
index 02f4f52..df7e4ede 100644
--- a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
@@ -61,10 +61,9 @@
 
 inline ComputedStyle* getElementStyle(Element& element) {
   if (element.needsReattachLayoutTree()) {
-    StyleReattachData styleReattachData =
-        element.document().getStyleReattachData(element);
-    if (styleReattachData.computedStyle)
-      return styleReattachData.computedStyle.get();
+    if (ComputedStyle* computedStyle =
+            element.document().getNonAttachedStyle(element))
+      return computedStyle;
   }
   return element.mutableComputedStyle();
 }
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn
index 51a55eb..d199a45 100644
--- a/third_party/WebKit/Source/core/dom/BUILD.gn
+++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -279,7 +279,6 @@
     "StyleEngine.h",
     "StyleEngineContext.cpp",
     "StyleEngineContext.h",
-    "StyleReattachData.h",
     "StyleSheetCandidate.cpp",
     "StyleSheetCandidate.h",
     "StyleSheetCollection.cpp",
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.cpp b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
index 1be048ee..2dbafa1 100644
--- a/third_party/WebKit/Source/core/dom/ContainerNode.cpp
+++ b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
@@ -1289,25 +1289,16 @@
   DCHECK(change >= UpdatePseudoElements || childNeedsStyleRecalc());
   DCHECK(!needsStyleRecalc());
 
-  // This loop is deliberately backwards because we use insertBefore in the
-  // layout tree, and want to avoid a potentially n^2 loop to find the insertion
-  // point while resolving style.  Having us start from the last child and work
-  // our way back means in the common case, we'll find the insertion point in
-  // O(1) time.  See crbug.com/288225
   StyleResolver& styleResolver = document().ensureStyleResolver();
-  Text* lastTextNode = nullptr;
   for (Node* child = lastChild(); child; child = child->previousSibling()) {
     if (child->isTextNode()) {
-      toText(child)->recalcTextStyle(change, lastTextNode);
-      lastTextNode = toText(child);
+      toText(child)->recalcTextStyle(change);
     } else if (child->isElementNode()) {
       Element* element = toElement(child);
       if (element->shouldCallRecalcStyle(change))
-        element->recalcStyle(change, lastTextNode);
+        element->recalcStyle(change);
       else if (element->supportsStyleSharing())
         styleResolver.addToStyleSharingList(*element);
-      if (element->layoutObject())
-        lastTextNode = nullptr;
     }
   }
 }
@@ -1315,13 +1306,26 @@
 void ContainerNode::rebuildChildrenLayoutTrees() {
   DCHECK(!needsReattachLayoutTree());
 
+  // This loop is deliberately backwards because we use insertBefore in the
+  // layout tree, and want to avoid a potentially n^2 loop to find the insertion
+  // point while building the layout tree.  Having us start from the last child
+  // and work our way back means in the common case, we'll find the insertion
+  // point in O(1) time.  See crbug.com/288225
+  Text* lastTextNode = nullptr;
   for (Node* child = lastChild(); child; child = child->previousSibling()) {
-    if (child->needsReattachLayoutTree() ||
-        child->childNeedsReattachLayoutTree()) {
-      if (child->isTextNode())
-        toText(child)->rebuildTextLayoutTree();
-      else if (child->isElementNode())
-        toElement(child)->rebuildLayoutTree();
+    bool rebuildChild = child->needsReattachLayoutTree() ||
+                        child->childNeedsReattachLayoutTree();
+    if (child->isTextNode()) {
+      Text* textNode = toText(child);
+      if (rebuildChild)
+        textNode->rebuildTextLayoutTree(lastTextNode);
+      lastTextNode = textNode;
+    } else if (child->isElementNode()) {
+      Element* element = toElement(child);
+      if (rebuildChild)
+        element->rebuildLayoutTree(lastTextNode);
+      if (element->layoutObject())
+        lastTextNode = nullptr;
     }
   }
   // This is done in ContainerNode::attachLayoutTree but will never be cleared
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 8f943378..7b43059 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -1417,14 +1417,14 @@
 // We use HashMap::set over HashMap::add here as we want to
 // replace the ComputedStyle but not the Node if the Node is
 // already present.
-void Document::addStyleReattachData(const Node& node,
-                                    StyleReattachData& styleReattachData) {
+void Document::addNonAttachedStyle(const Node& node,
+                                   RefPtr<ComputedStyle> computedStyle) {
   DCHECK(node.isElementNode() || node.isTextNode());
-  m_styleReattachDataMap.set(&node, styleReattachData);
+  m_nonAttachedStyle.set(&node, computedStyle);
 }
 
-StyleReattachData Document::getStyleReattachData(const Node& node) const {
-  return m_styleReattachDataMap.at(&node);
+ComputedStyle* Document::getNonAttachedStyle(const Node& node) const {
+  return m_nonAttachedStyle.at(&node);
 }
 
 /*
@@ -2107,7 +2107,7 @@
 
   // Only retain the HashMap for the duration of StyleRecalc and
   // LayoutTreeConstruction.
-  m_styleReattachDataMap.clear();
+  m_nonAttachedStyle.clear();
   clearChildNeedsStyleRecalc();
   clearChildNeedsReattachLayoutTree();
 
@@ -2119,7 +2119,7 @@
   DCHECK(!childNeedsReattachLayoutTree());
   DCHECK(inStyleRecalc());
   DCHECK_EQ(styleResolver(), &resolver);
-  DCHECK(m_styleReattachDataMap.isEmpty());
+  DCHECK(m_nonAttachedStyle.isEmpty());
   m_lifecycle.advanceTo(DocumentLifecycle::StyleClean);
   if (shouldRecordStats) {
     TRACE_EVENT_END2("blink,blink_style", "Document::updateStyle",
@@ -6620,7 +6620,7 @@
   visitor->trace(m_snapCoordinator);
   visitor->trace(m_resizeObserverController);
   visitor->trace(m_propertyRegistry);
-  visitor->trace(m_styleReattachDataMap);
+  visitor->trace(m_nonAttachedStyle);
   visitor->trace(m_networkStateObserver);
   Supplementable<Document>::trace(visitor);
   TreeScope::trace(visitor);
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index 0f292bc..2a5f7b4 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -41,7 +41,6 @@
 #include "core/dom/DocumentTiming.h"
 #include "core/dom/ExecutionContext.h"
 #include "core/dom/MutationObserver.h"
-#include "core/dom/StyleReattachData.h"
 #include "core/dom/SynchronousMutationNotifier.h"
 #include "core/dom/SynchronousMutationObserver.h"
 #include "core/dom/Text.h"
@@ -343,8 +342,8 @@
   // just for the web IDL implementation.
   Element* scrollingElementNoLayout();
 
-  void addStyleReattachData(const Node&, StyleReattachData&);
-  StyleReattachData getStyleReattachData(const Node&) const;
+  void addNonAttachedStyle(const Node&, RefPtr<ComputedStyle>);
+  ComputedStyle* getNonAttachedStyle(const Node&) const;
 
   String readyState() const;
 
@@ -1438,10 +1437,9 @@
   Member<DocumentParser> m_parser;
   Member<ContextFeatures> m_contextFeatures;
 
-  // This HashMap is used to stash information (ComputedStyle, nextTextSibling)
-  // generated in the Style Resolution phase that is required in the
-  // Layout Tree construction phase.
-  HeapHashMap<Member<const Node>, StyleReattachData> m_styleReattachDataMap;
+  // This HashMap is used to temporaily store the ComputedStyle generated in the
+  // Style Resolution phase which is used in the Layout Tree construction phase.
+  HeapHashMap<Member<const Node>, RefPtr<ComputedStyle>> m_nonAttachedStyle;
 
   bool m_wellFormed;
 
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 373a6cb..caaf1fe 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1848,7 +1848,7 @@
   return document().ensureStyleResolver().styleForElement(this);
 }
 
-void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) {
+void Element::recalcStyle(StyleRecalcChange change) {
   DCHECK(document().inStyleRecalc());
   DCHECK(!document().lifecycle().inDetach());
   DCHECK(!parentOrShadowHostNode()->needsStyleRecalc());
@@ -1889,7 +1889,7 @@
       }
     }
     if (parentComputedStyle())
-      change = recalcOwnStyle(change, nextTextSibling);
+      change = recalcOwnStyle(change);
     // Needed because the rebuildLayoutTree code needs to see what the
     // styleChangeType() was on reattach roots. See Node::reattachLayoutTree()
     // for an example.
@@ -1954,8 +1954,7 @@
   return newStyle;
 }
 
-StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change,
-                                          Text* nextTextSibling) {
+StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) {
   DCHECK(document().inStyleRecalc());
   DCHECK(!parentOrShadowHostNode()->needsStyleRecalc());
   DCHECK(change >= IndependentInherit || needsStyleRecalc());
@@ -1980,10 +1979,7 @@
   }
 
   if (localChange == Reattach) {
-    StyleReattachData styleReattachData;
-    styleReattachData.computedStyle = std::move(newStyle);
-    styleReattachData.nextTextSibling = nextTextSibling;
-    document().addStyleReattachData(*this, styleReattachData);
+    document().addNonAttachedStyle(*this, std::move(newStyle));
     setNeedsReattachLayoutTree();
     return Reattach;
   }
@@ -2028,24 +2024,17 @@
   return localChange;
 }
 
-void Element::rebuildLayoutTree() {
+void Element::rebuildLayoutTree(Text* nextTextSibling) {
   DCHECK(inActiveDocument());
   DCHECK(parentNode());
 
   if (needsReattachLayoutTree()) {
-    StyleReattachData styleReattachData =
-        document().getStyleReattachData(*this);
     AttachContext reattachContext;
-    reattachContext.resolvedStyle = styleReattachData.computedStyle.get();
+    reattachContext.resolvedStyle = document().getNonAttachedStyle(*this);
     bool layoutObjectWillChange = needsAttach() || layoutObject();
     reattachLayoutTree(reattachContext);
-    if (layoutObjectWillChange || layoutObject()) {
-      // nextTextSibling is passed on to recalcStyle from recalcDescendantStyles
-      // we can either traverse the current subtree from this node onwards
-      // or store it.
-      // The choice is between increased time and increased memory complexity.
-      reattachWhitespaceSiblingsIfNeeded(styleReattachData.nextTextSibling);
-    }
+    if (layoutObjectWillChange || layoutObject())
+      reattachWhitespaceSiblingsIfNeeded(nextTextSibling);
   } else if (childNeedsReattachLayoutTree()) {
     DCHECK(!needsReattachLayoutTree());
     SelectorFilterParentScope filterScope(*this);
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h
index 67cc18d2..2e8ae00 100644
--- a/third_party/WebKit/Source/core/dom/Element.h
+++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -414,8 +414,8 @@
 
   virtual LayoutObject* createLayoutObject(const ComputedStyle&);
   virtual bool layoutObjectIsNeeded(const ComputedStyle&);
-  void recalcStyle(StyleRecalcChange, Text* nextTextSibling = nullptr);
-  void rebuildLayoutTree();
+  void recalcStyle(StyleRecalcChange);
+  void rebuildLayoutTree(Text* nextTextSibling = nullptr);
   void pseudoStateChanged(CSSSelector::PseudoType);
   void setAnimationStyleChange(bool);
   void clearAnimationStyleChange();
@@ -844,7 +844,7 @@
   // and returns the new style. Otherwise, returns null.
   PassRefPtr<ComputedStyle> propagateInheritedProperties(StyleRecalcChange);
 
-  StyleRecalcChange recalcOwnStyle(StyleRecalcChange, Text*);
+  StyleRecalcChange recalcOwnStyle(StyleRecalcChange);
   void reattachPseudoElementLayoutTree(PseudoId);
   void rebuildShadowRootLayoutTree();
   inline void checkForEmptyStyleChange();
diff --git a/third_party/WebKit/Source/core/dom/Range.cpp b/third_party/WebKit/Source/core/dom/Range.cpp
index 37c2126..45618228 100644
--- a/third_party/WebKit/Source/core/dom/Range.cpp
+++ b/third_party/WebKit/Source/core/dom/Range.cpp
@@ -1361,25 +1361,6 @@
       break;
   }
 
-  // Raise a HierarchyRequestError if m_start.container() doesn't accept
-  // children like newParent.
-  Node* parentOfNewParent = m_start.container();
-
-  // If m_start.container() is a character data node, it will be split and it
-  // will be its parent that will need to accept newParent (or in the case of a
-  // comment, it logically "would" be inserted into the parent, although this
-  // will fail below for another reason).
-  if (parentOfNewParent->isCharacterDataNode())
-    parentOfNewParent = parentOfNewParent->parentNode();
-
-  if (!parentOfNewParent) {
-    exceptionState.throwDOMException(HierarchyRequestError,
-                                     "The container node is a detached "
-                                     "character data node; no parent node is "
-                                     "available for insertion.");
-    return;
-  }
-
   EventQueueScope scope;
 
   // 3. Let fragment be the result of extracting context object.
diff --git a/third_party/WebKit/Source/core/dom/StyleReattachData.h b/third_party/WebKit/Source/core/dom/StyleReattachData.h
deleted file mode 100644
index 9b5daad..0000000
--- a/third_party/WebKit/Source/core/dom/StyleReattachData.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef StyleReattachData_h
-#define StyleReattachData_h
-
-namespace blink {
-
-struct StyleReattachData {
-  DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-  DEFINE_INLINE_TRACE() { visitor->trace(nextTextSibling); }
-
-  RefPtr<ComputedStyle> computedStyle;
-  Member<Text> nextTextSibling;
-};
-
-}  // namespace blink
-
-#endif  // StyleReattachData_h
diff --git a/third_party/WebKit/Source/core/dom/Text.cpp b/third_party/WebKit/Source/core/dom/Text.cpp
index f69b855..7644a6c 100644
--- a/third_party/WebKit/Source/core/dom/Text.cpp
+++ b/third_party/WebKit/Source/core/dom/Text.cpp
@@ -392,7 +392,7 @@
   CharacterData::attachLayoutTree(reattachContext);
 }
 
-void Text::recalcTextStyle(StyleRecalcChange change, Text* nextTextSibling) {
+void Text::recalcTextStyle(StyleRecalcChange change) {
   if (LayoutTextItem layoutItem = LayoutTextItem(this->layoutObject())) {
     if (change != NoChange || needsStyleRecalc())
       layoutItem.setStyle(document().ensureStyleResolver().styleForText(this));
@@ -400,23 +400,18 @@
       layoutItem.setText(dataImpl());
     clearNeedsStyleRecalc();
   } else if (needsStyleRecalc() || needsWhitespaceLayoutObject()) {
-    StyleReattachData styleReattachData;
-    styleReattachData.nextTextSibling = nextTextSibling;
-    document().addStyleReattachData(*this, styleReattachData);
     setNeedsReattachLayoutTree();
   }
 }
 
-void Text::rebuildTextLayoutTree() {
+void Text::rebuildTextLayoutTree(Text* nextTextSibling) {
   DCHECK(!childNeedsStyleRecalc());
   DCHECK(needsReattachLayoutTree());
   DCHECK(parentNode());
 
   reattachLayoutTree();
-  if (layoutObject()) {
-    reattachWhitespaceSiblingsIfNeeded(
-        document().getStyleReattachData(*this).nextTextSibling);
-  }
+  if (layoutObject())
+    reattachWhitespaceSiblingsIfNeeded(nextTextSibling);
   clearNeedsReattachLayoutTree();
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Text.h b/third_party/WebKit/Source/core/dom/Text.h
index 96111466..0cb7f2a 100644
--- a/third_party/WebKit/Source/core/dom/Text.h
+++ b/third_party/WebKit/Source/core/dom/Text.h
@@ -53,8 +53,8 @@
   String wholeText() const;
   Text* replaceWholeText(const String&);
 
-  void recalcTextStyle(StyleRecalcChange, Text* nextTextSibling);
-  void rebuildTextLayoutTree();
+  void recalcTextStyle(StyleRecalcChange);
+  void rebuildTextLayoutTree(Text* nextTextSibling);
   bool textLayoutObjectIsNeeded(const ComputedStyle&,
                                 const LayoutObject& parent) const;
   LayoutText* createTextLayoutObject(const ComputedStyle&);
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp
index b6f7fc00..56167fd 100644
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -1405,7 +1405,9 @@
 }
 
 FloatSize FrameView::viewportSizeForViewportUnits() const {
-  float zoom = frame().pageZoomFactor();
+  float zoom = 1;
+  if (!m_frame->document() || !m_frame->document()->printing())
+    zoom = frame().pageZoomFactor();
 
   LayoutViewItem layoutViewItem = this->layoutViewItem();
   if (layoutViewItem.isNull())
@@ -1435,6 +1437,13 @@
   return layoutSize;
 }
 
+FloatSize FrameView::viewportSizeForMediaQueries() const {
+  FloatSize viewportSize(layoutSize(IncludeScrollbars));
+  if (!m_frame->document() || !m_frame->document()->printing())
+    viewportSize.scale(1 / frame().pageZoomFactor());
+  return viewportSize;
+}
+
 DocumentLifecycle& FrameView::lifecycle() const {
   DCHECK(m_frame);
   DCHECK(m_frame->document());
diff --git a/third_party/WebKit/Source/core/frame/FrameView.h b/third_party/WebKit/Source/core/frame/FrameView.h
index 43e3643..2efbb0f 100644
--- a/third_party/WebKit/Source/core/frame/FrameView.h
+++ b/third_party/WebKit/Source/core/frame/FrameView.h
@@ -760,8 +760,14 @@
   IntRect computeVisibleArea();
 
   // Viewport size that should be used for viewport units (i.e. 'vh'/'vw').
+  // May include the size of browser controls. See implementation for further
+  // documentation.
   FloatSize viewportSizeForViewportUnits() const;
 
+  // Initial containing block size for evaluating viewport-dependent media
+  // queries.
+  FloatSize viewportSizeForMediaQueries() const;
+
   ScrollAnchor* scrollAnchor() override { return &m_scrollAnchor; }
   void clearScrollAnchor();
   bool shouldPerformScrollAnchoring() const override;
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index 2349a5f4..b7ed656d 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -555,11 +555,11 @@
   ClipRectsContext clipRectsContext(compositingAncestor, UncachedClipRects,
                                     IgnoreOverlayScrollbarSize);
   clipRectsContext.setIgnoreOverflowClip();
-  LayoutRect unsnappedParentClipRect =
-      m_owningLayer.clipper(PaintLayer::DoNotUseGeometryMapper)
-          .backgroundClipRect(clipRectsContext)
-          .rect();
-  IntRect parentClipRect = pixelSnappedIntRect(unsnappedParentClipRect);
+
+  ClipRect clipRect;
+  m_owningLayer.clipper(PaintLayer::DoNotUseGeometryMapper)
+      .calculateBackgroundClipRect(clipRectsContext, clipRect);
+  IntRect parentClipRect = pixelSnappedIntRect(clipRect.rect());
   owningLayerIsClipped = parentClipRect != LayoutRect::infiniteIntRect();
 
   // TODO(schenney): CSS clips are not applied to composited children, and
@@ -1172,20 +1172,23 @@
   ClipRectsContext clipRectsContext(compositingContainer,
                                     PaintingClipRectsIgnoringOverflowClip,
                                     IgnoreOverlayScrollbarSize);
-  IntRect parentClipRect = pixelSnappedIntRect(
-      m_owningLayer.clipper(PaintLayer::DoNotUseGeometryMapper)
-          .backgroundClipRect(clipRectsContext)
-          .rect());
-  ASSERT(parentClipRect != LayoutRect::infiniteIntRect());
-  m_ancestorClippingLayer->setPosition(
-      FloatPoint(parentClipRect.location() - graphicsLayerParentLocation));
-  m_ancestorClippingLayer->setSize(FloatSize(parentClipRect.size()));
+
+  ClipRect parentClipRect;
+  m_owningLayer.clipper(PaintLayer::DoNotUseGeometryMapper)
+      .calculateBackgroundClipRect(clipRectsContext, parentClipRect);
+
+  IntRect snappedParentClipRect(pixelSnappedIntRect(parentClipRect.rect()));
+
+  DCHECK(snappedParentClipRect != LayoutRect::infiniteIntRect());
+  m_ancestorClippingLayer->setPosition(FloatPoint(
+      snappedParentClipRect.location() - graphicsLayerParentLocation));
+  m_ancestorClippingLayer->setSize(FloatSize(snappedParentClipRect.size()));
 
   // backgroundRect is relative to compositingContainer, so subtract
   // snappedOffsetFromCompositedAncestor.X/snappedOffsetFromCompositedAncestor.Y
   // to get back to local coords.
   m_ancestorClippingLayer->setOffsetFromLayoutObject(
-      parentClipRect.location() - snappedOffsetFromCompositedAncestor);
+      snappedParentClipRect.location() - snappedOffsetFromCompositedAncestor);
 
   if (m_ancestorClippingMaskLayer) {
     m_ancestorClippingMaskLayer->setOffsetFromLayoutObject(
@@ -1196,7 +1199,7 @@
 
   // The primary layer is then parented in, and positioned relative to this
   // clipping layer.
-  graphicsLayerParentLocation = parentClipRect.location();
+  graphicsLayerParentLocation = snappedParentClipRect.location();
 }
 
 void CompositedLayerMapping::updateOverflowControlsHostLayerGeometry(
@@ -2896,17 +2899,18 @@
   // these clip rects or otherwise optimizing.
   ClipRectsContext clipRectsContext(ancestorPaintInfo->paintLayer,
                                     UncachedClipRects);
-  IntRect parentClipRect = pixelSnappedIntRect(
-      paintInfo.paintLayer->clipper(PaintLayer::DoNotUseGeometryMapper)
-          .backgroundClipRect(clipRectsContext)
-          .rect());
-  ASSERT(parentClipRect != LayoutRect::infiniteIntRect());
+  ClipRect parentClipRect;
+  paintInfo.paintLayer->clipper(PaintLayer::DoNotUseGeometryMapper)
+      .calculateBackgroundClipRect(clipRectsContext, parentClipRect);
+
+  IntRect snappedParentClipRect(pixelSnappedIntRect(parentClipRect.rect()));
+  DCHECK(snappedParentClipRect != LayoutRect::infiniteIntRect());
 
   // Convert from ancestor to local coordinates.
   IntSize ancestorToLocalOffset = paintInfo.offsetFromLayoutObject -
                                   ancestorPaintInfo->offsetFromLayoutObject;
-  parentClipRect.move(ancestorToLocalOffset);
-  return parentClipRect;
+  snappedParentClipRect.move(ancestorToLocalOffset);
+  return snappedParentClipRect;
 }
 
 void CompositedLayerMapping::doPaintTask(
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp
index ae0dcc6..53d5dfb 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp
@@ -161,14 +161,14 @@
         if (properties.unclippedAbsoluteBoundingBox.isEmpty())
           properties.unclippedAbsoluteBoundingBox.setSize(IntSize(1, 1));
 
-        IntRect clipRect = pixelSnappedIntRect(
-            layer->clipper(PaintLayer::DoNotUseGeometryMapper)
-                .backgroundClipRect(
-                    ClipRectsContext(m_rootLayer, AbsoluteClipRects))
-                .rect());
+        ClipRect clipRect;
+        layer->clipper(PaintLayer::DoNotUseGeometryMapper)
+            .calculateBackgroundClipRect(
+                ClipRectsContext(m_rootLayer, AbsoluteClipRects), clipRect);
+        IntRect snappedClipRect = pixelSnappedIntRect(clipRect.rect());
         properties.clippedAbsoluteBoundingBox =
             properties.unclippedAbsoluteBoundingBox;
-        properties.clippedAbsoluteBoundingBox.intersect(clipRect);
+        properties.clippedAbsoluteBoundingBox.intersect(snappedClipRect);
       }
 
       const PaintLayer* parent = layer->parent();
diff --git a/third_party/WebKit/Source/core/paint/ClipRect.h b/third_party/WebKit/Source/core/paint/ClipRect.h
index d1b13ab..0770bcb 100644
--- a/third_party/WebKit/Source/core/paint/ClipRect.h
+++ b/third_party/WebKit/Source/core/paint/ClipRect.h
@@ -43,7 +43,12 @@
   ClipRect(const LayoutRect& rect) : m_rect(rect), m_hasRadius(false) {}
 
   ClipRect(const FloatClipRect& rect)
-      : m_rect(LayoutRect(rect.rect())), m_hasRadius(rect.hasRadius()) {}
+      : m_rect(rect.rect()), m_hasRadius(rect.hasRadius()) {}
+
+  void setRect(const FloatClipRect& rect) {
+    m_rect = LayoutRect(rect.rect());
+    m_hasRadius = rect.hasRadius();
+  }
 
   const LayoutRect& rect() const { return m_rect; }
 
diff --git a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
index 55d92fa..bd696e9 100644
--- a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
@@ -128,11 +128,11 @@
       PropertyTreeState currentTreeState(
           context.treeBuilderContext.current.transform,
           context.treeBuilderContext.current.clip, nullptr);
-      result = LayoutRect(
-          geometryMapper
-              .sourceToDestinationVisualRect(FloatRect(rect), currentTreeState,
-                                             *containerContentsProperties)
-              .rect());
+
+      FloatRect floatRect(rect);
+      geometryMapper.sourceToDestinationVisualRect(
+          currentTreeState, *containerContentsProperties, floatRect);
+      result = LayoutRect(floatRect);
     }
 
     // Convert the result to the container's contents space.
@@ -183,12 +183,11 @@
             ->contentsProperties()
             ->transform();
     if (context.treeBuilderContext.current.transform != containerTransform) {
-      point = LayoutPoint(m_geometryMapper
-                              .sourceToDestinationRect(
-                                  FloatRect(FloatPoint(point), FloatSize()),
-                                  context.treeBuilderContext.current.transform,
-                                  containerTransform)
-                              .location());
+      FloatRect rect = FloatRect(FloatPoint(point), FloatSize());
+      m_geometryMapper.sourceToDestinationRect(
+          context.treeBuilderContext.current.transform, containerTransform,
+          rect);
+      point = LayoutPoint(rect.location());
     }
 
     // Convert the result to the container's contents space.
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
index 43186ec9..2a663e4 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -1646,9 +1646,10 @@
                                       overlayScrollbarClipBehavior);
     if (respectOverflowClip == IgnoreOverflowClip)
       clipRectsContext.setIgnoreOverflowClip();
-    ancestorClipRect = enclosingPaginationLayer()
-                           ->clipper(geometryMapperOption)
-                           .backgroundClipRect(clipRectsContext);
+
+    enclosingPaginationLayer()
+        ->clipper(geometryMapperOption)
+        .calculateBackgroundClipRect(clipRectsContext, ancestorClipRect);
     if (rootLayerIsInsidePaginationLayer)
       ancestorClipRect.moveBy(
           -rootLayer->visualOffsetFromAncestor(ancestorLayer));
@@ -1899,10 +1900,12 @@
 
     // Make sure the parent's clip rects have been calculated.
     if (parent()) {
-      ClipRect clipRect = clipper(PaintLayer::DoNotUseGeometryMapper)
-                              .backgroundClipRect(ClipRectsContext(
-                                  rootLayer, clipRectsCacheSlot,
-                                  ExcludeOverlayScrollbarSizeForHitTesting));
+      ClipRect clipRect;
+      clipper(PaintLayer::DoNotUseGeometryMapper)
+          .calculateBackgroundClipRect(
+              ClipRectsContext(rootLayer, clipRectsCacheSlot,
+                               ExcludeOverlayScrollbarSizeForHitTesting),
+              clipRect);
       // Go ahead and test the enclosing clip now.
       if (!clipRect.intersects(hitTestLocation))
         return nullptr;
@@ -2141,15 +2144,17 @@
     if (parent() != enclosingPaginationLayer()) {
       enclosingPaginationLayer()->convertToLayerCoords(
           rootLayer, offsetOfPaginationLayerFromRoot);
-      LayoutRect parentClipRect =
-          clipper(PaintLayer::DoNotUseGeometryMapper)
-              .backgroundClipRect(ClipRectsContext(
-                  enclosingPaginationLayer(), clipRectsCacheSlot,
-                  ExcludeOverlayScrollbarSizeForHitTesting))
-              .rect();
+
+      ClipRect parentClipRect;
+      clipper(PaintLayer::DoNotUseGeometryMapper)
+          .calculateBackgroundClipRect(
+              ClipRectsContext(enclosingPaginationLayer(), clipRectsCacheSlot,
+                               ExcludeOverlayScrollbarSizeForHitTesting),
+              parentClipRect);
+
       parentClipRect.moveBy(fragment.paginationOffset +
                             offsetOfPaginationLayerFromRoot);
-      clipRect.intersect(parentClipRect);
+      clipRect.intersect(parentClipRect.rect());
     }
 
     if (!hitTestLocation.intersects(clipRect))
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp b/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp
index 8e234784..ec07bc0 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp
@@ -200,7 +200,8 @@
     const PaintLayer& clippingRootLayer) const {
   ClipRectsContext context(&clippingRootLayer, PaintingClipRects);
   if (m_geometryMapper) {
-    ClipRect clipRect = clipRectWithGeometryMapper(context, false);
+    ClipRect clipRect;
+    calculateClipRectWithGeometryMapper(context, false, clipRect);
     applyOverflowClipToBackgroundRectWithGeometryMapper(context, clipRect);
     LayoutRect premappedRect = clipRect.rect();
 
@@ -216,9 +217,9 @@
                                      .paintProperties()
                                      ->localBorderBoxProperties()
                                      ->transform();
-    FloatRect clippedRectInLocalSpace =
-        m_geometryMapper->sourceToDestinationRect(
-            FloatRect(premappedRect), clipRootLayerTransform, layerTransform);
+    FloatRect clippedRectInLocalSpace(premappedRect);
+    m_geometryMapper->sourceToDestinationRect(
+        clipRootLayerTransform, layerTransform, clippedRectInLocalSpace);
     clippedRectInLocalSpace.moveBy(
         -FloatPoint(m_layer.layoutObject().paintOffset()));
 
@@ -270,10 +271,11 @@
                                   ->localBorderBoxProperties()
                                   ->transform();
 
-  FloatRect localRect(rectToMap);
-  localRect.moveBy(FloatPoint(m_layer.layoutObject().paintOffset()));
-  rectToMap = LayoutRect(m_geometryMapper->sourceToDestinationRect(
-      localRect, layerTransform, rootTransform));
+  FloatRect floatRect(rectToMap);
+  floatRect.moveBy(FloatPoint(m_layer.layoutObject().paintOffset()));
+  m_geometryMapper->sourceToDestinationRect(layerTransform, rootTransform,
+                                            floatRect);
+  rectToMap = LayoutRect(floatRect);
   rectToMap.moveBy(-context.rootLayer->layoutObject().paintOffset());
   rectToMap.move(context.subPixelAccumulation);
 }
@@ -291,7 +293,7 @@
     backgroundRect = ClipRect(LayoutRect(LayoutRect::infiniteIntRect()));
     foregroundRect = ClipRect(LayoutRect(LayoutRect::infiniteIntRect()));
   } else {
-    backgroundRect = clipRectWithGeometryMapper(context, false);
+    calculateClipRectWithGeometryMapper(context, false, backgroundRect);
 
     backgroundRect.move(context.subPixelAccumulation);
     backgroundRect.intersect(paintDirtyRect);
@@ -299,7 +301,7 @@
     applyOverflowClipToBackgroundRectWithGeometryMapper(context,
                                                         backgroundRect);
 
-    foregroundRect = clipRectWithGeometryMapper(context, true);
+    calculateClipRectWithGeometryMapper(context, true, foregroundRect);
     foregroundRect.move(context.subPixelAccumulation);
     foregroundRect.intersect(paintDirtyRect);
   }
@@ -340,7 +342,7 @@
   LayoutBoxModelObject& layoutObject = m_layer.layoutObject();
 
   if (!isClippingRoot && m_layer.parent()) {
-    backgroundRect = backgroundClipRect(context);
+    calculateBackgroundClipRect(context, backgroundRect);
     backgroundRect.move(context.subPixelAccumulation);
     backgroundRect.intersect(paintDirtyRect);
   } else {
@@ -441,9 +443,10 @@
   return parentRects.overflowClipRect();
 }
 
-ClipRect PaintLayerClipper::clipRectWithGeometryMapper(
+void PaintLayerClipper::calculateClipRectWithGeometryMapper(
     const ClipRectsContext& context,
-    bool isForeground) const {
+    bool isForeground,
+    ClipRect& output) const {
   DCHECK(m_geometryMapper);
   const auto* properties = m_layer.layoutObject().paintProperties();
   DCHECK(properties && properties->localBorderBoxProperties());
@@ -474,15 +477,12 @@
       propertyTreeState.setClip(properties->overflowClip());
   }
 
-  FloatClipRect clippedRectInRootLayerSpace =
+  const FloatClipRect& clippedRectInRootLayerSpace =
       m_geometryMapper->sourceToDestinationClipRect(
           propertyTreeState, destinationPropertyTreeState);
-  ClipRect clipRect(LayoutRect(clippedRectInRootLayerSpace.rect()));
-  if (clippedRectInRootLayerSpace.hasRadius())
-    clipRect.setHasRadius(true);
+  output.setRect(clippedRectInRootLayerSpace);
 
-  clipRect.moveBy(-context.rootLayer->layoutObject().paintOffset());
-  return clipRect;
+  output.moveBy(-context.rootLayer->layoutObject().paintOffset());
 }
 
 void PaintLayerClipper::applyOverflowClipToBackgroundRectWithGeometryMapper(
@@ -504,20 +504,23 @@
   clip.intersect(layerBoundsWithVisualOverflow);
 }
 
-ClipRect PaintLayerClipper::backgroundClipRect(
-    const ClipRectsContext& context) const {
+void PaintLayerClipper::calculateBackgroundClipRect(
+    const ClipRectsContext& context,
+    ClipRect& output) const {
   if (m_geometryMapper) {
     // TODO(chrishtr): fix the underlying bug that causes this situation.
-    if (!m_layer.layoutObject().paintProperties())
-      return ClipRect(LayoutRect(LayoutRect::infiniteIntRect()));
+    if (!m_layer.layoutObject().paintProperties()) {
+      output.setRect(FloatClipRect());
+      return;
+    }
 
-    ClipRect backgroundClipRect = clipRectWithGeometryMapper(context, false);
+    calculateClipRectWithGeometryMapper(context, false, output);
 #ifdef CHECK_CLIP_RECTS
     ClipRect testBackgroundClipRect =
         PaintLayerClipper(m_layer, nullptr).backgroundClipRect(context);
-    CHECK_RECTS_EQ(testBackgroundClipRect, backgroundClipRect);
+    CHECK_RECTS_EQ(testBackgroundClipRect, output);
 #endif
-    return backgroundClipRect;
+    return;
   }
   DCHECK(m_layer.parent());
   LayoutView* layoutView = m_layer.layoutObject().view();
@@ -531,17 +534,15 @@
         .getOrCalculateClipRects(context, *parentClipRects);
   }
 
-  ClipRect result = backgroundClipRectForPosition(
+  output = backgroundClipRectForPosition(
       *parentClipRects, m_layer.layoutObject().styleRef().position());
 
   // Note: infinite clipRects should not be scrolled here, otherwise they will
   // accidentally no longer be considered infinite.
   if (parentClipRects->fixed() &&
       &context.rootLayer->layoutObject() == layoutView &&
-      result != LayoutRect(LayoutRect::infiniteIntRect()))
-    result.move(LayoutSize(layoutView->frameView()->getScrollOffset()));
-
-  return result;
+      output != LayoutRect(LayoutRect::infiniteIntRect()))
+    output.move(LayoutSize(layoutView->frameView()->getScrollOffset()));
 }
 
 void PaintLayerClipper::getOrCalculateClipRects(const ClipRectsContext& context,
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerClipper.h b/third_party/WebKit/Source/core/paint/PaintLayerClipper.h
index 87d409d..61d860f 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerClipper.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayerClipper.h
@@ -183,7 +183,8 @@
 
   // Computes the same thing as backgroundRect in calculateRects(), but skips
   // applying CSS clip and the visualOverflowRect() of |m_layer|.
-  ClipRect backgroundClipRect(const ClipRectsContext&) const;
+  void calculateBackgroundClipRect(const ClipRectsContext&,
+                                   ClipRect& output) const;
 
   // This method figures out our layerBounds in coordinates relative to
   // |rootLayer|. It also computes our background and foreground clip rects
@@ -214,9 +215,10 @@
   bool shouldClipOverflow(const ClipRectsContext&) const;
   bool shouldRespectOverflowClip(const ClipRectsContext&) const;
 
-  // Returned clip rect is in the space of the context's rootLayer.
-  ClipRect clipRectWithGeometryMapper(const ClipRectsContext&,
-                                      bool isForeground) const;
+  // Returned clip rect in |output| is in the space of the context's rootLayer.
+  void calculateClipRectWithGeometryMapper(const ClipRectsContext&,
+                                           bool isForeground,
+                                           ClipRect& output) const;
   // Mutates the given rect into a rect in the space of the context's
   // rootLayer.
   void mapLocalToRootWithGeometryMapper(const ClipRectsContext&,
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
index a9aaa381..8aa1b45 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
@@ -750,8 +750,9 @@
       if (shouldRespectOverflowClip(paintFlags, m_paintLayer.layoutObject()) ==
           IgnoreOverflowClip)
         clipRectsContext.setIgnoreOverflowClip();
-      ancestorBackgroundClipRect = m_paintLayer.clipper(geometryMapperOption)
-                                       .backgroundClipRect(clipRectsContext);
+      m_paintLayer.clipper(geometryMapperOption)
+          .calculateBackgroundClipRect(clipRectsContext,
+                                       ancestorBackgroundClipRect);
     }
   }
 
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
index 60a699f..a2c6de28 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
@@ -83,14 +83,11 @@
     source.moveBy((sourceLayoutObject)->paintOffset());                        \
     const auto& contentsProperties =                                           \
         *(ancestorLayoutObject)->paintProperties()->contentsProperties();      \
-    LayoutRect actual = LayoutRect(                                            \
-        geometryMapper                                                         \
-            ->sourceToDestinationVisualRect(FloatRect(source),                 \
-                                            *(sourceLayoutObject)              \
-                                                 ->paintProperties()           \
-                                                 ->localBorderBoxProperties(), \
-                                            contentsProperties)                \
-            .rect());                                                          \
+    FloatRect actualFloatRect(source);                                         \
+    geometryMapper->sourceToDestinationVisualRect(                             \
+        *(sourceLayoutObject)->paintProperties()->localBorderBoxProperties(),  \
+        contentsProperties, actualFloatRect);                                  \
+    LayoutRect actual(actualFloatRect);                                        \
     actual.moveBy(-(ancestorLayoutObject)->paintOffset());                     \
     EXPECT_EQ(expected, actual)                                                \
         << "GeometryMapper: expected: " << expected.toString()                 \
diff --git a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
index bf339c7..10c5d49 100644
--- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
+++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
@@ -114,27 +114,25 @@
   return b == a;
 }
 
-FloatClipRect PrePaintTreeWalk::clipRectForContext(
+void PrePaintTreeWalk::computeClipRectForContext(
     const PaintPropertyTreeBuilderContext::ContainingBlockContext& context,
     const EffectPaintPropertyNode* effect,
     const PropertyTreeState& ancestorState,
     const LayoutPoint& ancestorPaintOffset,
-    bool& hasClip) {
+    bool& hasClip,
+    FloatClipRect& clipRect) {
   // Only return a non-infinite clip if clips differ, or the "ancestor" state is
   // actually an ancestor clip. This ensures no accuracy issues due to
   // transforms applied to infinite rects.
   if (isAncestorOfOrEqualTo(context.clip, ancestorState.clip()))
-    return FloatClipRect();
+    clipRect = FloatClipRect();
 
   hasClip = true;
-
   PropertyTreeState localState(context.transform, context.clip, effect);
 
-  FloatClipRect rect(
-      m_geometryMapper.sourceToDestinationClipRect(localState, ancestorState));
-
-  rect.moveBy(-FloatPoint(ancestorPaintOffset));
-  return rect;
+  clipRect =
+      m_geometryMapper.sourceToDestinationClipRect(localState, ancestorState);
+  clipRect.moveBy(-FloatPoint(ancestorPaintOffset));
 }
 
 void PrePaintTreeWalk::invalidatePaintLayerOptimizationsIfNeeded(
@@ -180,26 +178,31 @@
   RefPtr<ClipRects> clipRects = ClipRects::create();
   const LayoutPoint& ancestorPaintOffset =
       context.ancestorTransformedOrRootPaintLayer->layoutObject().paintOffset();
-  clipRects->setOverflowClipRect(
-      clipRectForContext(context.treeBuilderContext.current, effect,
-                         ancestorState, ancestorPaintOffset, hasClip));
+
+  FloatClipRect clipRect;
+  computeClipRectForContext(context.treeBuilderContext.current, effect,
+                            ancestorState, ancestorPaintOffset, hasClip,
+                            clipRect);
+  clipRects->setOverflowClipRect(clipRect);
 #ifdef CHECK_CLIP_RECTS
   CHECK(!hasClip ||
         clipRects->overflowClipRect() == oldClipRects.overflowClipRect())
       << "rect= " << clipRects->overflowClipRect().toString();
 #endif
 
-  clipRects->setFixedClipRect(
-      clipRectForContext(context.treeBuilderContext.fixedPosition, effect,
-                         ancestorState, ancestorPaintOffset, hasClip));
+  computeClipRectForContext(context.treeBuilderContext.fixedPosition, effect,
+                            ancestorState, ancestorPaintOffset, hasClip,
+                            clipRect);
+  clipRects->setFixedClipRect(clipRect);
 #ifdef CHECK_CLIP_RECTS
   CHECK(hasClip || clipRects->fixedClipRect() == oldClipRects.fixedClipRect())
       << " fixed=" << clipRects->fixedClipRect().toString();
 #endif
 
-  clipRects->setPosClipRect(
-      clipRectForContext(context.treeBuilderContext.absolutePosition, effect,
-                         ancestorState, ancestorPaintOffset, hasClip));
+  computeClipRectForContext(context.treeBuilderContext.absolutePosition, effect,
+                            ancestorState, ancestorPaintOffset, hasClip,
+                            clipRect);
+  clipRects->setPosClipRect(clipRect);
 #ifdef CHECK_CLIP_RECTS
   CHECK(!hasClip || clipRects->posClipRect() == oldClipRects.posClipRect())
       << " abs=" << clipRects->posClipRect().toString();
diff --git a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.h b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.h
index 6342924..b2ea1131 100644
--- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.h
+++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.h
@@ -34,15 +34,16 @@
   void invalidatePaintLayerOptimizationsIfNeeded(const LayoutObject&,
                                                  PrePaintTreeWalkContext&);
 
-  // Returns the clip applied to children for the given
+  // Returns in |clipRect| the clip applied to children for the given
   // contaiing block context + effect, in the space of ancestorState adjusted
   // by ancestorPaintOffset. Sets hasClip to true if a clip was applied.
-  FloatClipRect clipRectForContext(
+  void computeClipRectForContext(
       const PaintPropertyTreeBuilderContext::ContainingBlockContext&,
       const EffectPaintPropertyNode*,
       const PropertyTreeState& ancestorState,
       const LayoutPoint& ancestorPaintOffset,
-      bool& hasClip);
+      bool& hasClip,
+      FloatClipRect&);
 
   // Returns true if the tree walk should stop before processing this object.
   bool shouldEndWalkBefore(const LayoutObject&, const PrePaintTreeWalkContext&);
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp
index dddec42..0f9f3a4 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp
@@ -24,15 +24,16 @@
  */
 
 #include "modules/webaudio/AudioScheduledSourceNode.h"
+
+#include <algorithm>
 #include "bindings/core/v8/ExceptionState.h"
 #include "core/dom/ExceptionCode.h"
-#include "core/dom/ExecutionContextTask.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "modules/EventModules.h"
 #include "modules/webaudio/BaseAudioContext.h"
+#include "platform/CrossThreadFunctional.h"
 #include "platform/audio/AudioUtilities.h"
 #include "wtf/MathExtras.h"
-#include <algorithm>
 
 namespace blink {
 
@@ -226,10 +227,11 @@
   finishWithoutOnEnded();
 
   if (context()->getExecutionContext()) {
-    context()->getExecutionContext()->postTask(
-        TaskType::MediaElementEvent, BLINK_FROM_HERE,
-        createCrossThreadTask(&AudioScheduledSourceHandler::notifyEnded,
-                              PassRefPtr<AudioScheduledSourceHandler>(this)));
+    TaskRunnerHelper::get(TaskType::MediaElementEvent,
+                          context()->getExecutionContext())
+        ->postTask(BLINK_FROM_HERE,
+                   crossThreadBind(&AudioScheduledSourceHandler::notifyEnded,
+                                   wrapPassRefPtr(this)));
   }
 }
 
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp
index 5a77991..d2b8b5a 100644
--- a/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp
@@ -25,13 +25,13 @@
 
 #include "modules/webaudio/MediaElementAudioSourceNode.h"
 
-#include "core/dom/ExecutionContextTask.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "core/html/HTMLMediaElement.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "modules/webaudio/AudioNodeOutput.h"
 #include "modules/webaudio/BaseAudioContext.h"
 #include "modules/webaudio/MediaElementAudioSourceOptions.h"
+#include "platform/CrossThreadFunctional.h"
 #include "platform/audio/AudioUtilities.h"
 #include "platform/weborigin/SecurityOrigin.h"
 #include "wtf/Locker.h"
@@ -196,12 +196,12 @@
         // media element source, and only if we have a document to print to.
         m_maybePrintCORSMessage = false;
         if (context()->getExecutionContext()) {
-          context()->getExecutionContext()->postTask(
-              TaskType::MediaElementEvent, BLINK_FROM_HERE,
-              createCrossThreadTask(
-                  &MediaElementAudioSourceHandler::printCORSMessage,
-                  PassRefPtr<MediaElementAudioSourceHandler>(this),
-                  m_currentSrcString));
+          TaskRunnerHelper::get(TaskType::MediaElementEvent,
+                                context()->getExecutionContext())
+              ->postTask(BLINK_FROM_HERE,
+                         crossThreadBind(
+                             &MediaElementAudioSourceHandler::printCORSMessage,
+                             wrapPassRefPtr(this), m_currentSrcString));
         }
       }
       outputBus->zero();
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
index 609d7f1..954586c 100644
--- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
@@ -25,19 +25,19 @@
 
 #include "modules/webaudio/OfflineAudioDestinationNode.h"
 
-#include "core/dom/ExecutionContextTask.h"
+#include <algorithm>
 #include "core/dom/TaskRunnerHelper.h"
 #include "modules/webaudio/AudioNodeInput.h"
 #include "modules/webaudio/AudioNodeOutput.h"
 #include "modules/webaudio/BaseAudioContext.h"
 #include "modules/webaudio/OfflineAudioContext.h"
+#include "platform/CrossThreadFunctional.h"
 #include "platform/audio/AudioBus.h"
 #include "platform/audio/AudioUtilities.h"
 #include "platform/audio/DenormalDisabler.h"
 #include "platform/audio/HRTFDatabaseLoader.h"
 #include "public/platform/Platform.h"
 #include "wtf/PtrUtil.h"
-#include <algorithm>
 
 namespace blink {
 
@@ -221,11 +221,12 @@
 
   // The actual rendering has been suspended. Notify the context.
   if (context()->getExecutionContext()) {
-    context()->getExecutionContext()->postTask(
-        TaskType::MediaElementEvent, BLINK_FROM_HERE,
-        createCrossThreadTask(&OfflineAudioDestinationHandler::notifySuspend,
-                              PassRefPtr<OfflineAudioDestinationHandler>(this),
-                              context()->currentSampleFrame()));
+    TaskRunnerHelper::get(TaskType::MediaElementEvent,
+                          context()->getExecutionContext())
+        ->postTask(BLINK_FROM_HERE,
+                   crossThreadBind(
+                       &OfflineAudioDestinationHandler::notifySuspend,
+                       wrapPassRefPtr(this), context()->currentSampleFrame()));
   }
 }
 
@@ -234,10 +235,12 @@
 
   // The actual rendering has been completed. Notify the context.
   if (context()->getExecutionContext()) {
-    context()->getExecutionContext()->postTask(
-        TaskType::MediaElementEvent, BLINK_FROM_HERE,
-        createCrossThreadTask(&OfflineAudioDestinationHandler::notifyComplete,
-                              wrapPassRefPtr(this)));
+    TaskRunnerHelper::get(TaskType::MediaElementEvent,
+                          context()->getExecutionContext())
+        ->postTask(
+            BLINK_FROM_HERE,
+            crossThreadBind(&OfflineAudioDestinationHandler::notifyComplete,
+                            wrapPassRefPtr(this)));
   }
 }
 
diff --git a/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp b/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp
index 19dc6b0..d84fd23d 100644
--- a/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp
@@ -27,13 +27,13 @@
 #include "bindings/core/v8/ExceptionState.h"
 #include "core/dom/ExceptionCode.h"
 #include "core/dom/ExecutionContext.h"
-#include "core/dom/ExecutionContextTask.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "modules/webaudio/AudioBuffer.h"
 #include "modules/webaudio/AudioNodeInput.h"
 #include "modules/webaudio/AudioNodeOutput.h"
 #include "modules/webaudio/AudioProcessingEvent.h"
 #include "modules/webaudio/BaseAudioContext.h"
+#include "platform/CrossThreadFunctional.h"
 #include "platform/WaitableEvent.h"
 #include "public/platform/Platform.h"
 
@@ -206,23 +206,26 @@
       if (context()->hasRealtimeConstraint()) {
         // Fire the event on the main thread with the appropriate buffer
         // index.
-        context()->getExecutionContext()->postTask(
-            TaskType::MediaElementEvent, BLINK_FROM_HERE,
-            createCrossThreadTask(&ScriptProcessorHandler::fireProcessEvent,
-                                  crossThreadUnretained(this),
-                                  m_doubleBufferIndex));
+        TaskRunnerHelper::get(TaskType::MediaElementEvent,
+                              context()->getExecutionContext())
+            ->postTask(BLINK_FROM_HERE,
+                       crossThreadBind(
+                           &ScriptProcessorHandler::fireProcessEvent,
+                           crossThreadUnretained(this), m_doubleBufferIndex));
       } else {
         // If this node is in the offline audio context, use the
         // waitable event to synchronize to the offline rendering thread.
         std::unique_ptr<WaitableEvent> waitableEvent =
             WTF::makeUnique<WaitableEvent>();
 
-        context()->getExecutionContext()->postTask(
-            TaskType::MediaElementEvent, BLINK_FROM_HERE,
-            createCrossThreadTask(
-                &ScriptProcessorHandler::fireProcessEventForOfflineAudioContext,
-                crossThreadUnretained(this), m_doubleBufferIndex,
-                crossThreadUnretained(waitableEvent.get())));
+        TaskRunnerHelper::get(TaskType::MediaElementEvent,
+                              context()->getExecutionContext())
+            ->postTask(BLINK_FROM_HERE,
+                       crossThreadBind(
+                           &ScriptProcessorHandler::
+                               fireProcessEventForOfflineAudioContext,
+                           crossThreadUnretained(this), m_doubleBufferIndex,
+                           crossThreadUnretained(waitableEvent.get())));
 
         // Okay to block the offline audio rendering thread since it is
         // not the actual audio device thread.
diff --git a/third_party/WebKit/Source/modules/webdatabase/Database.cpp b/third_party/WebKit/Source/modules/webdatabase/Database.cpp
index 8c2b1e4..5d56244 100644
--- a/third_party/WebKit/Source/modules/webdatabase/Database.cpp
+++ b/third_party/WebKit/Source/modules/webdatabase/Database.cpp
@@ -25,9 +25,9 @@
 
 #include "modules/webdatabase/Database.h"
 
+#include <memory>
 #include "core/dom/ExceptionCode.h"
 #include "core/dom/ExecutionContext.h"
-#include "core/dom/ExecutionContextTask.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "core/html/VoidCallback.h"
 #include "core/inspector/ConsoleMessage.h"
@@ -49,6 +49,7 @@
 #include "modules/webdatabase/StorageLog.h"
 #include "modules/webdatabase/sqlite/SQLiteStatement.h"
 #include "modules/webdatabase/sqlite/SQLiteTransaction.h"
+#include "platform/CrossThreadFunctional.h"
 #include "platform/WaitableEvent.h"
 #include "platform/heap/SafePoint.h"
 #include "public/platform/Platform.h"
@@ -56,7 +57,6 @@
 #include "public/platform/WebSecurityOrigin.h"
 #include "wtf/Atomics.h"
 #include "wtf/CurrentTime.h"
-#include <memory>
 
 // Registering "opened" databases with the DatabaseTracker
 // =======================================================
@@ -248,6 +248,8 @@
       m_contextThreadSecurityOrigin->isolatedCopy();
   ASSERT(m_databaseContext->databaseThread());
   ASSERT(m_databaseContext->isContextThread());
+  m_databaseTaskRunner =
+      TaskRunnerHelper::get(TaskType::DatabaseAccess, getExecutionContext());
 }
 
 Database::~Database() {
@@ -873,10 +875,10 @@
     if (callback) {
       std::unique_ptr<SQLErrorData> error = SQLErrorData::create(
           SQLError::kUnknownErr, "database has been closed");
-      TaskRunnerHelper::get(TaskType::DatabaseAccess, getExecutionContext())
-          ->postTask(BLINK_FROM_HERE, WTF::bind(&callTransactionErrorCallback,
-                                                wrapPersistent(callback),
-                                                WTF::passed(std::move(error))));
+      getDatabaseTaskRunner()->postTask(
+          BLINK_FROM_HERE,
+          WTF::bind(&callTransactionErrorCallback, wrapPersistent(callback),
+                    WTF::passed(std::move(error))));
     }
   }
 }
@@ -884,10 +886,9 @@
 void Database::scheduleTransactionCallback(SQLTransaction* transaction) {
   // The task is constructed in a database thread, and destructed in the
   // context thread.
-  getExecutionContext()->postTask(
-      TaskType::DatabaseAccess, BLINK_FROM_HERE,
-      createCrossThreadTask(&SQLTransaction::performPendingCallback,
-                            wrapCrossThreadPersistent(transaction)));
+  getDatabaseTaskRunner()->postTask(
+      BLINK_FROM_HERE, crossThreadBind(&SQLTransaction::performPendingCallback,
+                                       wrapCrossThreadPersistent(transaction)));
 }
 
 Vector<String> Database::performGetTableNames() {
@@ -951,4 +952,8 @@
   return static_cast<bool>(acquireLoad(&m_opened));
 }
 
+WebTaskRunner* Database::getDatabaseTaskRunner() const {
+  return m_databaseTaskRunner.get();
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/webdatabase/Database.h b/third_party/WebKit/Source/modules/webdatabase/Database.h
index 77aa675..75a7ef0d 100644
--- a/third_party/WebKit/Source/modules/webdatabase/Database.h
+++ b/third_party/WebKit/Source/modules/webdatabase/Database.h
@@ -115,6 +115,7 @@
     return m_databaseContext.get();
   }
   ExecutionContext* getExecutionContext() const;
+  WebTaskRunner* getDatabaseTaskRunner() const;
 
  private:
   class DatabaseOpenTask;
@@ -176,6 +177,10 @@
   RefPtr<SecurityOrigin> m_databaseThreadSecurityOrigin;
   Member<DatabaseContext>
       m_databaseContext;  // Associated with m_executionContext.
+  // TaskRunnerHelper::get is not thread-safe, so we save WebTaskRunner for
+  // TaskType::DatabaseAccess for later use as the constructor runs in the main
+  // thread.
+  RefPtr<WebTaskRunner> m_databaseTaskRunner;
 
   String m_name;
   String m_expectedVersion;
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp
index 577eda7b..817a1e4 100644
--- a/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp
+++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp
@@ -32,13 +32,13 @@
 
 #include "core/dom/Document.h"
 #include "core/dom/ExecutionContext.h"
-#include "core/dom/ExecutionContextTask.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "modules/webdatabase/Database.h"
 #include "modules/webdatabase/DatabaseClient.h"
 #include "modules/webdatabase/DatabaseContext.h"
 #include "modules/webdatabase/QuotaTracker.h"
 #include "modules/webdatabase/sqlite/SQLiteFileSystem.h"
+#include "platform/CrossThreadFunctional.h"
 #include "platform/weborigin/SecurityOrigin.h"
 #include "platform/weborigin/SecurityOriginHash.h"
 #include "public/platform/Platform.h"
@@ -187,12 +187,12 @@
 
   // We have to call closeImmediately() on the context thread.
   for (DatabaseSet::iterator it = databaseSet->begin();
-       it != databaseSet->end(); ++it)
-    (*it)->getDatabaseContext()->getExecutionContext()->postTask(
-        TaskType::DatabaseAccess, BLINK_FROM_HERE,
-        createCrossThreadTask(&DatabaseTracker::closeOneDatabaseImmediately,
-                              crossThreadUnretained(this), originString, name,
-                              *it));
+       it != databaseSet->end(); ++it) {
+    (*it)->getDatabaseTaskRunner()->postTask(
+        BLINK_FROM_HERE,
+        crossThreadBind(&DatabaseTracker::closeOneDatabaseImmediately,
+                        crossThreadUnretained(this), originString, name, *it));
+  }
 }
 
 void DatabaseTracker::forEachOpenDatabaseInPage(
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp
index 3cbac44..4f4d5d65 100644
--- a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp
+++ b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp
@@ -31,10 +31,11 @@
 #include "modules/webdatabase/SQLTransactionClient.h"
 
 #include "core/dom/ExecutionContext.h"
-#include "core/dom/ExecutionContextTask.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "modules/webdatabase/Database.h"
 #include "modules/webdatabase/DatabaseContext.h"
+#include "platform/CrossThreadFunctional.h"
+#include "platform/WebTaskRunner.h"
 #include "platform/weborigin/SecurityOrigin.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebDatabaseObserver.h"
@@ -67,10 +68,9 @@
       database->getDatabaseContext()->getExecutionContext();
   SecurityOrigin* origin = database->getSecurityOrigin();
   if (!executionContext->isContextThread()) {
-    executionContext->postTask(
-        TaskType::DatabaseAccess, BLINK_FROM_HERE,
-        createCrossThreadTask(&databaseModifiedCrossThread,
-                              origin->toRawString(), databaseName));
+    database->getDatabaseTaskRunner()->postTask(
+        BLINK_FROM_HERE, crossThreadBind(&databaseModifiedCrossThread,
+                                         origin->toRawString(), databaseName));
   } else {
     databaseModified(WebSecurityOrigin(origin), databaseName);
   }
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
index 9050f49..b0927fb 100644
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
@@ -289,11 +289,11 @@
   }
 #endif
 
-  FloatRect combinedClip =
-      geometryMapper.localToAncestorClipRect(localState, ancestorState).rect();
+  const FloatClipRect& combinedClip =
+      geometryMapper.localToAncestorClipRect(localState, ancestorState);
 
   ccList.CreateAndAppendPairedBeginItem<cc::FloatClipDisplayItem>(
-      gfx::RectF(combinedClip));
+      gfx::RectF(combinedClip.rect()));
   endDisplayItems.push_back(EndClip);
 }
 
@@ -604,19 +604,15 @@
                                           ClipPaintPropertyNode::root(),
                                           EffectPaintPropertyNode::root());
 
-  FloatRect paintChunkScreenVisualRect =
-      geometryMapper
-          .localToAncestorVisualRect(paintChunk.bounds,
-                                     paintChunk.properties.propertyTreeState,
-                                     rootPropertyTreeState)
-          .rect();
+  FloatRect paintChunkScreenVisualRect = paintChunk.bounds;
+  geometryMapper.localToAncestorVisualRect(
+      paintChunk.properties.propertyTreeState, rootPropertyTreeState,
+      paintChunkScreenVisualRect);
 
-  FloatRect pendingLayerScreenVisualRect =
-      geometryMapper
-          .localToAncestorVisualRect(candidatePendingLayer.bounds,
-                                     candidatePendingLayer.propertyTreeState,
-                                     rootPropertyTreeState)
-          .rect();
+  FloatRect pendingLayerScreenVisualRect = candidatePendingLayer.bounds;
+  geometryMapper.localToAncestorVisualRect(
+      candidatePendingLayer.propertyTreeState, rootPropertyTreeState,
+      pendingLayerScreenVisualRect);
 
   return paintChunkScreenVisualRect.intersects(pendingLayerScreenVisualRect);
 }
@@ -637,9 +633,9 @@
   paintChunks.push_back(&paintChunk);
   FloatRect mappedBounds = paintChunk.bounds;
   if (geometryMapper) {
-    mappedBounds = geometryMapper->localToAncestorRect(
-        mappedBounds, paintChunk.properties.propertyTreeState.transform(),
-        propertyTreeState.transform());
+    geometryMapper->localToAncestorRect(
+        paintChunk.properties.propertyTreeState.transform(),
+        propertyTreeState.transform(), mappedBounds);
   }
   bounds.unite(mappedBounds);
   if (bounds.size() != paintChunks[0]->bounds.size()) {
diff --git a/third_party/WebKit/Source/platform/graphics/paint/FloatClipRect.h b/third_party/WebKit/Source/platform/graphics/paint/FloatClipRect.h
index cf663ef..954201d6 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/FloatClipRect.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/FloatClipRect.h
@@ -20,7 +20,7 @@
         m_hasRadius(false),
         m_isInfinite(true) {}
 
-  FloatClipRect(const FloatRect& rect)
+  explicit FloatClipRect(const FloatRect& rect)
       : m_rect(rect), m_hasRadius(false), m_isInfinite(false) {}
 
   const FloatRect& rect() const { return m_rect; }
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
index 733cd67..6258d642 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
@@ -9,27 +9,26 @@
 
 namespace blink {
 
-FloatClipRect GeometryMapper::sourceToDestinationVisualRect(
-    const FloatRect& rect,
-    const PropertyTreeState& sourceState,
-    const PropertyTreeState& destinationState) {
-  bool success = false;
-  FloatClipRect result = sourceToDestinationVisualRectInternal(
-      rect, sourceState, destinationState, success);
-  DCHECK(success);
-  return result;
-}
-
-FloatClipRect GeometryMapper::sourceToDestinationVisualRectInternal(
-    const FloatRect& rect,
+void GeometryMapper::sourceToDestinationVisualRect(
     const PropertyTreeState& sourceState,
     const PropertyTreeState& destinationState,
+    FloatRect& rect) {
+  bool success = false;
+  sourceToDestinationVisualRectInternal(sourceState, destinationState, rect,
+                                        success);
+  DCHECK(success);
+}
+
+void GeometryMapper::sourceToDestinationVisualRectInternal(
+    const PropertyTreeState& sourceState,
+    const PropertyTreeState& destinationState,
+    FloatRect& mappingRect,
     bool& success) {
-  FloatClipRect result = localToAncestorVisualRectInternal(
-      rect, sourceState, destinationState, success);
+  localToAncestorVisualRectInternal(sourceState, destinationState, mappingRect,
+                                    success);
   // Success if destinationState is an ancestor state.
   if (success)
-    return result;
+    return;
 
   // Otherwise first map to the lowest common ancestor, then map to destination.
   const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor(
@@ -42,78 +41,75 @@
   PropertyTreeState lcaState = destinationState;
   lcaState.setTransform(lcaTransform);
 
-  result =
-      localToAncestorVisualRectInternal(rect, sourceState, lcaState, success);
+  localToAncestorVisualRectInternal(sourceState, lcaState, mappingRect,
+                                    success);
   if (!success)
-    return result;
-  if (!result.isInfinite()) {
-    FloatRect final = ancestorToLocalRect(result.rect(), lcaTransform,
-                                          destinationState.transform());
-    result.setRect(final);
-  }
-  return result;
+    return;
+
+  ancestorToLocalRect(lcaTransform, destinationState.transform(), mappingRect);
 }
 
-FloatRect GeometryMapper::sourceToDestinationRect(
-    const FloatRect& rect,
+void GeometryMapper::sourceToDestinationRect(
     const TransformPaintPropertyNode* sourceTransformNode,
-    const TransformPaintPropertyNode* destinationTransformNode) {
+    const TransformPaintPropertyNode* destinationTransformNode,
+    FloatRect& mappingRect) {
   bool success = false;
-  FloatRect result = localToAncestorRectInternal(
-      rect, sourceTransformNode, destinationTransformNode, success);
+  localToAncestorRectInternal(sourceTransformNode, destinationTransformNode,
+                              mappingRect, success);
   // Success if destinationTransformNode is an ancestor of sourceTransformNode.
   if (success)
-    return result;
+    return;
 
   // Otherwise first map to the least common ancestor, then map to destination.
   const TransformPaintPropertyNode* lcaTransform =
       lowestCommonAncestor(sourceTransformNode, destinationTransformNode);
   DCHECK(lcaTransform);
 
-  FloatRect lcaRect =
-      localToAncestorRect(rect, sourceTransformNode, lcaTransform);
-  return ancestorToLocalRect(lcaRect, lcaTransform, destinationTransformNode);
+  localToAncestorRect(sourceTransformNode, lcaTransform, mappingRect);
+  ancestorToLocalRect(lcaTransform, destinationTransformNode, mappingRect);
 }
 
-FloatClipRect GeometryMapper::localToAncestorVisualRect(
-    const FloatRect& rect,
-    const PropertyTreeState& localState,
-    const PropertyTreeState& ancestorState) {
-  bool success = false;
-  FloatClipRect result = localToAncestorVisualRectInternal(
-      rect, localState, ancestorState, success);
-  DCHECK(success);
-  return result;
-}
-
-FloatClipRect GeometryMapper::localToAncestorVisualRectInternal(
-    const FloatRect& rect,
+void GeometryMapper::localToAncestorVisualRect(
     const PropertyTreeState& localState,
     const PropertyTreeState& ancestorState,
+    FloatRect& mappingRect) {
+  bool success = false;
+  localToAncestorVisualRectInternal(localState, ancestorState, mappingRect,
+                                    success);
+  DCHECK(success);
+}
+
+void GeometryMapper::localToAncestorVisualRectInternal(
+    const PropertyTreeState& localState,
+    const PropertyTreeState& ancestorState,
+    FloatRect& rectToMap,
     bool& success) {
   if (localState == ancestorState) {
     success = true;
-    return rect;
+    return;
   }
 
   if (localState.effect() != ancestorState.effect()) {
-    return slowLocalToAncestorVisualRectWithEffects(rect, localState,
-                                                    ancestorState, success);
+    slowLocalToAncestorVisualRectWithEffects(localState, ancestorState,
+                                             rectToMap, success);
+    return;
   }
 
   const auto& transformMatrix = localToAncestorMatrixInternal(
       localState.transform(), ancestorState.transform(), success);
-  if (!success)
-    return rect;
+  if (!success) {
+    return;
+  }
 
-  FloatRect mappedRect = transformMatrix.mapRect(rect);
+  FloatRect mappedRect = transformMatrix.mapRect(rectToMap);
 
-  FloatClipRect clipRect =
+  const FloatClipRect& clipRect =
       localToAncestorClipRectInternal(localState.clip(), ancestorState.clip(),
                                       ancestorState.transform(), success);
 
   if (success) {
-    clipRect.intersect(mappedRect);
+    rectToMap = clipRect.rect();
+    rectToMap.intersect(mappedRect);
   } else if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
     // On SPv1 we may fail when the paint invalidation container creates an
     // overflow clip (in ancestorState) which is not in localState of an
@@ -123,18 +119,15 @@
     // Ignore it for SPv1 for now.
     success = true;
   }
-
-  return clipRect;
 }
 
-FloatClipRect GeometryMapper::slowLocalToAncestorVisualRectWithEffects(
-    const FloatRect& rect,
+void GeometryMapper::slowLocalToAncestorVisualRectWithEffects(
     const PropertyTreeState& localState,
     const PropertyTreeState& ancestorState,
+    FloatRect& mappingRect,
     bool& success) {
   PropertyTreeState lastTransformAndClipState(localState.transform(),
                                               localState.clip(), nullptr);
-  FloatClipRect result(rect);
 
   for (const auto* effect = localState.effect();
        effect && effect != ancestorState.effect(); effect = effect->parent()) {
@@ -143,75 +136,62 @@
 
     PropertyTreeState transformAndClipState(effect->localTransformSpace(),
                                             effect->outputClip(), nullptr);
-    bool hasRadius = result.hasRadius();
-    result = sourceToDestinationVisualRectInternal(
-        result.rect(), lastTransformAndClipState, transformAndClipState,
-        success);
-    hasRadius |= result.hasRadius();
-    if (!success) {
-      if (hasRadius)
-        result.setHasRadius();
-      return result;
-    }
+    sourceToDestinationVisualRectInternal(
+        lastTransformAndClipState, transformAndClipState, mappingRect, success);
+    if (!success)
+      return;
 
-    result = effect->mapRect(result.rect());
-    if (hasRadius)
-      result.setHasRadius();
+    mappingRect = effect->mapRect(mappingRect);
     lastTransformAndClipState = transformAndClipState;
   }
 
   PropertyTreeState finalTransformAndClipState(ancestorState.transform(),
                                                ancestorState.clip(), nullptr);
-  bool hasRadius = result.hasRadius();
-  result = sourceToDestinationVisualRectInternal(
-      result.rect(), lastTransformAndClipState, finalTransformAndClipState,
-      success);
-  if (hasRadius || result.hasRadius())
-    result.setHasRadius();
-  return result;
+  sourceToDestinationVisualRectInternal(lastTransformAndClipState,
+                                        finalTransformAndClipState, mappingRect,
+                                        success);
 }
 
-FloatRect GeometryMapper::localToAncestorRect(
-    const FloatRect& rect,
-    const TransformPaintPropertyNode* localTransformNode,
-    const TransformPaintPropertyNode* ancestorTransformNode) {
-  bool success = false;
-  FloatRect result = localToAncestorRectInternal(
-      rect, localTransformNode, ancestorTransformNode, success);
-  DCHECK(success);
-  return result;
-}
-
-FloatRect GeometryMapper::localToAncestorRectInternal(
-    const FloatRect& rect,
+void GeometryMapper::localToAncestorRect(
     const TransformPaintPropertyNode* localTransformNode,
     const TransformPaintPropertyNode* ancestorTransformNode,
+    FloatRect& mappingRect) {
+  bool success = false;
+  localToAncestorRectInternal(localTransformNode, ancestorTransformNode,
+                              mappingRect, success);
+  DCHECK(success);
+}
+
+void GeometryMapper::localToAncestorRectInternal(
+    const TransformPaintPropertyNode* localTransformNode,
+    const TransformPaintPropertyNode* ancestorTransformNode,
+    FloatRect& mappingRect,
     bool& success) {
   if (localTransformNode == ancestorTransformNode) {
     success = true;
-    return rect;
+    return;
   }
 
   const auto& transformMatrix = localToAncestorMatrixInternal(
       localTransformNode, ancestorTransformNode, success);
   if (!success)
-    return rect;
-  return transformMatrix.mapRect(rect);
+    return;
+  mappingRect = transformMatrix.mapRect(mappingRect);
 }
 
-FloatRect GeometryMapper::ancestorToLocalRect(
-    const FloatRect& rect,
+void GeometryMapper::ancestorToLocalRect(
     const TransformPaintPropertyNode* ancestorTransformNode,
-    const TransformPaintPropertyNode* localTransformNode) {
+    const TransformPaintPropertyNode* localTransformNode,
+    FloatRect& rect) {
   if (localTransformNode == ancestorTransformNode)
-    return rect;
+    return;
 
   const auto& transformMatrix =
       localToAncestorMatrix(localTransformNode, ancestorTransformNode);
   DCHECK(transformMatrix.isInvertible());
 
   // TODO(chrishtr): Cache the inverse?
-  return transformMatrix.inverse().mapRect(rect);
+  rect = transformMatrix.inverse().mapRect(rect);
 }
 
 FloatClipRect GeometryMapper::localToAncestorClipRect(
@@ -227,22 +207,22 @@
   return result;
 }
 
-FloatClipRect GeometryMapper::sourceToDestinationClipRect(
+const FloatClipRect& GeometryMapper::sourceToDestinationClipRect(
     const PropertyTreeState& sourceState,
     const PropertyTreeState& destinationState) {
   bool success = false;
-  FloatClipRect result = sourceToDestinationClipRectInternal(
+  const FloatClipRect& result = sourceToDestinationClipRectInternal(
       sourceState, destinationState, success);
   DCHECK(success);
 
   return result;
 }
 
-FloatClipRect GeometryMapper::sourceToDestinationClipRectInternal(
+const FloatClipRect& GeometryMapper::sourceToDestinationClipRectInternal(
     const PropertyTreeState& sourceState,
     const PropertyTreeState& destinationState,
     bool& success) {
-  FloatClipRect result = localToAncestorClipRectInternal(
+  const FloatClipRect& result = localToAncestorClipRectInternal(
       sourceState.clip(), destinationState.clip(), destinationState.transform(),
       success);
   // Success if destinationState is an ancestor state.
@@ -261,8 +241,8 @@
   PropertyTreeState lcaState = destinationState;
   lcaState.setTransform(lcaTransform);
 
-  result = localToAncestorClipRectInternal(sourceState.clip(), lcaState.clip(),
-                                           lcaState.transform(), success);
+  const FloatClipRect& result2 = localToAncestorClipRectInternal(
+      sourceState.clip(), lcaState.clip(), lcaState.transform(), success);
   if (!success) {
     if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
       // On SPv1 we may fail when the paint invalidation container creates an
@@ -273,14 +253,17 @@
       // Ignore it for SPv1 for now.
       success = true;
     }
-    return result;
+    return result2;
   }
-  if (!result.isInfinite()) {
-    FloatRect final = ancestorToLocalRect(result.rect(), lcaTransform,
-                                          destinationState.transform());
-    result.setRect(final);
+  if (!result2.isInfinite()) {
+    FloatRect rect = result2.rect();
+    ancestorToLocalRect(lcaTransform, destinationState.transform(), rect);
+    m_tempRect.setRect(rect);
+    if (result2.hasRadius())
+      m_tempRect.setHasRadius();
+    return m_tempRect;
   }
-  return result;
+  return result2;
 }
 
 const FloatClipRect& GeometryMapper::localToAncestorClipRectInternal(
@@ -329,6 +312,7 @@
     clip.intersect(mappedRect);
     if ((*it)->clipRect().isRounded())
       clip.setHasRadius();
+
     (*it)->getClipCache().setCachedClip(clipAndTransform, clip);
   }
 
@@ -337,6 +321,7 @@
   const FloatClipRect* cachedClip =
       descendant->getClipCache().getCachedClip(clipAndTransform);
   DCHECK(cachedClip);
+  CHECK(clip.hasRadius() == cachedClip->hasRadius());
   return *cachedClip;
 }
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
index 9b1fff2b..c5a8ec36 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
@@ -20,6 +20,10 @@
 // change. If any mutation occurs, a new GeometryMapper object must be allocated
 // corresponding to the new state.
 //
+// ** WARNING** Callers to the methods below may not assume that any const
+// references returned remain const across multiple calls into GeometryMapper.
+// If needed, callers must store local copies of the return values.
+//
 // Design document: http://bit.ly/28P4FDA
 //
 // TODO(chrishtr): take effect tree into account.
@@ -44,17 +48,20 @@
   //
   // DCHECK fails if the clip of |destinationState| is not an ancestor of the
   // clip of |sourceState|, or the inverse transform is not invertible.
-  FloatClipRect sourceToDestinationVisualRect(
-      const FloatRect&,
-      const PropertyTreeState& sourceState,
-      const PropertyTreeState& destinationState);
+  //
+  // |mappingRect| is both input and output.
+  void sourceToDestinationVisualRect(const PropertyTreeState& sourceState,
+                                     const PropertyTreeState& destinationState,
+                                     FloatRect& mappingRect);
 
   // Same as sourceToDestinationVisualRect() except that only transforms are
   // applied.
-  FloatRect sourceToDestinationRect(
-      const FloatRect&,
+  //
+  // |mappingRect| is both input and output.
+  void sourceToDestinationRect(
       const TransformPaintPropertyNode* sourceTransformNode,
-      const TransformPaintPropertyNode* destinationTransformNode);
+      const TransformPaintPropertyNode* destinationTransformNode,
+      FloatRect& mappingRect);
 
   // Maps from a rect in |localTransformSpace| to its visual rect in
   // |ancestorState|. This is computed by multiplying the rect by its combined
@@ -68,10 +75,11 @@
   // DCHECK fails if any of the paint property tree nodes in
   // |localTransformState| are not equal to or a descendant of that in
   // |ancestorState|.
-  FloatClipRect localToAncestorVisualRect(
-      const FloatRect&,
-      const PropertyTreeState& localTransformState,
-      const PropertyTreeState& ancestorState);
+  //
+  // |mappingRect| is both input and output.
+  void localToAncestorVisualRect(const PropertyTreeState& localTransformState,
+                                 const PropertyTreeState& ancestorState,
+                                 FloatRect& mappingRect);
 
   // Maps from a rect in |localTransformNode| space to its transformed rect in
   // |ancestorTransformNode| space. This is computed by multiplying the rect by
@@ -80,10 +88,12 @@
   //
   // DCHECK fails if |localTransformNode| is not equal to or a descendant of
   // |ancestorTransformNode|.
-  FloatRect localToAncestorRect(
-      const FloatRect&,
+  //
+  //|mappingRect| is both input and output.
+  void localToAncestorRect(
       const TransformPaintPropertyNode* localTransformNode,
-      const TransformPaintPropertyNode* ancestorTransformNode);
+      const TransformPaintPropertyNode* ancestorTransformNode,
+      FloatRect& mappingRect);
 
   // Maps from a rect in |ancestorTransformNode| space to its transformed rect
   // in |localTransformNode| space. This is computed by multiplying the rect by
@@ -93,10 +103,12 @@
   // DCHECK fails if the combined transform is not invertible, or
   // |localTransformNode| is not equal to or a descendant of
   // |ancestorTransformNode|.
-  FloatRect ancestorToLocalRect(
-      const FloatRect&,
+  //
+  // |mappingRect| is both input and output.
+  void ancestorToLocalRect(
       const TransformPaintPropertyNode* ancestorTransformNode,
-      const TransformPaintPropertyNode* localTransformNode);
+      const TransformPaintPropertyNode* localTransformNode,
+      FloatRect& mappingRect);
 
   // Returns the matrix used in |LocalToAncestorRect|. DCHECK fails iff
   // |localTransformNode| is not equal to or a descendant of
@@ -113,7 +125,7 @@
 
   // Like localToAncestorClipRect, except it can handle destination transform
   // spaces which are not direct ancestors of the source transform space.
-  FloatClipRect sourceToDestinationClipRect(
+  const FloatClipRect& sourceToDestinationClipRect(
       const PropertyTreeState& sourceState,
       const PropertyTreeState& destinationState);
 
@@ -133,22 +145,22 @@
   // successful on return. See comments of the public functions for failure
   // conditions.
 
-  FloatClipRect sourceToDestinationVisualRectInternal(
-      const FloatRect&,
+  void sourceToDestinationVisualRectInternal(
       const PropertyTreeState& sourceState,
       const PropertyTreeState& destinationState,
+      FloatRect& mappingRect,
       bool& success);
 
-  FloatClipRect localToAncestorVisualRectInternal(
-      const FloatRect&,
+  void localToAncestorVisualRectInternal(
       const PropertyTreeState& localTransformState,
       const PropertyTreeState& ancestorState,
+      FloatRect& mappingRect,
       bool& success);
 
-  FloatRect localToAncestorRectInternal(
-      const FloatRect&,
+  void localToAncestorRectInternal(
       const TransformPaintPropertyNode* localTransformNode,
       const TransformPaintPropertyNode* ancestorTransformNode,
+      FloatRect&,
       bool& success);
 
   const TransformationMatrix& localToAncestorMatrixInternal(
@@ -162,22 +174,25 @@
       const TransformPaintPropertyNode* ancestorTransform,
       bool& success);
 
-  FloatClipRect sourceToDestinationClipRectInternal(
+  const FloatClipRect& sourceToDestinationClipRectInternal(
       const PropertyTreeState& sourceState,
       const PropertyTreeState& destinationState,
       bool& success);
 
-  FloatClipRect slowLocalToAncestorVisualRectWithEffects(
-      const FloatRect&,
+  void slowLocalToAncestorVisualRectWithEffects(
       const PropertyTreeState& localState,
       const PropertyTreeState& ancestorState,
+      FloatRect& mappingRect,
       bool& success);
 
   friend class GeometryMapperTest;
   friend class PaintLayerClipperTest;
 
+  // These are used to represent various return values of the above
+  // methods.
   const TransformationMatrix m_identity;
   const FloatClipRect m_infiniteClip;
+  FloatClipRect m_tempRect;
 
   DISALLOW_COPY_AND_ASSIGN(GeometryMapper);
 };
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp
index c1375c5b..7c44f7b1 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp
@@ -53,35 +53,30 @@
     return GeometryMapper::lowestCommonAncestor(a, b);
   }
 
-  FloatRect sourceToDestinationVisualRectInternal(
-      const FloatRect& rect,
+  void sourceToDestinationVisualRectInternal(
       const PropertyTreeState& sourceState,
       const PropertyTreeState& destinationState,
+      FloatRect& mappingRect,
       bool& success) {
-    return geometryMapper
-        ->localToAncestorVisualRectInternal(rect, sourceState, destinationState,
-                                            success)
-        .rect();
+    geometryMapper->localToAncestorVisualRectInternal(
+        sourceState, destinationState, mappingRect, success);
   }
 
-  FloatRect localToAncestorVisualRectInternal(
-      const FloatRect& rect,
-      const PropertyTreeState& localState,
-      const PropertyTreeState& ancestorState,
-      bool& success) {
-    return geometryMapper
-        ->localToAncestorVisualRectInternal(rect, localState, ancestorState,
-                                            success)
-        .rect();
+  void localToAncestorVisualRectInternal(const PropertyTreeState& localState,
+                                         const PropertyTreeState& ancestorState,
+                                         FloatRect& mappingRect,
+                                         bool& success) {
+    geometryMapper->localToAncestorVisualRectInternal(localState, ancestorState,
+                                                      mappingRect, success);
   }
 
-  FloatRect localToAncestorRectInternal(
-      const FloatRect& rect,
+  void localToAncestorRectInternal(
       const TransformPaintPropertyNode* localTransformNode,
       const TransformPaintPropertyNode* ancestorTransformNode,
+      FloatRect& rect,
       bool& success) {
-    return geometryMapper->localToAncestorRectInternal(
-        rect, localTransformNode, ancestorTransformNode, success);
+    geometryMapper->localToAncestorRectInternal(
+        localTransformNode, ancestorTransformNode, rect, success);
   }
 
  private:
@@ -123,26 +118,29 @@
                        expectedClipInAncestorSpace, localPropertyTreeState,    \
                        ancestorPropertyTreeState, hasRadius)                   \
   do {                                                                         \
-    FloatClipRect clipRect = geometryMapper->localToAncestorVisualRect(        \
-        inputRect, localPropertyTreeState, ancestorPropertyTreeState);         \
-    EXPECT_EQ(hasRadius, clipRect.hasRadius());                                \
-    EXPECT_RECT_EQ(expectedVisualRect, clipRect.rect());                       \
-    clipRect = geometryMapper->localToAncestorClipRect(                        \
+    FloatRect floatRect = inputRect;                                           \
+    geometryMapper->localToAncestorVisualRect(                                 \
+        localPropertyTreeState, ancestorPropertyTreeState, floatRect);         \
+    EXPECT_RECT_EQ(expectedVisualRect, floatRect);                             \
+    FloatClipRect floatClipRect;                                               \
+    floatClipRect = geometryMapper->localToAncestorClipRect(                   \
         localPropertyTreeState, ancestorPropertyTreeState);                    \
-    EXPECT_EQ(hasRadius, clipRect.hasRadius());                                \
-    EXPECT_CLIP_RECT_EQ(expectedClipInAncestorSpace, clipRect);                \
-    clipRect = geometryMapper->sourceToDestinationVisualRect(                  \
-        inputRect, localPropertyTreeState, ancestorPropertyTreeState);         \
-    EXPECT_EQ(hasRadius, clipRect.hasRadius());                                \
-    EXPECT_RECT_EQ(expectedVisualRect, clipRect.rect());                       \
-    EXPECT_RECT_EQ(expectedTransformedRect,                                    \
-                   geometryMapper->localToAncestorRect(                        \
-                       inputRect, localPropertyTreeState.transform(),          \
-                       ancestorPropertyTreeState.transform()));                \
-    EXPECT_RECT_EQ(expectedTransformedRect,                                    \
-                   geometryMapper->sourceToDestinationRect(                    \
-                       inputRect, localPropertyTreeState.transform(),          \
-                       ancestorPropertyTreeState.transform()));                \
+    EXPECT_EQ(hasRadius, floatClipRect.hasRadius());                           \
+    EXPECT_CLIP_RECT_EQ(expectedClipInAncestorSpace, floatClipRect);           \
+    floatRect = inputRect;                                                     \
+    geometryMapper->sourceToDestinationVisualRect(                             \
+        localPropertyTreeState, ancestorPropertyTreeState, floatRect);         \
+    EXPECT_RECT_EQ(expectedVisualRect, floatRect);                             \
+    FloatRect testMappedRect = inputRect;                                      \
+    geometryMapper->localToAncestorRect(localPropertyTreeState.transform(),    \
+                                        ancestorPropertyTreeState.transform(), \
+                                        testMappedRect);                       \
+    EXPECT_RECT_EQ(expectedTransformedRect, testMappedRect);                   \
+    testMappedRect = inputRect;                                                \
+    geometryMapper->sourceToDestinationRect(                                   \
+        localPropertyTreeState.transform(),                                    \
+        ancestorPropertyTreeState.transform(), testMappedRect);                \
+    EXPECT_RECT_EQ(expectedTransformedRect, testMappedRect);                   \
     if (ancestorPropertyTreeState.transform() !=                               \
         localPropertyTreeState.transform()) {                                  \
       const TransformationMatrix* transformForTesting =                        \
@@ -156,8 +154,11 @@
           getClip(localPropertyTreeState.clip(), ancestorPropertyTreeState);   \
       DCHECK(outputClipForTesting);                                            \
       EXPECT_EQ(expectedClipInAncestorSpace, *outputClipForTesting)            \
-          << expectedClipInAncestorSpace.rect().toString() << " "              \
-          << outputClipForTesting->rect().toString();                          \
+          << "expected: " << expectedClipInAncestorSpace.rect().toString()     \
+          << " (hasRadius: " << expectedClipInAncestorSpace.hasRadius()        \
+          << ") "                                                              \
+          << "actual: " << outputClipForTesting->rect().toString()             \
+          << " (hasRadius: " << outputClipForTesting->hasRadius() << ")";      \
     }                                                                          \
   } while (false)
 
@@ -201,9 +202,9 @@
   CHECK_MAPPINGS(input, output, output, transform->matrix(), FloatClipRect(),
                  localState, rootPropertyTreeState(), hasRadius);
 
-  EXPECT_RECT_EQ(input, geometryMapper->ancestorToLocalRect(
-                            output, rootPropertyTreeState().transform(),
-                            localState.transform()));
+  geometryMapper->ancestorToLocalRect(rootPropertyTreeState().transform(),
+                                      localState.transform(), output);
+  EXPECT_RECT_EQ(input, output);
 }
 
 TEST_F(GeometryMapperTest, RotationAndScaleTransform) {
@@ -420,7 +421,8 @@
   ancestorState.setClip(clip1.get());
   FloatRect output2(10, 10, 50, 50);
 
-  clipRect.setRect(clip2->clipRect().rect());
+  FloatClipRect clipRect2;
+  clipRect2.setRect(clip2->clipRect().rect());
 
   hasRadius = false;
   CHECK_MAPPINGS(input,    // Input
@@ -428,9 +430,8 @@
                  input,    // Transformed rect (not clipped).
                  TransformPaintPropertyNode::root()
                      ->matrix(),  // Transform matrix to ancestor space
-                 clipRect,        // Clip rect in ancestor space
-                 localState,
-                 ancestorState, hasRadius);
+                 clipRect2,       // Clip rect in ancestor space
+                 localState, ancestorState, hasRadius);
 }
 
 TEST_F(GeometryMapperTest, TwoClipsTransformAbove) {
@@ -629,40 +630,44 @@
 
   bool success;
   FloatRect input(0, 0, 100, 100);
-  FloatRect result = localToAncestorVisualRectInternal(
-      input, transform1State, transform2State, success);
+  FloatRect result = input;
+  localToAncestorVisualRectInternal(transform1State, transform2State, result,
+                                    success);
   // Fails, because the transform2state is not an ancestor of transform1State.
   EXPECT_FALSE(success);
   EXPECT_RECT_EQ(input, result);
 
-  result = localToAncestorRectInternal(input, transform1.get(),
-                                       transform2.get(), success);
+  result = input;
+  localToAncestorRectInternal(transform1.get(), transform2.get(), result,
+                              success);
   // Fails, because the transform2state is not an ancestor of transform1State.
   EXPECT_FALSE(success);
   EXPECT_RECT_EQ(input, result);
 
-  result = localToAncestorVisualRectInternal(input, transform2State,
-                                             transform1State, success);
+  result = input;
+  localToAncestorVisualRectInternal(transform2State, transform1State, result,
+                                    success);
   // Fails, because the transform1state is not an ancestor of transform2State.
   EXPECT_FALSE(success);
   EXPECT_RECT_EQ(input, result);
 
-  result = localToAncestorRectInternal(input, transform2.get(),
-                                       transform1.get(), success);
+  result = input;
+  localToAncestorRectInternal(transform2.get(), transform1.get(), result,
+                              success);
   // Fails, because the transform1state is not an ancestor of transform2State.
   EXPECT_FALSE(success);
   EXPECT_RECT_EQ(input, result);
 
   FloatRect expected =
       rotateTransform2.inverse().mapRect(rotateTransform1.mapRect(input));
-  result = geometryMapper
-               ->sourceToDestinationVisualRect(input, transform1State,
-                                               transform2State)
-               .rect();
+  result = input;
+  geometryMapper->sourceToDestinationVisualRect(transform1State,
+                                                transform2State, result);
   EXPECT_RECT_EQ(expected, result);
 
-  result = geometryMapper->sourceToDestinationRect(input, transform1.get(),
-                                                   transform2.get());
+  result = input;
+  geometryMapper->sourceToDestinationRect(transform1.get(), transform2.get(),
+                                          result);
   EXPECT_RECT_EQ(expected, result);
 }
 
@@ -700,15 +705,17 @@
 
   // sourceToDestinationVisualRect ignores clip from the common ancestor to
   // destination.
-  FloatRect result = sourceToDestinationVisualRectInternal(
-      input, transform1State, transform2AndClipState, success);
+  FloatRect result = input;
+  sourceToDestinationVisualRectInternal(transform1State, transform2AndClipState,
+                                        result, success);
   // Fails, because the clip of the destination state is not an ancestor of the
   // clip of the source state.
   EXPECT_FALSE(success);
 
   // sourceToDestinationRect applies transforms only.
-  result = geometryMapper->sourceToDestinationRect(input, transform1.get(),
-                                                   transform2.get());
+  result = input;
+  geometryMapper->sourceToDestinationRect(transform1.get(), transform2.get(),
+                                          result);
   EXPECT_RECT_EQ(expected, result);
 
   // Test map from transform2AndClipState to transform1State.
@@ -719,15 +726,15 @@
 
   // sourceToDestinationVisualRect ignores clip from the common ancestor to
   // destination.
-  result = geometryMapper
-               ->sourceToDestinationVisualRect(input, transform2AndClipState,
-                                               transform1State)
-               .rect();
+  result = input;
+  geometryMapper->sourceToDestinationVisualRect(transform2AndClipState,
+                                                transform1State, result);
   EXPECT_RECT_EQ(expectedClipped, result);
 
   // sourceToDestinationRect applies transforms only.
-  result = geometryMapper->sourceToDestinationRect(input, transform2.get(),
-                                                   transform1.get());
+  result = input;
+  geometryMapper->sourceToDestinationRect(transform2.get(), transform1.get(),
+                                          result);
   EXPECT_RECT_EQ(expectedUnclipped, result);
 }
 
diff --git a/third_party/WebKit/Source/web/tests/WebViewTest.cpp b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
index 4550801..72c5370 100644
--- a/third_party/WebKit/Source/web/tests/WebViewTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
@@ -37,6 +37,7 @@
 #include "core/dom/DocumentUserGestureToken.h"
 #include "core/dom/Element.h"
 #include "core/dom/Fullscreen.h"
+#include "core/dom/NodeComputedStyle.h"
 #include "core/editing/FrameSelection.h"
 #include "core/editing/InputMethodController.h"
 #include "core/editing/markers/DocumentMarkerController.h"
@@ -258,6 +259,7 @@
                      const std::string& htmlFile);
   bool tapElement(WebInputEvent::Type, Element*);
   bool tapElementById(WebInputEvent::Type, const WebString& id);
+  IntSize printICBSizeFromPageSize(const FloatSize& pageSize);
 
   std::string m_baseURL;
   FrameTestHelpers::WebViewHelper m_webViewHelper;
@@ -1992,6 +1994,20 @@
   return tapElement(type, element);
 }
 
+IntSize WebViewTest::printICBSizeFromPageSize(const FloatSize& pageSize) {
+  // This needs to match printingMinimumShrinkFactor in PrintContext.cpp. The
+  // layout is scaled by this factor for printing.
+  constexpr float minimumShrinkFactor = 1.333f;
+
+  // The expected layout size comes from the calculation done in
+  // resizePageRectsKeepingRatio which is used from PrintContext::begin to
+  // scale the page size.
+  const float ratio = pageSize.height() / (float)pageSize.width();
+  const int icbWidth = floor(pageSize.width() * minimumShrinkFactor);
+  const int icbHeight = floor(icbWidth * ratio);
+  return IntSize(icbWidth, icbHeight);
+}
+
 TEST_P(WebViewTest, DetectContentAroundPosition) {
   registerMockedHttpURLLoad("content_listeners.html");
 
@@ -4261,26 +4277,17 @@
   printParams.printContentArea.width = pageSize.width();
   printParams.printContentArea.height = pageSize.height();
 
-  // This needs to match printingMinimumShrinkFactor in PrintContext.cpp. The
-  // layout is scaled by this factor for printing.
-  constexpr float minimumShrinkFactor = 1.333f;
-
-  // The expected layout size comes from the calculation done in
-  // resizePageRectsKeepingRatio which is used from PrintContext::begin to
-  // scale the page size.
-  const float ratio = pageSize.height() / (float)pageSize.width();
-  const int expectedWidth = floor(pageSize.width() * minimumShrinkFactor);
-  const int expectedHeight = floor(expectedWidth * ratio);
+  IntSize expectedSize = printICBSizeFromPageSize(pageSize);
 
   frame->printBegin(printParams, WebNode());
 
-  EXPECT_EQ(expectedWidth, vwElement->offsetWidth());
-  EXPECT_EQ(expectedHeight, vwElement->offsetHeight());
+  EXPECT_EQ(expectedSize.width(), vwElement->offsetWidth());
+  EXPECT_EQ(expectedSize.height(), vwElement->offsetHeight());
 
   webView->resize(flooredIntSize(pageSize));
 
-  EXPECT_EQ(expectedWidth, vwElement->offsetWidth());
-  EXPECT_EQ(expectedHeight, vwElement->offsetHeight());
+  EXPECT_EQ(expectedSize.width(), vwElement->offsetWidth());
+  EXPECT_EQ(expectedSize.height(), vwElement->offsetHeight());
 
   webView->resize(WebSize(800, 600));
   frame->printEnd();
@@ -4288,6 +4295,80 @@
   EXPECT_EQ(800, vwElement->offsetWidth());
 }
 
+TEST_P(WebViewTest, WidthMediaQueryWithPageZoomAfterPrinting) {
+  WebViewImpl* webView = m_webViewHelper.initialize();
+  webView->resize(WebSize(800, 600));
+  webView->setZoomLevel(WebView::zoomFactorToZoomLevel(2.0));
+
+  WebURL baseURL = URLTestHelpers::toKURL("http://example.com/");
+  FrameTestHelpers::loadHTMLString(webView->mainFrame(),
+                                   "<style>"
+                                   "  @media (max-width: 600px) {"
+                                   "    div { color: green }"
+                                   "  }"
+                                   "</style>"
+                                   "<div id=d></div>",
+                                   baseURL);
+
+  WebLocalFrameImpl* frame = webView->mainFrameImpl();
+  Document* document = frame->frame()->document();
+  Element* div = document->getElementById("d");
+
+  EXPECT_EQ(makeRGB(0, 128, 0),
+            div->computedStyle()->visitedDependentColor(CSSPropertyColor));
+
+  FloatSize pageSize(300, 360);
+
+  WebPrintParams printParams;
+  printParams.printContentArea.width = pageSize.width();
+  printParams.printContentArea.height = pageSize.height();
+
+  frame->printBegin(printParams, WebNode());
+  frame->printEnd();
+
+  EXPECT_EQ(makeRGB(0, 128, 0),
+            div->computedStyle()->visitedDependentColor(CSSPropertyColor));
+}
+
+TEST_P(WebViewTest, ViewportUnitsPrintingWithPageZoom) {
+  WebViewImpl* webView = m_webViewHelper.initialize();
+  webView->resize(WebSize(800, 600));
+  webView->setZoomLevel(WebView::zoomFactorToZoomLevel(2.0));
+
+  WebURL baseURL = URLTestHelpers::toKURL("http://example.com/");
+  FrameTestHelpers::loadHTMLString(webView->mainFrame(),
+                                   "<style>"
+                                   "  body { margin: 0 }"
+                                   "  #t1 { width: 100% }"
+                                   "  #t2 { width: 100vw }"
+                                   "</style>"
+                                   "<div id=t1></div>"
+                                   "<div id=t2></div>",
+                                   baseURL);
+
+  WebLocalFrameImpl* frame = webView->mainFrameImpl();
+  Document* document = frame->frame()->document();
+  Element* t1 = document->getElementById("t1");
+  Element* t2 = document->getElementById("t2");
+
+  EXPECT_EQ(400, t1->offsetWidth());
+  EXPECT_EQ(400, t2->offsetWidth());
+
+  FloatSize pageSize(600, 720);
+  int expectedWidth = printICBSizeFromPageSize(pageSize).width();
+
+  WebPrintParams printParams;
+  printParams.printContentArea.width = pageSize.width();
+  printParams.printContentArea.height = pageSize.height();
+
+  frame->printBegin(printParams, WebNode());
+
+  EXPECT_EQ(expectedWidth, t1->offsetWidth());
+  EXPECT_EQ(expectedWidth, t2->offsetWidth());
+
+  frame->printEnd();
+}
+
 TEST_P(WebViewTest, DeviceEmulationResetScrollbars) {
   WebViewImpl* webView = m_webViewHelper.initialize();
   webView->resize(WebSize(800, 600));
diff --git a/third_party/WebKit/Source/wtf/Vector.h b/third_party/WebKit/Source/wtf/Vector.h
index c3ab13f..83b68093 100644
--- a/third_party/WebKit/Source/wtf/Vector.h
+++ b/third_party/WebKit/Source/wtf/Vector.h
@@ -1113,6 +1113,10 @@
   void push_back(U&&);
   template <typename... Args>
   T& emplace_back(Args&&...);
+  ALWAYS_INLINE T& emplace_back() {
+    grow(m_size + 1);
+    return back();
+  }
   template <typename U>
   void append(const U*, size_t);
   template <typename U, size_t otherCapacity, typename V>
@@ -1667,9 +1671,6 @@
 template <typename... Args>
 ALWAYS_INLINE T& Vector<T, inlineCapacity, Allocator>::emplace_back(
     Args&&... args) {
-  static_assert(sizeof...(Args), "grow() must be called instead");
-  static_assert(sizeof...(Args) != 1, "append() must be called instead");
-
   DCHECK(Allocator::isAllocationAllowed());
   if (UNLIKELY(size() == capacity()))
     expandCapacity(size() + 1);
diff --git a/third_party/WebKit/Source/wtf/VectorTest.cpp b/third_party/WebKit/Source/wtf/VectorTest.cpp
index 1e66770c..8cb2c6b 100644
--- a/third_party/WebKit/Source/wtf/VectorTest.cpp
+++ b/third_party/WebKit/Source/wtf/VectorTest.cpp
@@ -674,6 +674,8 @@
 
 TEST(VectorTest, emplace_back) {
   struct Item {
+    Item() = default;
+    explicit Item(int value1) : value1(value1), value2() {}
     Item(int value1, int value2) : value1(value1), value2(value2) {}
     int value1;
     int value2;
@@ -682,12 +684,27 @@
   Vector<Item> vector;
   vector.emplace_back(1, 2);
   vector.emplace_back(3, 4);
+  vector.emplace_back(5);
+  vector.emplace_back();
 
-  EXPECT_EQ(2u, vector.size());
+  EXPECT_EQ(4u, vector.size());
+
   EXPECT_EQ(1, vector[0].value1);
   EXPECT_EQ(2, vector[0].value2);
+
   EXPECT_EQ(3, vector[1].value1);
   EXPECT_EQ(4, vector[1].value2);
+
+  EXPECT_EQ(5, vector[2].value1);
+  EXPECT_EQ(0, vector[2].value2);
+
+  EXPECT_EQ(0, vector[3].value1);
+  EXPECT_EQ(0, vector[3].value2);
+
+  // Test returned value.
+  Item& item = vector.emplace_back(6, 7);
+  EXPECT_EQ(6, item.value1);
+  EXPECT_EQ(7, item.value2);
 }
 
 static_assert(VectorTraits<int>::canCopyWithMemcpy,
diff --git a/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java b/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java
index 9c493b3..a816e72 100644
--- a/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java
+++ b/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java
@@ -357,7 +357,7 @@
         if (delayToMayLaunchUrl != NONE) {
             mHandler.postDelayed(mayLaunchRunnable, delayToMayLaunchUrl);
         } else {
-            launchRunnable.run();
+            mHandler.postDelayed(launchRunnable, delayToLaunchUrl);
         }
     }