| Index: third_party/WebKit/Source/core/timing/PerformanceBase.cpp
|
| diff --git a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
|
| index 2ebfe14288d3c697beb95b292b619a925edd2f0c..512e6ebd6432ab2f21863f4b9c0c1e70544b9006 100644
|
| --- a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
|
| +++ b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
|
| @@ -35,6 +35,7 @@
|
| #include "core/events/Event.h"
|
| #include "core/frame/UseCounter.h"
|
| #include "core/timing/PerformanceCompositeTiming.h"
|
| +#include "core/timing/PerformanceLongTaskTiming.h"
|
| #include "core/timing/PerformanceObserver.h"
|
| #include "core/timing/PerformanceRenderTiming.h"
|
| #include "core/timing/PerformanceResourceTiming.h"
|
| @@ -50,12 +51,14 @@ using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>;
|
|
|
| static const size_t defaultResourceTimingBufferSize = 150;
|
| static const size_t defaultFrameTimingBufferSize = 150;
|
| +static const size_t defaultLongTaskTimingBufferSize = 150;
|
|
|
| PerformanceBase::PerformanceBase(double timeOrigin)
|
| : m_frameTimingBufferSize(defaultFrameTimingBufferSize)
|
| , m_resourceTimingBufferSize(defaultResourceTimingBufferSize)
|
| - , m_timeOrigin(timeOrigin)
|
| + , m_longTaskTimingBufferSize(defaultLongTaskTimingBufferSize)
|
| , m_userTiming(nullptr)
|
| + , m_timeOrigin(timeOrigin)
|
| , m_observerFilterOptions(PerformanceEntry::Invalid)
|
| , m_deliverObservationsTimer(this, &PerformanceBase::deliverObservationsTimerFired)
|
| {
|
| @@ -81,6 +84,7 @@ PerformanceEntryVector PerformanceBase::getEntries() const
|
|
|
| entries.appendVector(m_resourceTimingBuffer);
|
| entries.appendVector(m_frameTimingBuffer);
|
| + entries.appendVector(m_longTaskTimingBuffer);
|
|
|
| if (m_userTiming) {
|
| entries.appendVector(m_userTiming->getMarks());
|
| @@ -119,6 +123,10 @@ PerformanceEntryVector PerformanceBase::getEntriesByType(const String& entryType
|
| if (m_userTiming)
|
| entries.appendVector(m_userTiming->getMeasures());
|
| break;
|
| + case PerformanceEntry::LongTask:
|
| + for (const auto& longTask : m_longTaskTimingBuffer)
|
| + entries.append(longTask);
|
| + break;
|
| }
|
|
|
| std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompareLessThan);
|
| @@ -186,6 +194,18 @@ void PerformanceBase::setFrameTimingBufferSize(unsigned size)
|
| dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull));
|
| }
|
|
|
| +void PerformanceBase::clearLongTaskTimings()
|
| +{
|
| + m_longTaskTimingBuffer.clear();
|
| +}
|
| +
|
| +void PerformanceBase::setLongTaskTimingBufferSize(unsigned size)
|
| +{
|
| + m_longTaskTimingBufferSize = size;
|
| + if (isLongTaskTimingBufferFull())
|
| + dispatchEvent(Event::create(EventTypeNames::longtasktimingbufferfull));
|
| +}
|
| +
|
| static bool passesTimingAllowCheck(const ResourceResponse& response, const SecurityOrigin& initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigin, ExecutionContext* context)
|
| {
|
| RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url());
|
| @@ -322,6 +342,30 @@ bool PerformanceBase::isFrameTimingBufferFull()
|
| return m_frameTimingBuffer.size() >= m_frameTimingBufferSize;
|
| }
|
|
|
| +void PerformanceBase::addLongTaskTiming(double startTime, double endTime, const String& frameContextUrl)
|
| +{
|
| + if (isLongTaskTimingBufferFull() || !hasObserverFor(PerformanceEntry::LongTask))
|
| + return;
|
| + PerformanceEntry* entry = PerformanceLongTaskTiming::create(
|
| + monotonicTimeToDOMHighResTimeStampInMillis(startTime),
|
| + monotonicTimeToDOMHighResTimeStampInMillis(endTime),
|
| + frameContextUrl);
|
| + notifyObserversOfEntry(*entry);
|
| + addLongTaskTimingBuffer(*entry);
|
| +}
|
| +
|
| +void PerformanceBase::addLongTaskTimingBuffer(PerformanceEntry& entry)
|
| +{
|
| + m_longTaskTimingBuffer.append(&entry);
|
| + if (isLongTaskTimingBufferFull())
|
| + dispatchEvent(Event::create(EventTypeNames::longtasktimingbufferfull));
|
| +}
|
| +
|
| +bool PerformanceBase::isLongTaskTimingBufferFull()
|
| +{
|
| + return m_longTaskTimingBuffer.size() >= m_longTaskTimingBufferSize;
|
| +}
|
| +
|
| void PerformanceBase::mark(const String& markName, ExceptionState& exceptionState)
|
| {
|
| if (!m_userTiming)
|
| @@ -445,6 +489,12 @@ DOMHighResTimeStamp PerformanceBase::monotonicTimeToDOMHighResTimeStamp(double m
|
| return convertSecondsToDOMHighResTimeStamp(clampTimeResolution(timeInSeconds));
|
| }
|
|
|
| +double PerformanceBase::monotonicTimeToDOMHighResTimeStampInMillis(
|
| + DOMHighResTimeStamp monotonicTime) const
|
| +{
|
| + return monotonicTimeToDOMHighResTimeStamp(monotonicTime) * 1000;
|
| +}
|
| +
|
| DOMHighResTimeStamp PerformanceBase::now() const
|
| {
|
| return monotonicTimeToDOMHighResTimeStamp(monotonicallyIncreasingTime());
|
| @@ -454,6 +504,7 @@ DEFINE_TRACE(PerformanceBase)
|
| {
|
| visitor->trace(m_frameTimingBuffer);
|
| visitor->trace(m_resourceTimingBuffer);
|
| + visitor->trace(m_longTaskTimingBuffer);
|
| visitor->trace(m_userTiming);
|
| visitor->trace(m_observers);
|
| visitor->trace(m_activeObservers);
|
|
|