Bug 1425462 Provide the time anchor points for the relative timestamps of performance.now() and Event.timestamp
MozReview-Commit-ID: 1Rsm078RSFg
--- 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,