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"><link></ph>Learn more<ph name="END_LINK"></link></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(¬ification_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), ¬ification_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), ¬ification_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); } }