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:
Justin Link
2025-05-23 16:00:59 +00:00
committed by jlink@mozilla.com
parent 58a96c6abf
commit 6dedde3821
2 changed files with 34 additions and 17 deletions

View File

@@ -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()) {

View File

@@ -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