aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/node.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2015-12-14 00:13:56 +0100
committerAnthony Ramine <n.oxyde@gmail.com>2015-12-14 00:13:56 +0100
commit748dfdf5753eb6d35fd10e5ee78f36f35a98a5df (patch)
treed9107ca5b9858c56c4fd0cf36d747c71abd61d6c /components/script/dom/node.rs
parent8bab1cd7a4634618d18985d273c6997984919ecc (diff)
downloadservo-748dfdf5753eb6d35fd10e5ee78f36f35a98a5df.tar.gz
servo-748dfdf5753eb6d35fd10e5ee78f36f35a98a5df.zip
Fix Node::replace_with
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r--components/script/dom/node.rs30
1 files changed, 18 insertions, 12 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 30aa8e78eea..3ef0c9ca5a4 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -666,19 +666,25 @@ impl Node {
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
pub fn replace_with(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- match self.parent_node.get() {
- None => {
- // Step 1.
- Ok(())
- },
- Some(ref parent_node) => {
- // Step 2.
- let doc = self.owner_doc();
- let node = try!(doc.node_from_nodes_and_strings(nodes));
- // Step 3.
- parent_node.ReplaceChild(node.r(), self).map(|_| ())
- },
+ // Step 1.
+ let parent = if let Some(parent) = self.GetParentNode() {
+ parent
+ } else {
+ // Step 2.
+ return Ok(());
+ };
+ // Step 3.
+ let viable_next_sibling = first_node_not_in(self.following_siblings(), &nodes);
+ // Step 4.
+ let node = try!(self.owner_doc().node_from_nodes_and_strings(nodes));
+ if self.parent_node == Some(&*parent) {
+ // Step 5.
+ try!(parent.ReplaceChild(&node, self));
+ } else {
+ // Step 6.
+ try!(Node::pre_insert(&node, &parent, viable_next_sibling.r()));
}
+ Ok(())
}
// https://dom.spec.whatwg.org/#dom-parentnode-prepend