From 074447e5019b4e147ec126f6a0ff838317fec5c7 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Thu, 14 Dec 2017 16:48:19 -0600 Subject: [PATCH] Add a topLevelDomComplete metric. --- components/script/document_loader.rs | 7 +++++++ components/script/dom/document.rs | 12 ++++++++++++ components/script/dom/performancetiming.rs | 6 ++++++ .../dom/webidls/PerformanceTiming.webidl | 3 +++ tests/wpt/mozilla/meta/MANIFEST.json | 10 ++++++++++ ...ow_performance_topLevelDomComplete.html.ini | 3 +++ ...window_performance_topLevelDomComplete.html | 18 ++++++++++++++++++ 7 files changed, 59 insertions(+) create mode 100644 tests/wpt/mozilla/meta/mozilla/window_performance_topLevelDomComplete.html.ini create mode 100644 tests/wpt/mozilla/tests/mozilla/window_performance_topLevelDomComplete.html diff --git a/components/script/document_loader.rs b/components/script/document_loader.rs index 9fa1f251dbc0..6761f175a3fb 100644 --- a/components/script/document_loader.rs +++ b/components/script/document_loader.rs @@ -141,6 +141,13 @@ impl DocumentLoader { !self.blocking_loads.is_empty() } + pub fn is_only_blocked_by_iframes(&self) -> bool { + self.blocking_loads.iter().all(|load| match *load { + LoadType::Subframe(_) => true, + _ => false + }) + } + pub fn inhibit_events(&mut self) { self.events_inhibited = true; } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 2c27450b29b6..75a54e5c6b9c 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -322,6 +322,7 @@ pub struct Document { dom_content_loaded_event_start: Cell, dom_content_loaded_event_end: Cell, dom_complete: Cell, + top_level_dom_complete: Cell, load_event_start: Cell, load_event_end: Cell, /// @@ -1627,6 +1628,12 @@ impl Document { // asap_in_order_script_loaded. let loader = self.loader.borrow(); + + // Servo measures when the top-level content (not iframes) is loaded. + if (self.top_level_dom_complete.get() == 0) && loader.is_only_blocked_by_iframes() { + update_with_current_time_ms(&self.top_level_dom_complete); + } + if loader.is_blocked() || loader.events_inhibited() { // Step 6. return; @@ -1951,6 +1958,10 @@ impl Document { self.dom_complete.get() } + pub fn get_top_level_dom_complete(&self) -> u64 { + self.top_level_dom_complete.get() + } + pub fn get_load_event_start(&self) -> u64 { self.load_event_start.get() } @@ -2265,6 +2276,7 @@ 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()), + top_level_dom_complete: Cell::new(Default::default()), load_event_start: Cell::new(Default::default()), load_event_end: Cell::new(Default::default()), https_state: Cell::new(HttpsState::None), diff --git a/components/script/dom/performancetiming.rs b/components/script/dom/performancetiming.rs index 0ede2f69b073..7df8e9d2c767 100644 --- a/components/script/dom/performancetiming.rs +++ b/components/script/dom/performancetiming.rs @@ -86,6 +86,12 @@ impl PerformanceTimingMethods for PerformanceTiming { fn LoadEventEnd(&self) -> u64 { self.document.get_load_event_end() } + + // check-tidy: no specs after this line + // Servo-only timing for when top-level content (not iframes) is complete + fn TopLevelDomComplete(&self) -> u64 { + self.document.get_top_level_dom_complete() + } } diff --git a/components/script/dom/webidls/PerformanceTiming.webidl b/components/script/dom/webidls/PerformanceTiming.webidl index 9186a7c56f40..e11c70114589 100644 --- a/components/script/dom/webidls/PerformanceTiming.webidl +++ b/components/script/dom/webidls/PerformanceTiming.webidl @@ -29,4 +29,7 @@ interface PerformanceTiming { readonly attribute unsigned long long domComplete; readonly attribute unsigned long long loadEventStart; readonly attribute unsigned long long loadEventEnd; + /* Servo-onnly attribute for measuring when the top-level document (not iframes) is complete. */ + [Pref="dom.testperf.enabled"] + readonly attribute unsigned long long topLevelDomComplete; }; diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 1bd5d50b9b9b..5d1837401179 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -40195,6 +40195,12 @@ {} ] ], + "mozilla/window_performance_topLevelDomComplete.html": [ + [ + "/_mozilla/mozilla/window_performance_topLevelDomComplete.html", + {} + ] + ], "mozilla/window_requestAnimationFrame.html": [ [ "/_mozilla/mozilla/window_requestAnimationFrame.html", @@ -72342,6 +72348,10 @@ "f03283e68b82d972ad21f674243070643ef89489", "testharness" ], + "mozilla/window_performance_topLevelDomComplete.html": [ + "4b953e63ffa6bf4ed1bc9a2baaea457d46502b9d", + "testharness" + ], "mozilla/window_requestAnimationFrame.html": [ "86310f3e4b88cce70ef92b56e4f65f034999096e", "testharness" diff --git a/tests/wpt/mozilla/meta/mozilla/window_performance_topLevelDomComplete.html.ini b/tests/wpt/mozilla/meta/mozilla/window_performance_topLevelDomComplete.html.ini new file mode 100644 index 000000000000..ac65905cb3df --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/window_performance_topLevelDomComplete.html.ini @@ -0,0 +1,3 @@ +[window_performance_topLevelDomComplete.html] + type: testharness + prefs: [dom.testperf.enabled:true] diff --git a/tests/wpt/mozilla/tests/mozilla/window_performance_topLevelDomComplete.html b/tests/wpt/mozilla/tests/mozilla/window_performance_topLevelDomComplete.html new file mode 100644 index 000000000000..ce2431a7279e --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/window_performance_topLevelDomComplete.html @@ -0,0 +1,18 @@ + + + Performance toLevelDomComplete + + + + + + +