Bug 1571219 - Refactor PerformanceMeasure to avoid double-reducing timestamps r=baku

Differential Revision: https://phabricator.services.mozilla.com/D50127

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Tom Ritter 2019-10-23 11:42:10 +00:00
parent 9b4c9080e0
commit 85a1130f9f
2 changed files with 41 additions and 47 deletions

View File

@ -170,6 +170,9 @@ void Performance::GetEntriesByName(
return;
}
// ::Measure expects that results from this function are already
// passed through ReduceTimePrecision. mResourceEntries and mUserEntries
// are, so the invariant holds.
for (PerformanceEntry* entry : mResourceEntries) {
if (entry->GetName().Equals(aName) &&
(!aEntryType.WasPassed() ||
@ -273,13 +276,9 @@ void Performance::Measure(const nsAString& aName,
DOMHighResTimeStamp startTime;
DOMHighResTimeStamp endTime;
DOMHighResTimeStamp startTimeUnfuzzed;
DOMHighResTimeStamp endTimeUnfuzzed;
if (aStartMark.WasPassed()) {
startTimeUnfuzzed = ResolveTimestampFromName(aStartMark.Value(), aRv);
startTime = nsRFPService::ReduceTimePrecisionAsMSecs(
startTimeUnfuzzed, GetRandomTimelineSeed());
startTime = ResolveTimestampFromName(aStartMark.Value(), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
@ -288,19 +287,15 @@ void Performance::Measure(const nsAString& aName,
// in relation to navigation start, this will be zero if a name is not
// passed.
startTime = 0;
startTimeUnfuzzed = 0;
}
if (aEndMark.WasPassed()) {
endTimeUnfuzzed = ResolveTimestampFromName(aEndMark.Value(), aRv);
endTime = nsRFPService::ReduceTimePrecisionAsMSecs(endTimeUnfuzzed,
GetRandomTimelineSeed());
endTime = ResolveTimestampFromName(aEndMark.Value(), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
} else {
endTime = Now();
endTimeUnfuzzed = Now();
}
RefPtr<PerformanceMeasure> performanceMeasure =
@ -310,9 +305,9 @@ void Performance::Measure(const nsAString& aName,
#ifdef MOZ_GECKO_PROFILER
if (profiler_can_accept_markers()) {
TimeStamp startTimeStamp =
CreationTimeStamp() + TimeDuration::FromMilliseconds(startTimeUnfuzzed);
CreationTimeStamp() + TimeDuration::FromMilliseconds(startTime);
TimeStamp endTimeStamp =
CreationTimeStamp() + TimeDuration::FromMilliseconds(endTimeUnfuzzed);
CreationTimeStamp() + TimeDuration::FromMilliseconds(endTime);
// Convert to Maybe values so that Optional types do not need to be used in
// the profiler.

View File

@ -188,20 +188,12 @@ bool PerformanceMainThread::IsPerformanceTimingAttribute(
DOMHighResTimeStamp PerformanceMainThread::GetPerformanceTimingFromString(
const nsAString& aProperty) {
// ::Measure expects the values returned from this function to be passed
// through ReduceTimePrecision already.
if (!IsPerformanceTimingAttribute(aProperty)) {
return 0;
}
if (aProperty.EqualsLiteral("navigationStart")) {
// DOMHighResTimeStamp is in relation to navigationStart, so this will be
// zero.
return GetDOMTiming()->GetNavigationStart();
}
if (aProperty.EqualsLiteral("unloadEventStart")) {
return GetDOMTiming()->GetUnloadEventStart();
}
if (aProperty.EqualsLiteral("unloadEventEnd")) {
return GetDOMTiming()->GetUnloadEventEnd();
}
// Values from Timing() are already reduced
if (aProperty.EqualsLiteral("redirectStart")) {
return Timing()->RedirectStart();
}
@ -235,31 +227,38 @@ DOMHighResTimeStamp PerformanceMainThread::GetPerformanceTimingFromString(
if (aProperty.EqualsLiteral("responseEnd")) {
return Timing()->ResponseEnd();
}
if (aProperty.EqualsLiteral("domLoading")) {
return GetDOMTiming()->GetDomLoading();
// Values from GetDOMTiming() are not.
DOMHighResTimeStamp retValue;
if (aProperty.EqualsLiteral("navigationStart")) {
// DOMHighResTimeStamp is in relation to navigationStart, so this will be
// zero.
retValue = GetDOMTiming()->GetNavigationStart();
} else if (aProperty.EqualsLiteral("unloadEventStart")) {
retValue = GetDOMTiming()->GetUnloadEventStart();
} else if (aProperty.EqualsLiteral("unloadEventEnd")) {
retValue = GetDOMTiming()->GetUnloadEventEnd();
} else if (aProperty.EqualsLiteral("domLoading")) {
retValue = GetDOMTiming()->GetDomLoading();
} else if (aProperty.EqualsLiteral("domInteractive")) {
retValue = GetDOMTiming()->GetDomInteractive();
} else if (aProperty.EqualsLiteral("domContentLoadedEventStart")) {
retValue = GetDOMTiming()->GetDomContentLoadedEventStart();
} else if (aProperty.EqualsLiteral("domContentLoadedEventEnd")) {
retValue = GetDOMTiming()->GetDomContentLoadedEventEnd();
} else if (aProperty.EqualsLiteral("domComplete")) {
retValue = GetDOMTiming()->GetDomComplete();
} else if (aProperty.EqualsLiteral("loadEventStart")) {
retValue = GetDOMTiming()->GetLoadEventStart();
} else if (aProperty.EqualsLiteral("loadEventEnd")) {
retValue = GetDOMTiming()->GetLoadEventEnd();
} else {
MOZ_CRASH(
"IsPerformanceTimingAttribute and GetPerformanceTimingFromString are "
"out "
"of sync");
}
if (aProperty.EqualsLiteral("domInteractive")) {
return GetDOMTiming()->GetDomInteractive();
}
if (aProperty.EqualsLiteral("domContentLoadedEventStart")) {
return GetDOMTiming()->GetDomContentLoadedEventStart();
}
if (aProperty.EqualsLiteral("domContentLoadedEventEnd")) {
return GetDOMTiming()->GetDomContentLoadedEventEnd();
}
if (aProperty.EqualsLiteral("domComplete")) {
return GetDOMTiming()->GetDomComplete();
}
if (aProperty.EqualsLiteral("loadEventStart")) {
return GetDOMTiming()->GetLoadEventStart();
}
if (aProperty.EqualsLiteral("loadEventEnd")) {
return GetDOMTiming()->GetLoadEventEnd();
}
MOZ_CRASH(
"IsPerformanceTimingAttribute and GetPerformanceTimingFromString are out "
"of sync");
return 0;
return nsRFPService::ReduceTimePrecisionAsMSecs(retValue,
GetRandomTimelineSeed());
}
void PerformanceMainThread::InsertUserEntry(PerformanceEntry* aEntry) {