aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/performance.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/performance.rs')
-rw-r--r--components/script/dom/performance.rs63
1 files changed, 27 insertions, 36 deletions
diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs
index 540405da372..311e1ecaa3b 100644
--- a/components/script/dom/performance.rs
+++ b/components/script/dom/performance.rs
@@ -6,17 +6,17 @@ use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::PerformanceBinding;
use dom::bindings::codegen::Bindings::PerformanceBinding::{DOMHighResTimeStamp, PerformanceMethods};
use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceEntryList as DOMPerformanceEntryList;
+use dom::bindings::inheritance::Castable;
use dom::bindings::js::{JS, Root};
use dom::bindings::num::Finite;
-use dom::bindings::refcounted::Trusted;
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
use dom::bindings::str::DOMString;
+use dom::globalscope::GlobalScope;
use dom::performanceentry::PerformanceEntry;
use dom::performanceobserver::PerformanceObserver as DOMPerformanceObserver;
use dom::performancetiming::PerformanceTiming;
use dom::window::Window;
use dom_struct::dom_struct;
-use script_thread::{Runnable, ScriptThread};
use std::cell::Cell;
use std::cmp::Ordering;
use time;
@@ -64,34 +64,40 @@ struct PerformanceObserver {
#[dom_struct]
pub struct Performance {
reflector_: Reflector,
- timing: JS<PerformanceTiming>,
+ timing: Option<JS<PerformanceTiming>>,
entries: DOMRefCell<PerformanceEntryList>,
observers: DOMRefCell<Vec<PerformanceObserver>>,
pending_notification_observers_task: Cell<bool>,
+ navigation_start_precise: f64,
}
impl Performance {
- fn new_inherited(window: &Window,
+ fn new_inherited(global: &GlobalScope,
navigation_start: u64,
navigation_start_precise: f64) -> Performance {
Performance {
reflector_: Reflector::new(),
- timing: JS::from_ref(&*PerformanceTiming::new(window,
- navigation_start,
- navigation_start_precise)),
+ timing: if global.is::<Window>() {
+ Some(JS::from_ref(&*PerformanceTiming::new(global.as_window(),
+ navigation_start,
+ navigation_start_precise)))
+ } else {
+ None
+ },
entries: DOMRefCell::new(PerformanceEntryList::new(Vec::new())),
observers: DOMRefCell::new(Vec::new()),
pending_notification_observers_task: Cell::new(false),
+ navigation_start_precise,
}
}
- pub fn new(window: &Window,
+ pub fn new(global: &GlobalScope,
navigation_start: u64,
navigation_start_precise: f64) -> Root<Performance> {
- reflect_dom_object(box Performance::new_inherited(window,
+ reflect_dom_object(box Performance::new_inherited(global,
navigation_start,
navigation_start_precise),
- window,
+ global,
PerformanceBinding::Wrap)
}
@@ -168,17 +174,15 @@ impl Performance {
// Step 6.
// Queue a new notification task.
self.pending_notification_observers_task.set(true);
- let global = self.global();
- let window = global.as_window();
- let task_source = window.performance_timeline_task_source();
- task_source.queue_notification(self, window);
+ let task_source = self.global().performance_timeline_task_source();
+ task_source.queue_notification(&self.global());
}
/// Observers notifications task.
///
/// Algorithm spec (step 7):
/// https://w3c.github.io/performance-timeline/#queue-a-performanceentry
- fn notify_observers(&self) {
+ pub fn notify_observers(&self) {
// Step 7.1.
self.pending_notification_observers_task.set(false);
@@ -200,34 +204,21 @@ impl Performance {
}
}
-pub struct NotifyPerformanceObserverRunnable {
- owner: Trusted<Performance>,
-}
-
-impl NotifyPerformanceObserverRunnable {
- pub fn new(owner: Trusted<Performance>) -> Self {
- NotifyPerformanceObserverRunnable {
- owner,
- }
- }
-}
-
-impl Runnable for NotifyPerformanceObserverRunnable {
- fn main_thread_handler(self: Box<NotifyPerformanceObserverRunnable>,
- _: &ScriptThread) {
- self.owner.root().notify_observers();
- }
-}
-
impl PerformanceMethods for Performance {
// https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html#performance-timing-attribute
fn Timing(&self) -> Root<PerformanceTiming> {
- Root::from_ref(&*self.timing)
+ match self.timing {
+ Some(ref timing) => Root::from_ref(&*timing),
+ None => unreachable!("Are we trying to expose Performance.timing in workers?"),
+ }
}
// https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/HighResolutionTime/Overview.html#dom-performance-now
fn Now(&self) -> DOMHighResTimeStamp {
- let nav_start = self.timing.navigation_start_precise();
+ let nav_start = match self.timing {
+ Some(ref timing) => timing.navigation_start_precise(),
+ None => self.navigation_start_precise,
+ };
let now = (time::precise_time_ns() as f64 - nav_start) / 1000000 as f64;
Finite::wrap(now)
}