diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp index adfbec9a6670..c43023dfde37 100644 --- a/layout/base/nsRefreshDriver.cpp +++ b/layout/base/nsRefreshDriver.cpp @@ -1255,15 +1255,41 @@ TimeStamp nsRefreshDriver::MostRecentRefresh() const { void nsRefreshDriver::AddRefreshObserver(nsARefreshObserver* aObserver, FlushType aFlushType) { + MOZ_RELEASE_ASSERT(mPresContext); ObserverArray& array = ArrayFor(aFlushType); - array.AppendElement(aObserver); + Maybe innerWindowID; +#ifdef MOZ_GECKO_PROFILER + innerWindowID = + profiler_get_inner_window_id_from_docshell(mPresContext->GetDocShell()); +#endif + array.AppendElement(ObserverData{aObserver, TimeStamp::Now(), innerWindowID, + profiler_capture_backtrace()}); EnsureTimerStarted(); } bool nsRefreshDriver::RemoveRefreshObserver(nsARefreshObserver* aObserver, FlushType aFlushType) { ObserverArray& array = ArrayFor(aFlushType); - return array.RemoveElement(aObserver); + auto index = array.IndexOf(aObserver); + if (index == ObserverArray::array_type::NoIndex) { + return false; + } + +#ifdef MOZ_GECKO_PROFILER + if (profiler_can_accept_markers()) { + auto& data = array.ElementAt(index); + PROFILER_MARKER_TEXT( + "RefreshObserver", + GRAPHICS.WithOptions( + MarkerStack::TakeBacktrace(std::move(data.mCause)), + MarkerTiming::IntervalUntilNowFrom(data.mRegisterTime), + MarkerInnerWindowId(data.mInnerWindowId)), + nsCString(kFlushTypeNames[aFlushType])); + } +#endif + + array.RemoveElementAt(index); + return true; } void nsRefreshDriver::AddTimerAdjustmentObserver( diff --git a/layout/base/nsRefreshDriver.h b/layout/base/nsRefreshDriver.h index 4ee743d7b534..8f1de929c745 100644 --- a/layout/base/nsRefreshDriver.h +++ b/layout/base/nsRefreshDriver.h @@ -418,7 +418,6 @@ class nsRefreshDriver final : public mozilla::layers::TransactionIdAllocator, }; private: - typedef nsTObserverArray ObserverArray; typedef nsTArray> VisualViewportResizeEventArray; typedef nsTArray> ScrollEventArray; typedef nsTArray> VisualViewportScrollEventArray; @@ -431,6 +430,18 @@ class nsRefreshDriver final : public mozilla::layers::TransactionIdAllocator, }; typedef nsClassHashtable ImageStartTable; + struct ObserverData { + nsARefreshObserver* mObserver; + mozilla::TimeStamp mRegisterTime; + mozilla::Maybe mInnerWindowId; + mozilla::UniquePtr mCause; + + bool operator==(nsARefreshObserver* aObserver) const { + return mObserver == aObserver; + } + operator RefPtr() { return mObserver; } + }; + typedef nsTObserverArray ObserverArray; void RunFullscreenSteps(); void DispatchAnimationEvents(); MOZ_CAN_RUN_SCRIPT