diff options
Diffstat (limited to 'layout/base/nsRefreshDriver.cpp')
-rw-r--r-- | layout/base/nsRefreshDriver.cpp | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp index a5c2b1ded9..218d158a47 100644 --- a/layout/base/nsRefreshDriver.cpp +++ b/layout/base/nsRefreshDriver.cpp @@ -831,11 +831,11 @@ class VsyncRefreshDriverTimer : public RefreshDriverTimer { const TimeDuration previousRate = mVsyncRate; const TimeDuration rate = GetTimerRate(); - hal::PerformanceHintSession* const performanceHintSession = - GetPerformanceHintSession(); - if (performanceHintSession && rate != previousRate) { - performanceHintSession->UpdateTargetWorkDuration( - ContentChild::GetPerformanceHintTarget(rate)); + if (rate != previousRate) { + if (auto* const performanceHintSession = GetPerformanceHintSession()) { + performanceHintSession->UpdateTargetWorkDuration( + ContentChild::GetPerformanceHintTarget(rate)); + } } if (TimeDuration::FromMilliseconds(nsRefreshDriver::DefaultInterval()) > @@ -862,7 +862,7 @@ class VsyncRefreshDriverTimer : public RefreshDriverTimer { TimeStamp tickEnd = TimeStamp::Now(); - if (performanceHintSession) { + if (auto* const performanceHintSession = GetPerformanceHintSession()) { performanceHintSession->ReportActualWorkDuration(tickEnd - tickStart); } @@ -1528,6 +1528,16 @@ void nsRefreshDriver::PostScrollEvent(mozilla::Runnable* aScrollEvent, } } +void nsRefreshDriver::PostScrollEndEvent(mozilla::Runnable* aScrollEndEvent, + bool aDelayed) { + if (aDelayed) { + mDelayedScrollEndEvents.AppendElement(aScrollEndEvent); + } else { + mScrollEndEvents.AppendElement(aScrollEndEvent); + EnsureTimerStarted(); + } +} + void nsRefreshDriver::DispatchScrollEvents() { // Scroll events are one-shot, so after running them we can drop them. // However, dispatching a scroll event can potentially cause more scroll @@ -1539,6 +1549,13 @@ void nsRefreshDriver::DispatchScrollEvents() { } } +void nsRefreshDriver::DispatchScrollEndEvents() { + ScrollEventArray events = std::move(mScrollEndEvents); + for (auto& event : events) { + event->Run(); + } +} + void nsRefreshDriver::PostVisualViewportScrollEvent( VVPScrollEvent* aScrollEvent) { mVisualViewportScrollEvents.AppendElement(aScrollEvent); @@ -1673,6 +1690,9 @@ void nsRefreshDriver::RunDelayedEventsSoon() { mScrollEvents.AppendElements(mDelayedScrollEvents); mDelayedScrollEvents.Clear(); + mScrollEndEvents.AppendElements(mDelayedScrollEvents); + mDelayedScrollEndEvents.Clear(); + mResizeEventFlushObservers.AppendElements(mDelayedResizeEventFlushObservers); mDelayedResizeEventFlushObservers.Clear(); @@ -2008,7 +2028,7 @@ auto nsRefreshDriver::GetReasonsToTick() const -> TickReasons { if (!mVisualViewportResizeEvents.IsEmpty()) { reasons |= TickReasons::eHasVisualViewportResizeEvents; } - if (!mScrollEvents.IsEmpty()) { + if (!mScrollEvents.IsEmpty() || !mScrollEndEvents.IsEmpty()) { reasons |= TickReasons::eHasScrollEvents; } if (!mVisualViewportScrollEvents.IsEmpty()) { @@ -2208,23 +2228,7 @@ void nsRefreshDriver::RunFullscreenSteps() { void nsRefreshDriver::UpdateIntersectionObservations(TimeStamp aNowTime) { AUTO_PROFILER_LABEL_RELEVANT_FOR_JS("Compute intersections", LAYOUT); - - AutoTArray<RefPtr<Document>, 32> documents; - - if (mPresContext->Document()->HasIntersectionObservers()) { - documents.AppendElement(mPresContext->Document()); - } - - mPresContext->Document()->CollectDescendantDocuments( - documents, [](const Document* document) -> bool { - return document->HasIntersectionObservers(); - }); - - for (const auto& doc : documents) { - doc->UpdateIntersectionObservations(aNowTime); - doc->ScheduleIntersectionObserverNotification(); - } - + mPresContext->Document()->UpdateIntersections(aNowTime); mNeedToUpdateIntersectionObservations = false; } @@ -2476,6 +2480,7 @@ bool nsRefreshDriver::TickObserverArray(uint32_t aIdx, TimeStamp aNowTime) { FlushAutoFocusDocuments(); DispatchScrollEvents(); DispatchVisualViewportScrollEvents(); + DispatchScrollEndEvents(); EvaluateMediaQueriesAndReportChanges(); DispatchAnimationEvents(); RunFullscreenSteps(); |