mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Added extra bool in Window object to know about its Mutation Observers
This commit is contained in:
parent
7945dff8ea
commit
a1fd6c39a2
3 changed files with 64 additions and 1 deletions
|
@ -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::MutationObserverBinding::MutationObserverMethods;
|
||||||
use dom::bindings::codegen::Bindings::MutationObserverBinding::MutationObserverInit;
|
use dom::bindings::codegen::Bindings::MutationObserverBinding::MutationObserverInit;
|
||||||
use dom::bindings::error::{Error, Fallible};
|
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::root::DomRoot;
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::mutationrecord::MutationRecord;
|
use dom::mutationrecord::MutationRecord;
|
||||||
|
@ -67,6 +67,7 @@ impl MutationObserver {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn Constructor(global: &Window, callback: Rc<MutationCallback>) -> Fallible<DomRoot<MutationObserver>> {
|
pub fn Constructor(global: &Window, callback: Rc<MutationCallback>) -> Fallible<DomRoot<MutationObserver>> {
|
||||||
|
global.set_exists_mut_observer();
|
||||||
let observer = MutationObserver::new(global, callback);
|
let observer = MutationObserver::new(global, callback);
|
||||||
ScriptThread::add_mutation_observer(&*observer);
|
ScriptThread::add_mutation_observer(&*observer);
|
||||||
Ok(observer)
|
Ok(observer)
|
||||||
|
@ -105,6 +106,9 @@ impl MutationObserver {
|
||||||
|
|
||||||
/// <https://dom.spec.whatwg.org/#queueing-a-mutation-record>
|
/// <https://dom.spec.whatwg.org/#queueing-a-mutation-record>
|
||||||
pub fn queue_a_mutation_record(target: &Node, attr_type: Mutation) {
|
pub fn queue_a_mutation_record(target: &Node, attr_type: Mutation) {
|
||||||
|
if !target.global().as_window().get_exists_mut_observer() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Step 1
|
// Step 1
|
||||||
let mut interestedObservers: Vec<(DomRoot<MutationObserver>, Option<DOMString>)> = vec![];
|
let mut interestedObservers: Vec<(DomRoot<MutationObserver>, Option<DOMString>)> = vec![];
|
||||||
// Step 2 & 3
|
// Step 2 & 3
|
||||||
|
|
|
@ -285,9 +285,20 @@ pub struct Window {
|
||||||
/// The Webrender Document id associated with this window.
|
/// The Webrender Document id associated with this window.
|
||||||
#[ignore_malloc_size_of = "defined in webrender_api"]
|
#[ignore_malloc_size_of = "defined in webrender_api"]
|
||||||
webrender_document: DocumentId,
|
webrender_document: DocumentId,
|
||||||
|
|
||||||
|
/// Flag to identify whether mutation observers are present(true)/absent(false)
|
||||||
|
exists_mut_observer: Cell<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
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)]
|
#[allow(unsafe_code)]
|
||||||
pub fn clear_js_runtime_for_script_deallocation(&self) {
|
pub fn clear_js_runtime_for_script_deallocation(&self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -1814,6 +1825,7 @@ impl Window {
|
||||||
test_worklet: Default::default(),
|
test_worklet: Default::default(),
|
||||||
paint_worklet: Default::default(),
|
paint_worklet: Default::default(),
|
||||||
webrender_document,
|
webrender_document,
|
||||||
|
exists_mut_observer: Cell::new(false),
|
||||||
});
|
});
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
47
tests/html/mut_observer_perf.html
Normal file
47
tests/html/mut_observer_perf.html
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset='utf-8'>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
window.onload = function(){
|
||||||
|
|
||||||
|
var script = document.createElement("script");
|
||||||
|
script.setAttribute("attr", "val");
|
||||||
|
|
||||||
|
var start_test = function(targetNode,attr) {
|
||||||
|
var start = performance.now();
|
||||||
|
for( val = 1; val <= 1000; val++) {
|
||||||
|
targetNode.setAttribute(attr, val);
|
||||||
|
}
|
||||||
|
var stop = performance.now();
|
||||||
|
console.log('Time taken:'+ (stop - start)/1000.0);
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = { attributes: true, childList: true };
|
||||||
|
console.log('Mutation Observer Algorithm performance testing...');
|
||||||
|
|
||||||
|
console.log('\nMutation performed without observer ->');
|
||||||
|
start_test(script,"attr");
|
||||||
|
|
||||||
|
console.log('\nMutation performed with observer ->');
|
||||||
|
var callback = function(mutationsList) {
|
||||||
|
for(var mutation of mutationsList) {
|
||||||
|
if (mutation.type == 'childList') {
|
||||||
|
// Uncomment below line to see changes
|
||||||
|
// console.log('A child node has been added or removed.');
|
||||||
|
}
|
||||||
|
else if (mutation.type == 'attributes') {
|
||||||
|
// Uncomment below line to see changes
|
||||||
|
// console.log('The ' + mutation.attributeName + ' attribute was modified.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var observer = new MutationObserver(callback);
|
||||||
|
observer.observe(script, config);
|
||||||
|
start_test(script,"attr");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Add table
Add a link
Reference in a new issue