diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-13 01:45:10 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-13 01:45:10 +0530 |
commit | 421dcc92f05532e5d8bda850c8d14c9375da2bd9 (patch) | |
tree | babee8bc10c6a373e92f4e868f05481c822f3772 | |
parent | 85f4e5828548f2f25b2d75cb2853b896a0854ab3 (diff) | |
parent | 7169a08a343494a757f10ac552eb2390fca482f9 (diff) | |
download | servo-421dcc92f05532e5d8bda850c8d14c9375da2bd9.tar.gz servo-421dcc92f05532e5d8bda850c8d14c9375da2bd9.zip |
Auto merge of #10538 - izgzhen:performance_timing, r=Ms2ger
Improve PerformanceTiming Interface
Solving https://github.com/servo/servo/issues/10428
- Fix timing precision in old `update_with_current_time`
- Correct time unit in `navigation_start`
- Add `LoadEventStart` and `LoadEventEnd` timing properties
There are still many properties left unimplemented. I tend to leave the for future PRs.
Welcome comments!
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10538)
<!-- Reviewable:end -->
-rw-r--r-- | components/script/dom/document.rs | 38 | ||||
-rw-r--r-- | components/script/dom/performancetiming.rs | 10 | ||||
-rw-r--r-- | components/script/dom/webidls/PerformanceTiming.webidl | 4 | ||||
-rw-r--r-- | components/script/dom/window.rs | 3 | ||||
-rw-r--r-- | tests/wpt/metadata/hr-time/test_cross_frame_start.html.ini | 8 |
5 files changed, 43 insertions, 20 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index ad68be7175f..e38ab86bf29 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -209,13 +209,15 @@ pub struct Document { modified_elements: DOMRefCell<HashMap<JS<Element>, ElementSnapshot>>, /// http://w3c.github.io/touch-events/#dfn-active-touch-point active_touch_points: DOMRefCell<Vec<JS<Touch>>>, - /// DOM-Related Navigation Timing properties: - /// http://w3c.github.io/navigation-timing/#widl-PerformanceTiming-domLoading + /// Navigation Timing properties: + /// https://w3c.github.io/navigation-timing/#sec-PerformanceNavigationTiming dom_loading: Cell<u64>, dom_interactive: Cell<u64>, dom_content_loaded_event_start: Cell<u64>, dom_content_loaded_event_end: Cell<u64>, dom_complete: Cell<u64>, + load_event_start: Cell<u64>, + load_event_end: Cell<u64>, /// Vector to store CSS errors css_errors_store: DOMRefCell<Vec<CSSError>>, /// https://html.spec.whatwg.org/multipage/#concept-document-https-state @@ -544,14 +546,14 @@ impl Document { DocumentReadyState::Loading => { // https://developer.mozilla.org/en-US/docs/Web/Events/mozbrowserconnected self.trigger_mozbrowser_event(MozBrowserEvent::Connected); - update_with_current_time(&self.dom_loading); + update_with_current_time_ms(&self.dom_loading); }, DocumentReadyState::Complete => { // https://developer.mozilla.org/en-US/docs/Web/Events/mozbrowserloadend self.trigger_mozbrowser_event(MozBrowserEvent::LoadEnd); - update_with_current_time(&self.dom_complete); + update_with_current_time_ms(&self.dom_complete); }, - DocumentReadyState::Interactive => update_with_current_time(&self.dom_interactive), + DocumentReadyState::Interactive => update_with_current_time_ms(&self.dom_interactive), }; self.ready_state.set(state); @@ -1447,7 +1449,7 @@ impl Document { } self.domcontentloaded_dispatched.set(true); - update_with_current_time(&self.dom_content_loaded_event_start); + update_with_current_time_ms(&self.dom_content_loaded_event_start); let chan = MainThreadScriptChan(self.window().main_thread_script_chan().clone()).clone(); let doctarget = Trusted::new(self.upcast::<EventTarget>(), chan); @@ -1458,7 +1460,7 @@ impl Document { ReflowQueryType::NoQuery, ReflowReason::DOMContentLoaded); - update_with_current_time(&self.dom_content_loaded_event_end); + update_with_current_time_ms(&self.dom_content_loaded_event_end); } pub fn notify_constellation_load(&self) { @@ -1513,6 +1515,14 @@ impl Document { self.dom_complete.get() } + pub fn get_load_event_start(&self) -> u64 { + self.load_event_start.get() + } + + pub fn get_load_event_end(&self) -> u64 { + self.load_event_end.get() + } + // https://html.spec.whatwg.org/multipage/#fire-a-focus-event fn fire_focus_event(&self, focus_event_type: FocusEventType, node: &Node, relatedTarget: Option<&EventTarget>) { let (event_name, does_bubble) = match focus_event_type { @@ -1658,6 +1668,8 @@ impl Document { dom_content_loaded_event_start: Cell::new(Default::default()), dom_content_loaded_event_end: Cell::new(Default::default()), dom_complete: Cell::new(Default::default()), + load_event_start: Cell::new(Default::default()), + load_event_end: Cell::new(Default::default()), css_errors_store: DOMRefCell::new(vec![]), https_state: Cell::new(HttpsState::None), touchpad_pressure_phase: Cell::new(TouchpadPressurePhase::BeforeClick), @@ -2712,9 +2724,10 @@ fn is_scheme_host_port_tuple(url: &Url) -> bool { url.host().is_some() && url.port_or_default().is_some() } -fn update_with_current_time(marker: &Cell<u64>) { +fn update_with_current_time_ms(marker: &Cell<u64>) { if marker.get() == Default::default() { - let current_time_ms = time::get_time().sec * 1000; + let time = time::get_time(); + let current_time_ms = time.sec * 1000 + time.nsec as i64 / 1000000; marker.set(current_time_ms as u64); } } @@ -2744,8 +2757,15 @@ impl DocumentProgressHandler { EventCancelable::NotCancelable); let wintarget = window.upcast::<EventTarget>(); event.set_trusted(true); + + // http://w3c.github.io/navigation-timing/#widl-PerformanceNavigationTiming-loadEventStart + update_with_current_time_ms(&document.load_event_start); + let _ = wintarget.dispatch_event_with_target(document.upcast(), &event); + // http://w3c.github.io/navigation-timing/#widl-PerformanceNavigationTiming-loadEventEnd + update_with_current_time_ms(&document.load_event_end); + document.notify_constellation_load(); window.reflow(ReflowGoal::ForDisplay, diff --git a/components/script/dom/performancetiming.rs b/components/script/dom/performancetiming.rs index c9f2458de3e..02da92f3b89 100644 --- a/components/script/dom/performancetiming.rs +++ b/components/script/dom/performancetiming.rs @@ -76,6 +76,16 @@ impl PerformanceTimingMethods for PerformanceTiming { fn DomComplete(&self) -> u64 { self.document.get_dom_complete() } + + // https://w3c.github.io/navigation-timing/#widl-PerformanceTiming-loadEventStart + fn LoadEventStart(&self) -> u64 { + self.document.get_load_event_start() + } + + // https://w3c.github.io/navigation-timing/#widl-PerformanceTiming-loadEventEnd + fn LoadEventEnd(&self) -> u64 { + self.document.get_load_event_end() + } } diff --git a/components/script/dom/webidls/PerformanceTiming.webidl b/components/script/dom/webidls/PerformanceTiming.webidl index a016f2b1616..7a2fdaebec0 100644 --- a/components/script/dom/webidls/PerformanceTiming.webidl +++ b/components/script/dom/webidls/PerformanceTiming.webidl @@ -27,6 +27,6 @@ interface PerformanceTiming { readonly attribute unsigned long long domContentLoadedEventStart; readonly attribute unsigned long long domContentLoadedEventEnd; readonly attribute unsigned long long domComplete; - /* readonly attribute unsigned long long loadEventStart; - readonly attribute unsigned long long loadEventEnd; */ + readonly attribute unsigned long long loadEventStart; + readonly attribute unsigned long long loadEventEnd; }; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index da415c5d0f2..8a3affefe06 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1383,6 +1383,7 @@ impl Window { pipelineid: id, script_chan: Arc::new(Mutex::new(control_chan)), }; + let current_time = time::get_time(); let win = box Window { eventtarget: EventTarget::new_inherited(), script_chan: script_chan, @@ -1402,7 +1403,7 @@ impl Window { devtools_chan: devtools_chan, browsing_context: Default::default(), performance: Default::default(), - navigation_start: time::get_time().sec as u64, + navigation_start: (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64, navigation_start_precise: time::precise_time_ns() as f64, screen: Default::default(), session_storage: Default::default(), diff --git a/tests/wpt/metadata/hr-time/test_cross_frame_start.html.ini b/tests/wpt/metadata/hr-time/test_cross_frame_start.html.ini deleted file mode 100644 index 78f8aef8a7d..00000000000 --- a/tests/wpt/metadata/hr-time/test_cross_frame_start.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[test_cross_frame_start.html] - type: testharness - [Child created at least 1 second after parent] - expected: FAIL - - [Child and parent time bases are correct] - expected: FAIL - |