| 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 2834a27e3d8081f3278d9fd35f91de21ea63489d..7d5d08827914d5250028c845f85f189fcfe56467 100644
|
| --- a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
|
| +++ b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
|
| @@ -110,10 +110,14 @@ PerformanceTiming* PerformanceBase::timing() const {
|
| return nullptr;
|
| }
|
|
|
| -PerformanceEntryVector PerformanceBase::getEntries() const {
|
| +PerformanceEntryVector PerformanceBase::getEntries() {
|
| PerformanceEntryVector entries;
|
|
|
| entries.appendVector(m_resourceTimingBuffer);
|
| + if (!m_navigationTiming)
|
| + m_navigationTiming = createNavigationTimingInstance();
|
| + // This extra checking is needed when WorkerPerformance
|
| + // calls this method.
|
| if (m_navigationTiming)
|
| entries.push_back(m_navigationTiming);
|
| entries.appendVector(m_frameTimingBuffer);
|
| @@ -140,6 +144,8 @@ PerformanceEntryVector PerformanceBase::getEntriesByType(
|
| entries.push_back(resource);
|
| break;
|
| case PerformanceEntry::Navigation:
|
| + if (!m_navigationTiming)
|
| + m_navigationTiming = createNavigationTimingInstance();
|
| if (m_navigationTiming)
|
| entries.push_back(m_navigationTiming);
|
| break;
|
| @@ -195,6 +201,8 @@ PerformanceEntryVector PerformanceBase::getEntriesByName(
|
| }
|
|
|
| if (entryType.isNull() || type == PerformanceEntry::Navigation) {
|
| + if (!m_navigationTiming)
|
| + m_navigationTiming = createNavigationTimingInstance();
|
| if (m_navigationTiming && m_navigationTiming->name() == name)
|
| entries.push_back(m_navigationTiming);
|
| }
|
| @@ -344,66 +352,12 @@ void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) {
|
| addResourceTimingBuffer(*entry);
|
| }
|
|
|
| -void PerformanceBase::addNavigationTiming(LocalFrame* frame) {
|
| - if (!RuntimeEnabledFeatures::performanceNavigationTiming2Enabled())
|
| - return;
|
| - DCHECK(frame);
|
| - const DocumentLoader* documentLoader = frame->loader().documentLoader();
|
| - DCHECK(documentLoader);
|
| -
|
| - const DocumentLoadTiming& documentLoadTiming = documentLoader->timing();
|
| -
|
| - const DocumentTiming* documentTiming =
|
| - frame->document() ? &(frame->document()->timing()) : nullptr;
|
| -
|
| - ResourceTimingInfo* navigationTimingInfo =
|
| - documentLoader->getNavigationTimingInfo();
|
| - if (!navigationTimingInfo)
|
| - return;
|
| -
|
| - const ResourceResponse& finalResponse = navigationTimingInfo->finalResponse();
|
| -
|
| - ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming();
|
| - // Don't create a navigation timing instance when
|
| - // resourceLoadTiming is null, which could happen when visiting non-http sites
|
| - // such as about:blank or in some error cases.
|
| - if (!resourceLoadTiming)
|
| - return;
|
| - double lastRedirectEndTime = documentLoadTiming.redirectEnd();
|
| - double finishTime = documentLoadTiming.loadEventEnd();
|
| -
|
| - ExecutionContext* context = getExecutionContext();
|
| - SecurityOrigin* securityOrigin = getSecurityOrigin(context);
|
| - if (!securityOrigin)
|
| - return;
|
| -
|
| - bool allowRedirectDetails =
|
| - allowsTimingRedirect(navigationTimingInfo->redirectChain(), finalResponse,
|
| - *securityOrigin, context);
|
| -
|
| - unsigned long long transferSize = navigationTimingInfo->transferSize();
|
| - unsigned long long encodedBodyLength = finalResponse.encodedBodyLength();
|
| - unsigned long long decodedBodyLength = finalResponse.decodedBodyLength();
|
| - bool didReuseConnection = finalResponse.connectionReused();
|
| - PerformanceNavigationTiming::NavigationType type =
|
| - getNavigationType(documentLoader->getNavigationType(), frame->document());
|
| -
|
| - m_navigationTiming = new PerformanceNavigationTiming(
|
| - timeOrigin(), navigationTimingInfo->initialURL().getString(),
|
| - documentLoadTiming.unloadEventStart(),
|
| - documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(),
|
| - documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(),
|
| - documentTiming ? documentTiming->domInteractive() : 0,
|
| - documentTiming ? documentTiming->domContentLoadedEventStart() : 0,
|
| - documentTiming ? documentTiming->domContentLoadedEventEnd() : 0,
|
| - documentTiming ? documentTiming->domComplete() : 0, type,
|
| - documentLoadTiming.redirectStart(), documentLoadTiming.redirectEnd(),
|
| - documentLoadTiming.fetchStart(), documentLoadTiming.responseEnd(),
|
| - allowRedirectDetails,
|
| - documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming,
|
| - lastRedirectEndTime, finishTime, transferSize, encodedBodyLength,
|
| - decodedBodyLength, didReuseConnection);
|
| - notifyObserversOfEntry(*m_navigationTiming);
|
| +// Called after loadEventEnd happens.
|
| +void PerformanceBase::notifyNavigationTimingToObservers() {
|
| + if (!m_navigationTiming)
|
| + m_navigationTiming = createNavigationTimingInstance();
|
| + if (m_navigationTiming)
|
| + notifyObserversOfEntry(*m_navigationTiming);
|
| }
|
|
|
| void PerformanceBase::addFirstPaintTiming(double startTime) {
|
|
|