diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index f46cbc0be118..582afc8f7552 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1415,24 +1415,17 @@ impl Node { // https://dom.spec.whatwg.org/#concept-node-adopt pub fn adopt(node: &Node, document: &Document) { // Step 1. - let parent_node = node.GetParentNode(); - match parent_node { - Some(ref parent) => { - Node::remove(node, parent, SuppressObserver::Unsuppressed); - } - None => (), - } - + let old_doc = node.owner_doc(); // Step 2. - let node_doc = document_from_node(node); - if node_doc.r() != document { + node.remove_self(); + if &*old_doc != document { for descendant in node.traverse_preorder() { - descendant.r().set_owner_doc(document); + // Step 3. + descendant.set_owner_doc(document); + // Step 4. + vtable_for(&descendant).adopting_steps(&old_doc); } } - - // Step 3. - // If node is an element, it is _affected by a base URL change_. } // https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 6812703ffe62..7afb3be46244 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -98,7 +98,14 @@ pub trait VirtualMethods { } } - /// https://dom.spec.whatwg.org/#concept-node-clone (step 5) + /// https://dom.spec.whatwg.org/#concept-node-adopt-ext + fn adopting_steps(&self, old_doc: &Document) { + if let Some(ref s) = self.super_type() { + s.adopting_steps(old_doc); + } + } + + /// https://dom.spec.whatwg.org/#concept-node-clone-ext fn cloning_steps(&self, copy: &Node, maybe_doc: Option<&Document>, clone_children: CloneChildrenFlag) { if let Some(ref s) = self.super_type() {