Bug 1425462 Provide the time anchor points for the relative timestamps of performance.now() and Event.timestamp draft
authorTom Ritter <tom@mozilla.com>
Wed, 17 Jan 2018 15:40:30 -0600
changeset 724411 a6c0992dbcef536c31e65c4b01711d5b889cdfdd
parent 724410 5485dd5e8844723985bf9f48b3e9390d1c57e3ab
child 724412 04a96016086fd744fbd71faf802c81cf933bebe3
push id96741
push userbmo:tom@mozilla.com
push dateWed, 24 Jan 2018 22:45:52 +0000
bugs1425462
milestone59.0a1
Bug 1425462 Provide the time anchor points for the relative timestamps of performance.now() and Event.timestamp MozReview-Commit-ID: 1Rsm078RSFg
dom/events/Event.cpp
dom/performance/Performance.cpp
dom/performance/Performance.h
--- a/dom/events/Event.cpp
+++ b/dom/events/Event.cpp
@@ -1087,53 +1087,60 @@ Event::DefaultPrevented(CallerType aCall
   // this is called by chrome.
   return mEvent->DefaultPreventedByContent() ||
          aCallerType == CallerType::System;
 }
 
 double
 Event::TimeStampImpl() const
 {
+  double ret, origin = 0.0;
+
   if (!sReturnHighResTimeStamp) {
+    MOZ_ASSERT(false);
     return static_cast<double>(mEvent->mTime);
   }
 
   if (mEvent->mTimeStamp.IsNull()) {
-    return 0.0;
+    ret = 0.0;
   }
 
   if (mIsMainThreadEvent) {
     if (NS_WARN_IF(!mOwner)) {
-      return 0.0;
+      ret = 0.0;
     }
 
     nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(mOwner);
     if (NS_WARN_IF(!win)) {
-      return 0.0;
+      ret = 0.0;
     }
 
     Performance* perf = win->GetPerformance();
     if (NS_WARN_IF(!perf)) {
-      return 0.0;
+      ret = 0.0;
     }
 
-    return perf->GetDOMTiming()->TimeStampToDOMHighRes(mEvent->mTimeStamp);
+    ret = perf->GetDOMTiming()->TimeStampToDOMHighRes(mEvent->mTimeStamp);
+    origin = perf->GetDOMTiming()->GetNavigationStartHighRes();
+  } else {
+    workers::WorkerPrivate* workerPrivate =
+      workers::GetCurrentThreadWorkerPrivate();
+    MOZ_ASSERT(workerPrivate);
+
+    ret = workerPrivate->TimeStampToDOMHighRes(mEvent->mTimeStamp);
+    origin = workerPrivate->CreationTime();
   }
 
-  workers::WorkerPrivate* workerPrivate =
-    workers::GetCurrentThreadWorkerPrivate();
-  MOZ_ASSERT(workerPrivate);
-
-  return workerPrivate->TimeStampToDOMHighRes(mEvent->mTimeStamp);
+  return nsRFPService::ReduceTimePrecisionAsMSecs(ret, origin);
 }
 
 double
 Event::TimeStamp() const
 {
-  return nsRFPService::ReduceTimePrecisionAsMSecs(TimeStampImpl());
+  return TimeStampImpl();
 }
 
 NS_IMETHODIMP
 Event::GetDefaultPrevented(bool* aReturn)
 {
   NS_ENSURE_ARG_POINTER(aReturn);
   // This method must be called by only event handlers implemented by C++.
   // Then, the handlers must handle default action.  So, this method don't need
--- a/dom/performance/Performance.cpp
+++ b/dom/performance/Performance.cpp
@@ -117,20 +117,27 @@ Performance::Performance(nsPIDOMWindowIn
 {
   MOZ_ASSERT(NS_IsMainThread());
 }
 
 Performance::~Performance()
 {}
 
 DOMHighResTimeStamp
-Performance::Now() const
+Performance::Now()
 {
+  if (!mPerformanceService) {
+    mPerformanceService = PerformanceService::GetOrCreate();
+  }
+
   TimeDuration duration = TimeStamp::Now() - CreationTimeStamp();
-  return RoundTime(duration.ToMilliseconds());
+  const double maxResolutionMs = 0.005;
+  return nsRFPService::ReduceTimePrecisionAsMSecs(
+    floor(duration.ToMilliseconds() / maxResolutionMs) * maxResolutionMs,
+    mPerformanceService->TimeOrigin(CreationTimeStamp()));
 }
 
 DOMHighResTimeStamp
 Performance::TimeOrigin()
 {
   if (!mPerformanceService) {
     mPerformanceService = PerformanceService::GetOrCreate();
   }
--- a/dom/performance/Performance.h
+++ b/dom/performance/Performance.h
@@ -61,17 +61,17 @@ public:
                                 const Optional<nsAString>& aEntryType,
                                 nsTArray<RefPtr<PerformanceEntry>>& aRetval);
 
   virtual void AddEntry(nsIHttpChannel* channel,
                         nsITimedChannel* timedChannel) = 0;
 
   void ClearResourceTimings();
 
-  DOMHighResTimeStamp Now() const;
+  DOMHighResTimeStamp Now();
 
   DOMHighResTimeStamp TimeOrigin();
 
   void Mark(const nsAString& aName, ErrorResult& aRv);
 
   void ClearMarks(const Optional<nsAString>& aName);
 
   void Measure(const nsAString& aName,