From 6dedde38214a277101a91e703131a7a846bc4cf5 Mon Sep 17 00:00:00 2001 From: Justin Link Date: Fri, 23 May 2025 16:00:59 +0000 Subject: [PATCH] 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 --- dom/performance/Performance.cpp | 46 +++++++++++++++++++++++---------- dom/performance/Performance.h | 5 ++-- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/dom/performance/Performance.cpp b/dom/performance/Performance.cpp index 3bfda1dc6354..93792830a23a 100644 --- a/dom/performance/Performance.cpp +++ b/dom/performance/Performance.cpp @@ -590,22 +590,38 @@ static std::string GetMarkerFilename() { return s.str(); } -std::pair Performance::GetTimeStampsForMarker( +Maybe> Performance::GetTimeStampsForMarker( const Maybe& aStartMark, const Optional& aEndMark, - const Maybe& aOptions, ErrorResult& aRv) { + const Maybe& 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> 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& options, const Maybe& aStartMark, const Optional& aEndMark) { - ErrorResult rv; - auto [startTimeStamp, endTimeStamp] = - GetTimeStampsForMarker(aStartMark, aEndMark, options, rv); + Maybe> tsPair = + GetTimeStampsForMarker(aStartMark, aEndMark, options); + if (tsPair.isNothing()) { + return; + } + auto [startTimeStamp, endTimeStamp] = tsPair.value(); Maybe endMark; if (aEndMark.WasPassed()) { diff --git a/dom/performance/Performance.h b/dom/performance/Performance.h index 8213fa8efad6..1e417dc2ae81 100644 --- a/dom/performance/Performance.h +++ b/dom/performance/Performance.h @@ -263,11 +263,10 @@ class Performance : public DOMEventTargetHelper { const Maybe& aOptions, ErrorResult& aRv, bool aReturnUnclamped); - std::pair GetTimeStampsForMarker( + Maybe> GetTimeStampsForMarker( const Maybe& aStartMark, const Optional& aEndMark, - const Maybe& aOptions, - ErrorResult& aRv); + const Maybe& aOptions); }; } // namespace dom