diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index ad843d7a9b2..7c56e672e11 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -6,8 +6,11 @@ use crate::dom::bindings::callback::ExceptionHandling; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::EventBinding; use crate::dom::bindings::codegen::Bindings::EventBinding::{EventConstants, EventMethods}; +use crate::dom::bindings::codegen::Bindings::PerformanceBinding::DOMHighResTimeStamp; +use crate::dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceBinding::PerformanceMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::num::Finite; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{DomRoot, DomSlice, MutNullableDom}; @@ -21,6 +24,7 @@ use crate::dom::window::Window; use crate::task::TaskOnce; use devtools_traits::{TimelineMarker, TimelineMarkerType}; use dom_struct::dom_struct; +use metrics::ToMs; use servo_atoms::Atom; use std::cell::Cell; use std::default::Default; @@ -40,7 +44,7 @@ pub struct Event { trusted: Cell, dispatching: Cell, initialized: Cell, - timestamp: u64, + precise_time_ns: u64, } impl Event { @@ -59,7 +63,7 @@ impl Event { trusted: Cell::new(false), dispatching: Cell::new(false), initialized: Cell::new(false), - timestamp: time::get_time().sec as u64, + precise_time_ns: time::precise_time_ns(), } } @@ -322,8 +326,11 @@ impl EventMethods for Event { } // https://dom.spec.whatwg.org/#dom-event-timestamp - fn TimeStamp(&self) -> u64 { - self.timestamp + fn TimeStamp(&self) -> DOMHighResTimeStamp { + Finite::wrap( + (self.precise_time_ns - (*self.global().performance().TimeOrigin()).round() as u64) + .to_ms(), + ) } // https://dom.spec.whatwg.org/#dom-event-initevent diff --git a/components/script/dom/webidls/Event.webidl b/components/script/dom/webidls/Event.webidl index f6074bd68f3..2bf103149d9 100644 --- a/components/script/dom/webidls/Event.webidl +++ b/components/script/dom/webidls/Event.webidl @@ -35,7 +35,7 @@ interface Event { [Unforgeable] readonly attribute boolean isTrusted; [Constant] - readonly attribute DOMTimeStamp timeStamp; + readonly attribute DOMHighResTimeStamp timeStamp; void initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false); }; diff --git a/tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini b/tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini index 98529d90e07..1e980e21f8b 100644 --- a/tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini +++ b/tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini @@ -3,18 +3,9 @@ [Untitled] expected: FAIL - [Constructed MouseEvent timestamp should be high resolution and have the same time origin as performance.now()] - expected: FAIL - - [Constructed KeyboardEvent timestamp should be high resolution and have the same time origin as performance.now()] - expected: FAIL - [Constructed WheelEvent timestamp should be high resolution and have the same time origin as performance.now()] expected: FAIL [Constructed GamepadEvent timestamp should be high resolution and have the same time origin as performance.now()] expected: FAIL - [Constructed FocusEvent timestamp should be high resolution and have the same time origin as performance.now()] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini b/tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini index ac11cedded6..eba00488f66 100644 --- a/tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini +++ b/tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini @@ -1,3 +1,6 @@ [Event-timestamp-safe-resolution.html] type: testharness - expected: TIMEOUT + + [Event timestamp should not have a resolution better than 5 microseconds] + expected: FAIL +