aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r--components/script/dom/node.rs54
1 files changed, 49 insertions, 5 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 1ad28974f3d..ff3e5d64787 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -47,7 +47,7 @@ use dom::htmllinkelement::HTMLLinkElement;
use dom::htmlmetaelement::HTMLMetaElement;
use dom::htmlstyleelement::HTMLStyleElement;
use dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaElementHelpers};
-use dom::mutationobserver::RegisteredObserver;
+use dom::mutationobserver::{Mutation, MutationObserver, RegisteredObserver};
use dom::nodelist::NodeList;
use dom::processinginstruction::ProcessingInstruction;
use dom::range::WeakRangeVec;
@@ -1616,18 +1616,27 @@ impl Node {
let new_nodes = if let NodeTypeId::DocumentFragment = node.type_id() {
// Step 3.
new_nodes.extend(node.children().map(|kid| JS::from_ref(&*kid)));
- // Step 4: mutation observers.
- // Step 5.
+ // Step 4.
for kid in new_nodes.r() {
Node::remove(*kid, node, SuppressObserver::Suppressed);
}
+ // Step 5.
vtable_for(&node).children_changed(&ChildrenMutation::replace_all(new_nodes.r(), &[]));
+
+ let mutation = Mutation::ChildList {
+ added: None,
+ removed: Some(new_nodes.r()),
+ prev: None,
+ next: None,
+ };
+ MutationObserver::queue_a_mutation_record(&node, mutation);
+
new_nodes.r()
} else {
// Step 3.
ref_slice(&node)
};
- // Step 6: mutation observers.
+ // Step 6.
let previous_sibling = match suppress_observers {
SuppressObserver::Unsuppressed => {
match child {
@@ -1646,6 +1655,14 @@ impl Node {
if let SuppressObserver::Unsuppressed = suppress_observers {
vtable_for(&parent).children_changed(
&ChildrenMutation::insert(previous_sibling.r(), new_nodes, child));
+
+ let mutation = Mutation::ChildList {
+ added: Some(new_nodes),
+ removed: None,
+ prev: previous_sibling.r(),
+ next: child,
+ };
+ MutationObserver::queue_a_mutation_record(&parent, mutation);
}
}
@@ -1677,9 +1694,19 @@ impl Node {
if let Some(node) = node {
Node::insert(node, parent, None, SuppressObserver::Suppressed);
}
- // Step 6: mutation observers.
+ // Step 6.
vtable_for(&parent).children_changed(
&ChildrenMutation::replace_all(removed_nodes.r(), added_nodes));
+
+ if !removed_nodes.is_empty() || !added_nodes.is_empty() {
+ let mutation = Mutation::ChildList {
+ added: Some(added_nodes),
+ removed: Some(removed_nodes.r()),
+ prev: None,
+ next: None,
+ };
+ MutationObserver::queue_a_mutation_record(&parent, mutation);
+ }
}
// https://dom.spec.whatwg.org/#concept-node-pre-remove
@@ -1730,6 +1757,15 @@ impl Node {
&ChildrenMutation::replace(old_previous_sibling.r(),
&Some(&node), &[],
old_next_sibling.r()));
+
+ let removed = [node];
+ let mutation = Mutation::ChildList {
+ added: None,
+ removed: Some(&removed),
+ prev: old_previous_sibling.r(),
+ next: old_next_sibling.r(),
+ };
+ MutationObserver::queue_a_mutation_record(&parent, mutation);
}
}
@@ -2182,6 +2218,14 @@ impl NodeMethods for Node {
&ChildrenMutation::replace(previous_sibling.r(),
&removed_child, nodes,
reference_child));
+ let removed = removed_child.map(|r| [r]);
+ let mutation = Mutation::ChildList {
+ added: Some(nodes),
+ removed: removed.as_ref().map(|r| &r[..]),
+ prev: previous_sibling.r(),
+ next: reference_child,
+ };
+ MutationObserver::queue_a_mutation_record(&self, mutation);
// Step 15.
Ok(Root::from_ref(child))