diff options
21 files changed, 121 insertions, 72 deletions
diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index a20aa11c816..dad77b29095 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -75,6 +75,7 @@ rejectionhandled removetrack reset resize +resourcetimingbufferfull right rtl sans-serif diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs index 852fc45424d..9dff17fd872 100644 --- a/components/script/dom/performance.rs +++ b/components/script/dom/performance.rs @@ -26,6 +26,7 @@ use dom_struct::dom_struct; use metrics::ToMs; use std::cell::Cell; use std::cmp::Ordering; +use std::collections::VecDeque; const INVALID_ENTRY_NAMES: &'static [&'static str] = &[ "navigationStart", @@ -139,6 +140,10 @@ pub struct Performance { observers: DomRefCell<Vec<PerformanceObserver>>, pending_notification_observers_task: Cell<bool>, navigation_start_precise: u64, + resource_timing_buffer_size_limit: Cell<usize>, + resource_timing_buffer_current_size: Cell<usize>, + resource_timing_buffer_pending_full_event: Cell<bool>, + resource_timing_secondary_entries: DomRefCell<VecDeque<DomRoot<PerformanceEntry>>>, } impl Performance { @@ -149,6 +154,10 @@ impl Performance { observers: DomRefCell::new(Vec::new()), pending_notification_observers_task: Cell::new(false), navigation_start_precise, + resource_timing_buffer_size_limit: Cell::new(250), + resource_timing_buffer_current_size: Cell::new(0), + resource_timing_buffer_pending_full_event: Cell::new(false), + resource_timing_secondary_entries: DomRefCell::new(VecDeque::new()), } } @@ -208,7 +217,13 @@ impl Performance { /// /// Algorithm spec: /// <https://w3c.github.io/performance-timeline/#queue-a-performanceentry> + /// Also this algorithm has been extented according to : + /// <https://w3c.github.io/resource-timing/#sec-extensions-performance-interface> pub fn queue_entry(&self, entry: &PerformanceEntry, add_to_performance_entries_buffer: bool) { + if entry.entry_type() == "resource" && !self.should_queue_resource_entry(entry) { + return; + } + // Steps 1-3. // Add the performance entry to the list of performance entries that have not // been notified to each performance observer owner, filtering the ones it's @@ -279,6 +294,67 @@ impl Performance { fn now(&self) -> f64 { (time::precise_time_ns() - self.navigation_start_precise).to_ms() } + + fn can_add_resource_timing_entry(&self) -> bool { + self.resource_timing_buffer_current_size.get() <= + self.resource_timing_buffer_size_limit.get() + } + fn copy_secondary_resource_timing_buffer(&self) { + while self.can_add_resource_timing_entry() { + let entry = self + .resource_timing_secondary_entries + .borrow_mut() + .pop_front(); + if let Some(ref entry) = entry { + self.queue_entry(entry, true); + } else { + break; + } + } + } + // `fire a buffer full event` paragraph of + // https://w3c.github.io/resource-timing/#sec-extensions-performance-interface + fn fire_buffer_full_event(&self) { + while !self.resource_timing_secondary_entries.borrow().is_empty() { + let no_of_excess_entries_before = self.resource_timing_secondary_entries.borrow().len(); + + if !self.can_add_resource_timing_entry() { + self.upcast::<EventTarget>() + .fire_event(atom!("resourcetimingbufferfull")); + } + self.copy_secondary_resource_timing_buffer(); + let no_of_excess_entries_after = self.resource_timing_secondary_entries.borrow().len(); + if no_of_excess_entries_before <= no_of_excess_entries_after { + self.resource_timing_secondary_entries.borrow_mut().clear(); + break; + } + } + self.resource_timing_buffer_pending_full_event.set(false); + } + /// `add a PerformanceResourceTiming entry` paragraph of + /// https://w3c.github.io/resource-timing/#sec-extensions-performance-interface + fn should_queue_resource_entry(&self, entry: &PerformanceEntry) -> bool { + // Step 1 is done in the args list. + if !self.resource_timing_buffer_pending_full_event.get() { + // Step 2. + if self.can_add_resource_timing_entry() { + // Step 2.a is done in `queue_entry` + // Step 2.b. + self.resource_timing_buffer_current_size + .set(self.resource_timing_buffer_current_size.get() + 1); + // Step 2.c. + return true; + } + // Step 3. + self.resource_timing_buffer_pending_full_event.set(true); + self.fire_buffer_full_event(); + } + // Steps 4 and 5. + self.resource_timing_secondary_entries + .borrow_mut() + .push_back(DomRoot::from_ref(entry)); + false + } } impl PerformanceMethods for Performance { @@ -407,4 +483,24 @@ impl PerformanceMethods for Performance { .borrow_mut() .clear_entries_by_name_and_type(measure_name, Some(DOMString::from("measure"))); } + // https://w3c.github.io/resource-timing/#dom-performance-clearresourcetimings + fn ClearResourceTimings(&self) { + self.entries + .borrow_mut() + .clear_entries_by_name_and_type(None, Some(DOMString::from("resource"))); + self.resource_timing_buffer_current_size.set(0); + } + + // https://w3c.github.io/resource-timing/#dom-performance-setresourcetimingbuffersize + fn SetResourceTimingBufferSize(&self, max_size: u32) { + self.resource_timing_buffer_size_limit + .set(max_size as usize); + } + + // https://w3c.github.io/resource-timing/#dom-performance-onresourcetimingbufferfull + event_handler!( + resourcetimingbufferfull, + GetOnresourcetimingbufferfull, + SetOnresourcetimingbufferfull + ); } diff --git a/components/script/dom/webidls/Performance.webidl b/components/script/dom/webidls/Performance.webidl index 52f5c7e1797..45358ffa6e8 100644 --- a/components/script/dom/webidls/Performance.webidl +++ b/components/script/dom/webidls/Performance.webidl @@ -34,8 +34,15 @@ partial interface Performance { [Throws] void measure(DOMString measureName, optional DOMString startMark, optional DOMString endMark); void clearMeasures(optional DOMString measureName); -}; + +}; +//https://w3c.github.io/resource-timing/#sec-extensions-performance-interface +partial interface Performance { + void clearResourceTimings (); + void setResourceTimingBufferSize (unsigned long maxSize); + attribute EventHandler onresourcetimingbufferfull; +}; // FIXME(avada): this should be deprecated, but is currently included for web compat // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html#performance-timing-attribute [Exposed=(Window)] diff --git a/tests/wpt/metadata/resource-timing/buffer-full-add-after-full-event.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-add-after-full-event.html.ini index 8f8c89cb287..902fa054368 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-add-after-full-event.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-add-after-full-event.html.ini @@ -1,5 +1,5 @@ [buffer-full-add-after-full-event.html] - expected: ERROR + expected: TIMEOUT [Test that entry was added to the buffer after a buffer full event] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback-that-drop.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback-that-drop.html.ini index c5f760f9e17..7a15de3447e 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback-that-drop.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback-that-drop.html.ini @@ -1,5 +1,5 @@ [buffer-full-add-entries-during-callback-that-drop.html] - expected: ERROR + expected: TIMEOUT [Test that entries synchronously added to the buffer during the callback are dropped] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback.html.ini index 9276e6bcf81..86ad7c8c77a 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-add-entries-during-callback.html.ini @@ -1,5 +1,5 @@ [buffer-full-add-entries-during-callback.html] - expected: ERROR + expected: TIMEOUT [Test that entries synchronously added to the buffer during the callback don't get dropped if the buffer is increased] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-add-then-clear.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-add-then-clear.html.ini index cfe4645b520..b1a9194fbdd 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-add-then-clear.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-add-then-clear.html.ini @@ -1,5 +1,4 @@ [buffer-full-add-then-clear.html] - expected: ERROR [Test that if the buffer is cleared after entries were added to the secondary buffer, those entries make it into the primary one] expected: FAIL diff --git a/tests/wpt/metadata/resource-timing/buffer-full-decrease-buffer-during-callback.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-decrease-buffer-during-callback.html.ini index a46a6cf5af2..c9d60e55c56 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-decrease-buffer-during-callback.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-decrease-buffer-during-callback.html.ini @@ -1,5 +1,5 @@ [buffer-full-decrease-buffer-during-callback.html] - expected: ERROR + expected: TIMEOUT [Test that decreasing the buffer limit during the callback does not drop entries] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-increase-buffer-during-callback.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-increase-buffer-during-callback.html.ini index 76b463b4748..591955086e0 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-increase-buffer-during-callback.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-increase-buffer-during-callback.html.ini @@ -1,5 +1,5 @@ [buffer-full-increase-buffer-during-callback.html] - expected: ERROR + expected: TIMEOUT [Test that increasing the buffer during the callback is enough for entries not to be dropped] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-inspect-buffer-during-callback.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-inspect-buffer-during-callback.html.ini index 5e81c821fbf..673b5961973 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-inspect-buffer-during-callback.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-inspect-buffer-during-callback.html.ini @@ -1,5 +1,5 @@ [buffer-full-inspect-buffer-during-callback.html] - expected: ERROR + expected: TIMEOUT [Test that entries in the secondary buffer are not exposed during the callback and before they are copied to the primary buffer] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-set-to-current-buffer.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-set-to-current-buffer.html.ini index 22395fd3be3..b05a4b463da 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-set-to-current-buffer.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-set-to-current-buffer.html.ini @@ -1,5 +1,5 @@ [buffer-full-set-to-current-buffer.html] - expected: ERROR + expected: TIMEOUT [Test that entries added and event firing happened in the right sequence] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini index 4f9df99fc13..88339633554 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini @@ -1,5 +1,5 @@ [buffer-full-store-and-clear-during-callback.html] - expected: ERROR + expected: TIMEOUT [Test that entries overflowing the buffer trigger the buffer full event, can be stored, and find themselves in the primary buffer after it's cleared.] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/buffer-full-then-increased.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-then-increased.html.ini index 7ca75fa2d85..de406c0851a 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-then-increased.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-then-increased.html.ini @@ -1,5 +1,4 @@ [buffer-full-then-increased.html] - expected: ERROR [Test that overflowing the buffer and immediately increasing its limit does not trigger the resourcetimingbufferfull event] expected: FAIL diff --git a/tests/wpt/metadata/resource-timing/buffer-full-when-populate-entries.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-when-populate-entries.html.ini index 95f7d2b5ea1..d1181cec9bc 100644 --- a/tests/wpt/metadata/resource-timing/buffer-full-when-populate-entries.html.ini +++ b/tests/wpt/metadata/resource-timing/buffer-full-when-populate-entries.html.ini @@ -1,5 +1,5 @@ [buffer-full-when-populate-entries.html] - expected: ERROR + expected: TIMEOUT [Test that a buffer full event does not bubble and that resourcetimingbufferfull is called only once per overflow] expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/clear_resource_timing_functionality.html.ini b/tests/wpt/metadata/resource-timing/clear_resource_timing_functionality.html.ini index e3621276db4..4580ffd476f 100644 --- a/tests/wpt/metadata/resource-timing/clear_resource_timing_functionality.html.ini +++ b/tests/wpt/metadata/resource-timing/clear_resource_timing_functionality.html.ini @@ -1,5 +1,4 @@ [clear_resource_timing_functionality.html] - expected: ERROR [4 resource timing entries should be stored in this page.] expected: FAIL diff --git a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini index e2a7284a204..8d744df9562 100644 --- a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini +++ b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini @@ -38,15 +38,9 @@ [PerformanceResourceTiming interface: attribute responseEnd] expected: FAIL - [Performance interface: operation setResourceTimingBufferSize(unsigned long)] - expected: FAIL - [PerformanceResourceTiming interface: attribute secureConnectionStart] expected: FAIL - [Performance interface: calling setResourceTimingBufferSize(unsigned long) on performance with too few arguments must throw TypeError] - expected: FAIL - [PerformanceResourceTiming interface: attribute fetchStart] expected: FAIL @@ -71,21 +65,9 @@ [PerformanceResourceTiming interface: attribute connectStart] expected: FAIL - [Performance interface: operation clearResourceTimings()] - expected: FAIL - [PerformanceResourceTiming interface: resource must inherit property "responseEnd" with the proper type] expected: FAIL - [Performance interface: performance must inherit property "onresourcetimingbufferfull" with the proper type] - expected: FAIL - - [Performance interface: performance must inherit property "setResourceTimingBufferSize(unsigned long)" with the proper type] - expected: FAIL - - [Performance interface: attribute onresourcetimingbufferfull] - expected: FAIL - [PerformanceResourceTiming interface: attribute connectEnd] expected: FAIL @@ -98,9 +80,6 @@ [PerformanceResourceTiming interface: resource must inherit property "domainLookupEnd" with the proper type] expected: FAIL - [Performance interface: performance must inherit property "clearResourceTimings()" with the proper type] - expected: FAIL - [PerformanceResourceTiming interface: attribute domainLookupEnd] expected: FAIL @@ -193,15 +172,9 @@ [PerformanceResourceTiming interface: attribute responseEnd] expected: FAIL - [Performance interface: operation setResourceTimingBufferSize(unsigned long)] - expected: FAIL - [PerformanceResourceTiming interface: attribute secureConnectionStart] expected: FAIL - [Performance interface: calling setResourceTimingBufferSize(unsigned long) on performance with too few arguments must throw TypeError] - expected: FAIL - [PerformanceResourceTiming interface: attribute fetchStart] expected: FAIL @@ -214,27 +187,12 @@ [PerformanceResourceTiming interface: attribute connectStart] expected: FAIL - [Performance interface: operation clearResourceTimings()] - expected: FAIL - - [Performance interface: performance must inherit property "onresourcetimingbufferfull" with the proper type] - expected: FAIL - - [Performance interface: performance must inherit property "setResourceTimingBufferSize(unsigned long)" with the proper type] - expected: FAIL - - [Performance interface: attribute onresourcetimingbufferfull] - expected: FAIL - [PerformanceResourceTiming interface: attribute connectEnd] expected: FAIL [PerformanceResourceTiming interface: attribute redirectEnd] expected: FAIL - [Performance interface: performance must inherit property "clearResourceTimings()" with the proper type] - expected: FAIL - [PerformanceResourceTiming interface: attribute domainLookupEnd] expected: FAIL diff --git a/tests/wpt/metadata/resource-timing/resource_memory_cached.sub.html.ini b/tests/wpt/metadata/resource-timing/resource_memory_cached.sub.html.ini index ac0142e016b..522e5cff4eb 100644 --- a/tests/wpt/metadata/resource-timing/resource_memory_cached.sub.html.ini +++ b/tests/wpt/metadata/resource-timing/resource_memory_cached.sub.html.ini @@ -1,5 +1,4 @@ [resource_memory_cached.sub.html] - expected: ERROR [http://web-platform.test:8000/resource-timing/resources/blue.png?id=cached is expected to be in the Resource Timing buffer] expected: FAIL diff --git a/tests/wpt/metadata/resource-timing/resource_subframe_self_navigation.html.ini b/tests/wpt/metadata/resource-timing/resource_subframe_self_navigation.html.ini index e96e303017d..639054f0353 100644 --- a/tests/wpt/metadata/resource-timing/resource_subframe_self_navigation.html.ini +++ b/tests/wpt/metadata/resource-timing/resource_subframe_self_navigation.html.ini @@ -1,13 +1,14 @@ [resource_subframe_self_navigation.html] + expected: TIMEOUT [Subsequent <iframe> navigations don't appear in the resource-timing buffer.] - expected: FAIL + expected: TIMEOUT [Subsequent <frame> navigations don't appear in the resource-timing buffer.] - expected: FAIL + expected: NOTRUN [Subsequent <embed> navigations don't appear in the resource-timing buffer.] - expected: FAIL + expected: NOTRUN [Subsequent <object> navigations don't appear in the resource-timing buffer.] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/metadata/resource-timing/resource_timing.worker.js.ini b/tests/wpt/metadata/resource-timing/resource_timing.worker.js.ini index 58f85400e7d..fcd21fa697b 100644 --- a/tests/wpt/metadata/resource-timing/resource_timing.worker.js.ini +++ b/tests/wpt/metadata/resource-timing/resource_timing.worker.js.ini @@ -1,7 +1,8 @@ [resource_timing.worker.html] + expected: TIMEOUT [Performance Resouce Entries in workers] expected: FAIL [Performance Resource Entries in workers] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/resource_timing_buffer_full_eventually.html.ini b/tests/wpt/metadata/resource-timing/resource_timing_buffer_full_eventually.html.ini deleted file mode 100644 index aa1d99e9604..00000000000 --- a/tests/wpt/metadata/resource-timing/resource_timing_buffer_full_eventually.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[resource_timing_buffer_full_eventually.html] - expected: TIMEOUT - [Finite resource timing entries buffer size] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/workers/worker-performance.worker.js.ini b/tests/wpt/metadata/workers/worker-performance.worker.js.ini index 6048b1478b2..dfbd1fa7f58 100644 --- a/tests/wpt/metadata/workers/worker-performance.worker.js.ini +++ b/tests/wpt/metadata/workers/worker-performance.worker.js.ini @@ -12,12 +12,6 @@ [Resource timing seems to work in workers] expected: FAIL - [performance.clearResourceTimings in workers] - expected: FAIL - - [performance.setResourceTimingBufferSize in workers] - expected: FAIL - [performance.timing is not available in workers] expected: FAIL |