aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/mutationobserver.rs18
-rw-r--r--components/script/dom/node.rs7
-rw-r--r--components/script/dom/webidls/MutationObserver.webidl2
3 files changed, 25 insertions, 2 deletions
diff --git a/components/script/dom/mutationobserver.rs b/components/script/dom/mutationobserver.rs
index 97b4ca36d27..d0dc201f12e 100644
--- a/components/script/dom/mutationobserver.rs
+++ b/components/script/dom/mutationobserver.rs
@@ -27,6 +27,7 @@ pub struct MutationObserver {
#[ignore_malloc_size_of = "can't measure Rc values"]
callback: Rc<MutationCallback>,
record_queue: DomRefCell<Vec<DomRoot<MutationRecord>>>,
+ node_list: DomRefCell<Vec<DomRoot<Node>>>,
}
pub enum Mutation<'a> {
@@ -38,7 +39,7 @@ pub enum Mutation<'a> {
#[derive(JSTraceable, MallocSizeOf)]
pub struct RegisteredObserver {
- observer: DomRoot<MutationObserver>,
+ pub observer: DomRoot<MutationObserver>,
options: ObserverOptions,
}
@@ -64,6 +65,7 @@ impl MutationObserver {
reflector_: Reflector::new(),
callback: callback,
record_queue: DomRefCell::new(vec![]),
+ node_list: DomRefCell::new(vec![]),
}
}
@@ -286,6 +288,8 @@ impl MutationObserverMethods for MutationObserver {
child_list
},
});
+
+ self.node_list.borrow_mut().push(DomRoot::from_ref(target));
}
Ok(())
@@ -297,4 +301,16 @@ impl MutationObserverMethods for MutationObserver {
self.record_queue.borrow_mut().clear();
records
}
+
+ /// https://dom.spec.whatwg.org/#dom-mutationobserver-disconnect
+ fn Disconnect(&self) {
+ // Step 1
+ let mut nodes = self.node_list.borrow_mut();
+ for node in nodes.drain(..) {
+ node.remove_mutation_observer(self);
+ }
+
+ // Step 2
+ self.record_queue.borrow_mut().clear();
+ }
}
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 64b808c3859..edc1b6d8366 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -392,6 +392,13 @@ impl Node {
self.mutation_observers.borrow_mut()
}
+ /// Removes the mutation observer for a given node.
+ pub fn remove_mutation_observer(&self, observer: &MutationObserver) {
+ self.mutation_observers.borrow_mut().retain(|reg_obs| {
+ &*reg_obs.observer != observer
+ })
+ }
+
/// Dumps the subtree rooted at this node, for debugging.
pub fn dump(&self) {
self.dump_indent(0);
diff --git a/components/script/dom/webidls/MutationObserver.webidl b/components/script/dom/webidls/MutationObserver.webidl
index 015686c47d9..426e995fc63 100644
--- a/components/script/dom/webidls/MutationObserver.webidl
+++ b/components/script/dom/webidls/MutationObserver.webidl
@@ -11,7 +11,7 @@
interface MutationObserver {
[Throws]
void observe(Node target, optional MutationObserverInit options);
- //void disconnect();
+ void disconnect();
sequence<MutationRecord> takeRecords();
};