aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/performance.rs
diff options
context:
space:
mode:
authorRemi THEBAULT <remi.thebault@gmail.com>2017-08-21 02:02:10 +0200
committerRemi THEBAULT <remi.thebault@gmail.com>2017-08-24 23:30:35 +0200
commite186b52b048e1da55b6d76e814ce3725000659e0 (patch)
tree3618d9bbecf49729010ae9d973b057f0ba771f2f /components/script/dom/performance.rs
parent10cd518b59074d6fbc7bac23ada8702ddc38c4bf (diff)
downloadservo-e186b52b048e1da55b6d76e814ce3725000659e0.tar.gz
servo-e186b52b048e1da55b6d76e814ce3725000659e0.zip
implement PerformanceObserverInit.buffered (fixes #18108)
Diffstat (limited to 'components/script/dom/performance.rs')
-rw-r--r--components/script/dom/performance.rs23
1 files changed, 22 insertions, 1 deletions
diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs
index bb2c5885bcb..fdcbfd4a813 100644
--- a/components/script/dom/performance.rs
+++ b/components/script/dom/performance.rs
@@ -18,6 +18,7 @@ use dom::window::Window;
use dom_struct::dom_struct;
use script_thread::{Runnable, ScriptThread};
use std::cell::Cell;
+use std::cmp::Ordering;
use time;
/// Implementation of a list of PerformanceEntry items shared by the
@@ -51,6 +52,16 @@ impl PerformanceEntryList {
entry_type.as_ref().map_or(true, |type_| *e.entry_type() == *type_)
).map(|e| e.clone()).collect()
}
+
+ pub fn get_entries_by_name_and_type(&self, name: Option<DOMString>, entry_type: Option<DOMString>)
+ -> Vec<Root<PerformanceEntry>> {
+ let mut res = self.entries.iter().filter(|e|
+ name.as_ref().map_or(true, |name_| *e.name() == *name_) &&
+ entry_type.as_ref().map_or(true, |type_| *e.entry_type() == *type_)
+ ).map(|e| e.clone()).collect::<Vec<Root<PerformanceEntry>>>();
+ res.sort_by(|a, b| a.start_time().partial_cmp(&b.start_time()).unwrap_or(Ordering::Equal));
+ res
+ }
}
impl IntoIterator for PerformanceEntryList {
@@ -106,7 +117,17 @@ impl Performance {
/// observed entry types.
pub fn add_observer(&self,
observer: &DOMPerformanceObserver,
- entry_types: Vec<DOMString>) {
+ entry_types: Vec<DOMString>,
+ buffered: bool) {
+ if buffered {
+ let entries = self.entries.borrow();
+ let mut new_entries = entry_types.iter()
+ .flat_map(|e| entries.get_entries_by_name_and_type(None, Some(e.clone())))
+ .collect::<DOMPerformanceEntryList>();
+ let mut obs_entries = observer.entries();
+ obs_entries.append(&mut new_entries);
+ observer.set_entries(obs_entries);
+ }
let mut observers = self.observers.borrow_mut();
match observers.iter().position(|o| &(*o.observer) == observer) {
// If the observer is already in the list, we only update the observed