From a1fd6c39a213fbe50db4138304c8cccbfa196486 Mon Sep 17 00:00:00 2001 From: Nupur Baghel Date: Wed, 14 Feb 2018 02:11:58 +0530 Subject: [PATCH] Added extra bool in Window object to know about its Mutation Observers --- components/script/dom/mutationobserver.rs | 6 ++- components/script/dom/window.rs | 12 ++++++ tests/html/mut_observer_perf.html | 47 +++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 tests/html/mut_observer_perf.html diff --git a/components/script/dom/mutationobserver.rs b/components/script/dom/mutationobserver.rs index 5aee5adecd9..902f0dcce97 100644 --- a/components/script/dom/mutationobserver.rs +++ b/components/script/dom/mutationobserver.rs @@ -9,7 +9,7 @@ use dom::bindings::codegen::Bindings::MutationObserverBinding::MutationCallback; use dom::bindings::codegen::Bindings::MutationObserverBinding::MutationObserverBinding::MutationObserverMethods; use dom::bindings::codegen::Bindings::MutationObserverBinding::MutationObserverInit; use dom::bindings::error::{Error, Fallible}; -use dom::bindings::reflector::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, reflect_dom_object, DomObject}; use dom::bindings::root::DomRoot; use dom::bindings::str::DOMString; use dom::mutationrecord::MutationRecord; @@ -67,6 +67,7 @@ impl MutationObserver { } pub fn Constructor(global: &Window, callback: Rc) -> Fallible> { + global.set_exists_mut_observer(); let observer = MutationObserver::new(global, callback); ScriptThread::add_mutation_observer(&*observer); Ok(observer) @@ -105,6 +106,9 @@ impl MutationObserver { /// pub fn queue_a_mutation_record(target: &Node, attr_type: Mutation) { + if !target.global().as_window().get_exists_mut_observer() { + return; + } // Step 1 let mut interestedObservers: Vec<(DomRoot, Option)> = vec![]; // Step 2 & 3 diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index a564d00ee5f..2e6fb487790 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -285,9 +285,20 @@ pub struct Window { /// The Webrender Document id associated with this window. #[ignore_malloc_size_of = "defined in webrender_api"] webrender_document: DocumentId, + + /// Flag to identify whether mutation observers are present(true)/absent(false) + exists_mut_observer: Cell, } impl Window { + pub fn get_exists_mut_observer(&self) -> bool { + self.exists_mut_observer.get() + } + + pub fn set_exists_mut_observer(&self) { + self.exists_mut_observer.set(true); + } + #[allow(unsafe_code)] pub fn clear_js_runtime_for_script_deallocation(&self) { unsafe { @@ -1814,6 +1825,7 @@ impl Window { test_worklet: Default::default(), paint_worklet: Default::default(), webrender_document, + exists_mut_observer: Cell::new(false), }); unsafe { diff --git a/tests/html/mut_observer_perf.html b/tests/html/mut_observer_perf.html new file mode 100644 index 00000000000..57fcedceb4d --- /dev/null +++ b/tests/html/mut_observer_perf.html @@ -0,0 +1,47 @@ + + + + + + + + +