From 9cee765c96b3347bc5fee69ac9700911db7e9665 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Thu, 9 Apr 2015 14:07:42 +0200 Subject: [PATCH 1/2] Add NodeHelpers::inclusively_preceding_siblings() --- components/script/dom/node.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index d328af22151..e628ee4b2d9 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -486,6 +486,7 @@ pub trait NodeHelpers<'a> { fn traverse_preorder(self) -> TreeIterator<'a>; fn inclusively_following_siblings(self) -> NodeSiblingIterator; + fn inclusively_preceding_siblings(self) -> ReverseSiblingIterator; fn to_trusted_node_address(self) -> TrustedNodeAddress; @@ -754,6 +755,12 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> { } } + fn inclusively_preceding_siblings(self) -> ReverseSiblingIterator { + ReverseSiblingIterator { + current: Some(Temporary::from_rooted(self)), + } + } + fn is_inclusive_ancestor_of(self, parent: JSRef) -> bool { self == parent || parent.ancestors().any(|ancestor| ancestor.root().r() == self) } From 890d902d6ace8b7f04aaeb2f2f7cfb15dc5b0521 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Thu, 9 Apr 2015 14:08:24 +0200 Subject: [PATCH 2/2] Implement Text::wholeText --- components/script/dom/text.rs | 27 ++++++++++++++++--- components/script/dom/webidls/Text.webidl | 2 +- tests/wpt/metadata/dom/interfaces.html.ini | 6 ----- .../dom/nodes/Node-properties.html.ini | 17 ------------ 4 files changed, 24 insertions(+), 28 deletions(-) delete mode 100644 tests/wpt/metadata/dom/nodes/Node-properties.html.ini diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index c2e9c588665..5df59274e9e 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -2,16 +2,17 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::codegen::Bindings::TextBinding; +use dom::bindings::codegen::Bindings::TextBinding::{self, TextMethods}; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use dom::bindings::codegen::InheritTypes::TextDerived; +use dom::bindings::codegen::InheritTypes::{CharacterDataCast, TextDerived}; +use dom::bindings::codegen::InheritTypes::NodeCast; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JSRef, Temporary}; -use dom::characterdata::CharacterData; +use dom::characterdata::{CharacterData, CharacterDataHelpers}; use dom::document::Document; use dom::eventtarget::{EventTarget, EventTargetTypeId}; -use dom::node::{Node, NodeTypeId}; +use dom::node::{Node, NodeHelpers, NodeTypeId}; use util::str::DOMString; /// An HTML text node. @@ -44,3 +45,21 @@ impl Text { } } +impl<'a> TextMethods for JSRef<'a, Text> { + // https://dom.spec.whatwg.org/#dom-text-wholetext + fn WholeText(self) -> DOMString { + let first = NodeCast::from_ref(self).inclusively_preceding_siblings() + .map(|node| node.root()) + .take_while(|node| node.r().is_text()) + .last().unwrap(); + let nodes = first.r().inclusively_following_siblings().map(|node| node.root()) + .take_while(|node| node.r().is_text()); + let mut text = DOMString::new(); + for node in nodes { + let cdata = CharacterDataCast::to_ref(node.r()).unwrap(); + text.push_str(&cdata.data()); + } + text + } +} + diff --git a/components/script/dom/webidls/Text.webidl b/components/script/dom/webidls/Text.webidl index 972797c73c8..e46d4e24d9c 100644 --- a/components/script/dom/webidls/Text.webidl +++ b/components/script/dom/webidls/Text.webidl @@ -14,5 +14,5 @@ [Constructor(optional DOMString data = "")] interface Text : CharacterData { //[NewObject] Text splitText(unsigned long offset); - //readonly attribute DOMString wholeText; + readonly attribute DOMString wholeText; }; diff --git a/tests/wpt/metadata/dom/interfaces.html.ini b/tests/wpt/metadata/dom/interfaces.html.ini index e93857fa4ab..988f378422b 100644 --- a/tests/wpt/metadata/dom/interfaces.html.ini +++ b/tests/wpt/metadata/dom/interfaces.html.ini @@ -339,18 +339,12 @@ [Text interface: operation splitText(unsigned long)] expected: FAIL - [Text interface: attribute wholeText] - expected: FAIL - [Text interface: document.createTextNode("abc") must inherit property "splitText" with the proper type (0)] expected: FAIL [Text interface: calling splitText(unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError] expected: FAIL - [Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type (1)] - expected: FAIL - [CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9)] expected: FAIL diff --git a/tests/wpt/metadata/dom/nodes/Node-properties.html.ini b/tests/wpt/metadata/dom/nodes/Node-properties.html.ini deleted file mode 100644 index a286ce6e019..00000000000 --- a/tests/wpt/metadata/dom/nodes/Node-properties.html.ini +++ /dev/null @@ -1,17 +0,0 @@ -[Node-properties.html] - type: testharness - [detachedTextNode.wholeText] - expected: FAIL - - [foreignTextNode.wholeText] - expected: FAIL - - [detachedForeignTextNode.wholeText] - expected: FAIL - - [xmlTextNode.wholeText] - expected: FAIL - - [detachedXmlTextNode.wholeText] - expected: FAIL -