From 5bfa81903885712373e2747e138f2abaf4a83d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20Desr=C3=A9?= Date: Wed, 2 May 2018 13:30:02 -0700 Subject: [PATCH] Implement MutationObserver.disconnect() --- components/script/dom/mutationobserver.rs | 18 +++++++++++++++++- components/script/dom/node.rs | 7 +++++++ .../script/dom/webidls/MutationObserver.webidl | 2 +- .../dom/nodes/Element-classlist.html.ini | 1 - .../nodes/MutationObserver-disconnect.html.ini | 8 -------- .../nodes/MutationObserver-document.html.ini | 2 -- .../MutationObserver-takeRecords.html.ini | 2 -- 7 files changed, 25 insertions(+), 15 deletions(-) delete mode 100644 tests/wpt/metadata/dom/nodes/MutationObserver-disconnect.html.ini delete mode 100644 tests/wpt/metadata/dom/nodes/MutationObserver-takeRecords.html.ini diff --git a/components/script/dom/mutationobserver.rs b/components/script/dom/mutationobserver.rs index 97b4ca36d278..d0dc201f12e5 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, record_queue: DomRefCell>>, + node_list: DomRefCell>>, } pub enum Mutation<'a> { @@ -38,7 +39,7 @@ pub enum Mutation<'a> { #[derive(JSTraceable, MallocSizeOf)] pub struct RegisteredObserver { - observer: DomRoot, + pub observer: DomRoot, 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 64b808c3859c..edc1b6d83668 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 015686c47d9a..426e995fc63c 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 takeRecords(); }; diff --git a/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini b/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini index 2f8dd23f6048..7bfd658f0722 100644 --- a/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini +++ b/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini @@ -1,6 +1,5 @@ [Element-classlist.html] type: testharness - expected: TIMEOUT [classList.remove("a") with attribute value null (HTML node)] expected: FAIL diff --git a/tests/wpt/metadata/dom/nodes/MutationObserver-disconnect.html.ini b/tests/wpt/metadata/dom/nodes/MutationObserver-disconnect.html.ini deleted file mode 100644 index 5701b97969d9..000000000000 --- a/tests/wpt/metadata/dom/nodes/MutationObserver-disconnect.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[MutationObserver-disconnect.html] - type: testharness - [subtree mutations] - expected: FAIL - - [disconnect discarded some mutations] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/nodes/MutationObserver-document.html.ini b/tests/wpt/metadata/dom/nodes/MutationObserver-document.html.ini index 86213c4b71a7..e1be70090613 100644 --- a/tests/wpt/metadata/dom/nodes/MutationObserver-document.html.ini +++ b/tests/wpt/metadata/dom/nodes/MutationObserver-document.html.ini @@ -1,7 +1,5 @@ [MutationObserver-document.html] type: testharness - [setup test] - expected: FAIL [parser insertion mutations] expected: FAIL diff --git a/tests/wpt/metadata/dom/nodes/MutationObserver-takeRecords.html.ini b/tests/wpt/metadata/dom/nodes/MutationObserver-takeRecords.html.ini deleted file mode 100644 index a8c6f2f75759..000000000000 --- a/tests/wpt/metadata/dom/nodes/MutationObserver-takeRecords.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[MutationObserver-takeRecords.html] - type: testharness