Bug 1925191: Don't create profiler markers for performance.measure() calls with timestamps that are too far in the future r=mstange
Differential Revision: https://phabricator.services.mozilla.com/D233309
This commit is contained in:
committed by
jlink@mozilla.com
parent
58a96c6abf
commit
6dedde3821
@@ -590,22 +590,38 @@ static std::string GetMarkerFilename() {
|
||||
return s.str();
|
||||
}
|
||||
|
||||
std::pair<TimeStamp, TimeStamp> Performance::GetTimeStampsForMarker(
|
||||
Maybe<std::pair<TimeStamp, TimeStamp>> Performance::GetTimeStampsForMarker(
|
||||
const Maybe<const nsAString&>& aStartMark,
|
||||
const Optional<nsAString>& aEndMark,
|
||||
const Maybe<const PerformanceMeasureOptions&>& aOptions, ErrorResult& aRv) {
|
||||
const Maybe<const PerformanceMeasureOptions&>& aOptions) {
|
||||
ErrorResult err;
|
||||
const DOMHighResTimeStamp unclampedStartTime = ResolveStartTimeForMeasure(
|
||||
aStartMark, aOptions, aRv, /* aReturnUnclamped */ true);
|
||||
aStartMark, aOptions, err, /* aReturnUnclamped */ true);
|
||||
const DOMHighResTimeStamp unclampedEndTime =
|
||||
ResolveEndTimeForMeasure(aEndMark, aOptions, aRv, /* aReturnUnclamped */
|
||||
true);
|
||||
ResolveEndTimeForMeasure(aEndMark, aOptions, /* aReturnUnclamped */
|
||||
err, true);
|
||||
|
||||
if (err.Failed()) {
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
// Performance.measure() can receive user-supplied timestamps and those
|
||||
// timestamps might not be relative to 'navigation start'. This is
|
||||
// (potentially) valid but, if we treat them as relative, we will end up
|
||||
// placing them far into the future which causes problems for the profiler
|
||||
// later so we report that as an error. (See bug 1925191 for details.)
|
||||
// kMaxFuture_ms represents approximately 10 years worth of milliseconds.
|
||||
static constexpr double kMaxFuture_ms = 31536000000.0;
|
||||
if (unclampedStartTime > kMaxFuture_ms || unclampedEndTime > kMaxFuture_ms) {
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
TimeStamp startTimeStamp =
|
||||
CreationTimeStamp() + TimeDuration::FromMilliseconds(unclampedStartTime);
|
||||
TimeStamp endTimeStamp =
|
||||
CreationTimeStamp() + TimeDuration::FromMilliseconds(unclampedEndTime);
|
||||
|
||||
return std::make_pair(startTimeStamp, endTimeStamp);
|
||||
return Some(std::make_pair(startTimeStamp, endTimeStamp));
|
||||
}
|
||||
|
||||
// Try to open the marker file for writing performance markers.
|
||||
@@ -679,13 +695,12 @@ void Performance::MaybeEmitExternalProfilerMarker(
|
||||
}
|
||||
|
||||
#if defined(XP_LINUX) || defined(XP_WIN) || defined(XP_MACOSX)
|
||||
ErrorResult rv;
|
||||
auto [startTimeStamp, endTimeStamp] =
|
||||
GetTimeStampsForMarker(aStartMark, aEndMark, aOptions, rv);
|
||||
|
||||
if (NS_WARN_IF(rv.Failed())) {
|
||||
Maybe<std::pair<TimeStamp, TimeStamp>> tsPair =
|
||||
GetTimeStampsForMarker(aStartMark, aEndMark, aOptions);
|
||||
if (tsPair.isNothing()) {
|
||||
return;
|
||||
}
|
||||
auto [startTimeStamp, endTimeStamp] = tsPair.value();
|
||||
#endif
|
||||
|
||||
#ifdef XP_LINUX
|
||||
@@ -728,9 +743,12 @@ void MOZ_NEVER_INLINE Performance::AddProfileMarker(
|
||||
const Maybe<const PerformanceMeasureOptions&>& options,
|
||||
const Maybe<const nsAString&>& aStartMark,
|
||||
const Optional<nsAString>& aEndMark) {
|
||||
ErrorResult rv;
|
||||
auto [startTimeStamp, endTimeStamp] =
|
||||
GetTimeStampsForMarker(aStartMark, aEndMark, options, rv);
|
||||
Maybe<std::pair<TimeStamp, TimeStamp>> tsPair =
|
||||
GetTimeStampsForMarker(aStartMark, aEndMark, options);
|
||||
if (tsPair.isNothing()) {
|
||||
return;
|
||||
}
|
||||
auto [startTimeStamp, endTimeStamp] = tsPair.value();
|
||||
|
||||
Maybe<nsString> endMark;
|
||||
if (aEndMark.WasPassed()) {
|
||||
|
||||
@@ -263,11 +263,10 @@ class Performance : public DOMEventTargetHelper {
|
||||
const Maybe<const PerformanceMeasureOptions&>& aOptions, ErrorResult& aRv,
|
||||
bool aReturnUnclamped);
|
||||
|
||||
std::pair<TimeStamp, TimeStamp> GetTimeStampsForMarker(
|
||||
Maybe<std::pair<TimeStamp, TimeStamp>> GetTimeStampsForMarker(
|
||||
const Maybe<const nsAString&>& aStartMark,
|
||||
const Optional<nsAString>& aEndMark,
|
||||
const Maybe<const PerformanceMeasureOptions&>& aOptions,
|
||||
ErrorResult& aRv);
|
||||
const Maybe<const PerformanceMeasureOptions&>& aOptions);
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
|
||||
Reference in New Issue
Block a user