Set navigation start value according to navigation timing spec

This commit is contained in:
Fernando Jiménez Moreno 2017-07-17 21:40:10 +02:00
parent 66b9544d60
commit db044bdbef
3 changed files with 28 additions and 10 deletions

View file

@ -3659,6 +3659,8 @@ impl DocumentMethods for Document {
// Step 10. // Step 10.
// TODO: prompt to unload. // TODO: prompt to unload.
window_from_node(self).set_navigation_start();
// Step 11. // Step 11.
// TODO: unload. // TODO: unload.

View file

@ -184,8 +184,8 @@ pub struct Window {
history: MutNullableJS<History>, history: MutNullableJS<History>,
custom_element_registry: MutNullableJS<CustomElementRegistry>, custom_element_registry: MutNullableJS<CustomElementRegistry>,
performance: MutNullableJS<Performance>, performance: MutNullableJS<Performance>,
navigation_start: u64, navigation_start: Cell<u64>,
navigation_start_precise: f64, navigation_start_precise: Cell<f64>,
screen: MutNullableJS<Screen>, screen: MutNullableJS<Screen>,
session_storage: MutNullableJS<Storage>, session_storage: MutNullableJS<Storage>,
local_storage: MutNullableJS<Storage>, local_storage: MutNullableJS<Storage>,
@ -702,8 +702,8 @@ impl WindowMethods for Window {
// NavigationTiming/Overview.html#sec-window.performance-attribute // NavigationTiming/Overview.html#sec-window.performance-attribute
fn Performance(&self) -> Root<Performance> { fn Performance(&self) -> Root<Performance> {
self.performance.or_init(|| { self.performance.or_init(|| {
Performance::new(self, self.navigation_start, Performance::new(self, self.navigation_start.get(),
self.navigation_start_precise) self.navigation_start_precise.get())
}) })
} }
@ -1772,6 +1772,13 @@ impl Window {
pub fn unminified_js_dir(&self) -> Option<String> { pub fn unminified_js_dir(&self) -> Option<String> {
self.unminified_js_dir.borrow().clone() self.unminified_js_dir.borrow().clone()
} }
pub fn set_navigation_start(&self) {
let current_time = time::get_time();
let now = (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64;
self.navigation_start.set(now);
self.navigation_start_precise.set(time::precise_time_ns() as f64);
}
} }
impl Window { impl Window {
@ -1799,6 +1806,8 @@ impl Window {
parent_info: Option<(PipelineId, FrameType)>, parent_info: Option<(PipelineId, FrameType)>,
window_size: Option<WindowSizeData>, window_size: Option<WindowSizeData>,
origin: MutableOrigin, origin: MutableOrigin,
navigation_start: u64,
navigation_start_precise: f64,
webvr_thread: Option<IpcSender<WebVRMsg>>) webvr_thread: Option<IpcSender<WebVRMsg>>)
-> Root<Window> { -> Root<Window> {
let layout_rpc: Box<LayoutRPC + Send> = { let layout_rpc: Box<LayoutRPC + Send> = {
@ -1810,7 +1819,6 @@ impl Window {
pipelineid: id, pipelineid: id,
script_chan: Arc::new(Mutex::new(control_chan)), script_chan: Arc::new(Mutex::new(control_chan)),
}; };
let current_time = time::get_time();
let win = box Window { let win = box Window {
globalscope: globalscope:
GlobalScope::new_inherited( GlobalScope::new_inherited(
@ -1837,8 +1845,8 @@ impl Window {
window_proxy: Default::default(), window_proxy: Default::default(),
document: Default::default(), document: Default::default(),
performance: Default::default(), performance: Default::default(),
navigation_start: (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64, navigation_start: Cell::new(navigation_start),
navigation_start_precise: time::precise_time_ns() as f64, navigation_start_precise: Cell::new(navigation_start_precise),
screen: Default::default(), screen: Default::default(),
session_storage: Default::default(), session_storage: Default::default(),
local_storage: Default::default(), local_storage: Default::default(),

View file

@ -113,7 +113,7 @@ use task_source::file_reading::FileReadingTaskSource;
use task_source::history_traversal::HistoryTraversalTaskSource; use task_source::history_traversal::HistoryTraversalTaskSource;
use task_source::networking::NetworkingTaskSource; use task_source::networking::NetworkingTaskSource;
use task_source::user_interaction::{UserInteractionTask, UserInteractionTaskSource}; use task_source::user_interaction::{UserInteractionTask, UserInteractionTaskSource};
use time::Tm; use time::{get_time, precise_time_ns, Tm};
use url::Position; use url::Position;
use webdriver_handlers; use webdriver_handlers;
use webvr_traits::{WebVREvent, WebVRMsg}; use webvr_traits::{WebVREvent, WebVRMsg};
@ -158,6 +158,10 @@ struct InProgressLoad {
url: ServoUrl, url: ServoUrl,
/// The origin for the document /// The origin for the document
origin: MutableOrigin, origin: MutableOrigin,
/// Timestamp reporting the time when the browser started this load.
navigation_start: u64,
/// High res timestamp reporting the time when the browser started this load.
navigation_start_precise: f64,
} }
impl InProgressLoad { impl InProgressLoad {
@ -170,6 +174,7 @@ impl InProgressLoad {
window_size: Option<WindowSizeData>, window_size: Option<WindowSizeData>,
url: ServoUrl, url: ServoUrl,
origin: MutableOrigin) -> InProgressLoad { origin: MutableOrigin) -> InProgressLoad {
let current_time = get_time();
InProgressLoad { InProgressLoad {
pipeline_id: id, pipeline_id: id,
browsing_context_id: browsing_context_id, browsing_context_id: browsing_context_id,
@ -181,6 +186,8 @@ impl InProgressLoad {
is_visible: true, is_visible: true,
url: url, url: url,
origin: origin, origin: origin,
navigation_start: (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64,
navigation_start_precise: precise_time_ns() as f64,
} }
} }
} }
@ -1809,8 +1816,7 @@ impl ScriptThread {
fn handle_iframe_load_event(&self, fn handle_iframe_load_event(&self,
parent_id: PipelineId, parent_id: PipelineId,
browsing_context_id: BrowsingContextId, browsing_context_id: BrowsingContextId,
child_id: PipelineId) child_id: PipelineId) {
{
let iframe = self.documents.borrow().find_iframe(parent_id, browsing_context_id); let iframe = self.documents.borrow().find_iframe(parent_id, browsing_context_id);
match iframe { match iframe {
Some(iframe) => iframe.iframe_load_event_steps(child_id), Some(iframe) => iframe.iframe_load_event_steps(child_id),
@ -1958,6 +1964,8 @@ impl ScriptThread {
incomplete.parent_info, incomplete.parent_info,
incomplete.window_size, incomplete.window_size,
origin, origin,
incomplete.navigation_start,
incomplete.navigation_start_precise,
self.webvr_thread.clone()); self.webvr_thread.clone());
// Initialize the browsing context for the window. // Initialize the browsing context for the window.