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 0a1c1fb4ec7e29a7f61c86efcc49b03829af328e..cad0d34fd9f2212d200373dcb76b740ca6954fd1 100644 |
--- a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp |
+++ b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp |
@@ -80,28 +80,6 @@ PerformanceBase::PerformanceBase(double timeOrigin, |
PerformanceBase::~PerformanceBase() {} |
-PerformanceNavigationTiming::NavigationType PerformanceBase::getNavigationType( |
- NavigationType type, |
- const Document* document) { |
- if (document && |
- document->pageVisibilityState() == PageVisibilityStatePrerender) { |
- return PerformanceNavigationTiming::NavigationType::Prerender; |
- } |
- switch (type) { |
- case NavigationTypeReload: |
- return PerformanceNavigationTiming::NavigationType::Reload; |
- case NavigationTypeBackForward: |
- return PerformanceNavigationTiming::NavigationType::BackForward; |
- case NavigationTypeLinkClicked: |
- case NavigationTypeFormSubmitted: |
- case NavigationTypeFormResubmitted: |
- case NavigationTypeOther: |
- return PerformanceNavigationTiming::NavigationType::Navigate; |
- } |
- NOTREACHED(); |
- return PerformanceNavigationTiming::NavigationType::Navigate; |
-} |
- |
const AtomicString& PerformanceBase::interfaceName() const { |
return EventTargetNames::Performance; |
} |
@@ -110,10 +88,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 +122,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 +179,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 +330,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) { |