diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index c82fbb49e88..ec72b6eed2f 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1051,21 +1051,18 @@ pub struct FollowingNodeIterator { root: Root, } -impl Iterator for FollowingNodeIterator { - type Item = Root; - - // https://dom.spec.whatwg.org/#concept-tree-following - fn next(&mut self) -> Option> { +impl FollowingNodeIterator { + /// Skips iterating the children of the current node + pub fn next_skipping_children(&mut self) -> Option> { let current = match self.current.take() { None => return None, Some(current) => current, }; - if let Some(first_child) = current.GetFirstChild() { - self.current = Some(first_child); - return current.GetFirstChild() - } + self.next_skipping_children_impl(current) + } + fn next_skipping_children_impl(&mut self, current: Root) -> Option> { if self.root == current { self.current = None; return None; @@ -1090,6 +1087,25 @@ impl Iterator for FollowingNodeIterator { } } +impl Iterator for FollowingNodeIterator { + type Item = Root; + + // https://dom.spec.whatwg.org/#concept-tree-following + fn next(&mut self) -> Option> { + let current = match self.current.take() { + None => return None, + Some(current) => current, + }; + + if let Some(first_child) = current.GetFirstChild() { + self.current = Some(first_child); + return current.GetFirstChild() + } + + self.next_skipping_children_impl(current) + } +} + pub struct PrecedingNodeIterator { current: Option>, root: Root, diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index 88fc9ad35bc..df3d0d35883 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -750,7 +750,7 @@ impl RangeMethods for Range { if let Some(text) = start_node.downcast::() { return text.ReplaceData(start_offset, end_offset - start_offset, - DOMString::from("")); + DOMString::new()); } } @@ -758,10 +758,15 @@ impl RangeMethods for Range { let mut contained_children: RootedVec> = RootedVec::new(); let ancestor = self.CommonAncestorContainer(); - for child in start_node.following_nodes(ancestor.r()) { - if self.contains(child.r()) && - !contained_children.contains(&JS::from_ref(child.GetParentNode().unwrap().r())) { + let mut iter = start_node.following_nodes(ancestor.r()); + + let mut next = iter.next(); + while let Some(child) = next { + if self.contains(child.r()) { contained_children.push(JS::from_ref(child.r())); + next = iter.next_skipping_children(); + } else { + next = iter.next(); } } @@ -778,7 +783,7 @@ impl RangeMethods for Range { } reference_node = parent; } - panic!() + unreachable!() } compute_reference(start_node.r(), end_node.r()) @@ -786,9 +791,9 @@ impl RangeMethods for Range { // Step 7. if let Some(text) = start_node.downcast::() { - try!(text.ReplaceData(start_offset, - start_node.len() - start_offset, - DOMString::from(""))); + text.ReplaceData(start_offset, + start_node.len() - start_offset, + DOMString::new()).unwrap(); } // Step 8. @@ -798,12 +803,13 @@ impl RangeMethods for Range { // Step 9. if let Some(text) = end_node.downcast::() { - try!(text.ReplaceData(0, end_offset, DOMString::from(""))); + text.ReplaceData(0, end_offset, DOMString::new()).unwrap(); } // Step 10. - try!(self.SetStart(new_node.r(), new_offset)); - self.SetEnd(new_node.r(), new_offset) + self.SetStart(new_node.r(), new_offset).unwrap(); + self.SetEnd(new_node.r(), new_offset).unwrap(); + Ok(()) } // https://dom.spec.whatwg.org/#dom-range-surroundcontents diff --git a/tests/wpt/metadata/dom/ranges/Range-deleteContents.html.ini b/tests/wpt/metadata/dom/ranges/Range-deleteContents.html.ini deleted file mode 100644 index d026b7aaa35..00000000000 --- a/tests/wpt/metadata/dom/ranges/Range-deleteContents.html.ini +++ /dev/null @@ -1,23 +0,0 @@ -[Range-deleteContents.html] - type: testharness - [Resulting DOM for range 24 [document, 0, document, 2\]] - expected: FAIL - - [Resulting DOM for range 10 [document.documentElement, 0, document.documentElement, 1\]] - expected: FAIL - - [Resulting DOM for range 11 [document.documentElement, 0, document.documentElement, 2\]] - expected: FAIL - - [Resulting DOM for range 12 [document.documentElement, 1, document.documentElement, 2\]] - expected: FAIL - - [Resulting DOM for range 15 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1\]] - expected: FAIL - - [Resulting DOM for range 27 [foreignDoc, 1, foreignComment, 2\]] - expected: FAIL - - [Resulting DOM for range 49 [document, 1, document, 2\]] - expected: FAIL -