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, 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 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 takeRecords(); }; diff --git a/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini b/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini index 2f8dd23f604..7bfd658f072 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 5701b97969d..00000000000 --- 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 86213c4b71a..e1be7009061 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 a8c6f2f7575..00000000000 --- a/tests/wpt/metadata/dom/nodes/MutationObserver-takeRecords.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[MutationObserver-takeRecords.html] - type: testharness