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 04e8fc0b0b398e32535bdb89324120857e360e88..c1f2434bb9e86a63d274715ace8a2394a4482a28 100644 |
--- a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp |
+++ b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp |
@@ -51,16 +51,6 @@ |
namespace blink { |
-namespace { |
- |
-SecurityOrigin* getSecurityOrigin(ExecutionContext* context) { |
- if (context) |
- return context->getSecurityOrigin(); |
- return nullptr; |
-} |
- |
-} // namespace |
- |
using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>; |
static const size_t defaultResourceTimingBufferSize = 150; |
@@ -80,40 +70,28 @@ PerformanceBase::PerformanceBase(double timeOrigin, |
PerformanceBase::~PerformanceBase() {} |
-PerformanceNavigationTiming::NavigationType PerformanceBase::getNavigationType( |
- NavigationType type, |
panicker
2017/02/03 23:53:52
could you move this to a separate CL?
sunjian
2017/02/10 18:32:46
It's actually easier to keep this change. getNavig
|
- 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; |
} |
+SecurityOrigin* PerformanceBase::getSecurityOrigin(ExecutionContext* context) { |
+ if (context) |
+ return context->getSecurityOrigin(); |
+ return nullptr; |
+} |
+ |
PerformanceTiming* PerformanceBase::timing() const { |
return nullptr; |
} |
-PerformanceEntryVector PerformanceBase::getEntries() const { |
+PerformanceEntryVector PerformanceBase::getEntries() { |
PerformanceEntryVector entries; |
entries.appendVector(m_resourceTimingBuffer); |
+ if (!m_navigationTiming) |
+ m_navigationTiming = getNavigationTimingInstance(); |
+ // This extra checking is needed when WorkerPerformance |
+ // calls this method. |
if (m_navigationTiming) |
entries.push_back(m_navigationTiming); |
entries.appendVector(m_frameTimingBuffer); |
@@ -140,6 +118,8 @@ PerformanceEntryVector PerformanceBase::getEntriesByType( |
entries.push_back(resource); |
break; |
case PerformanceEntry::Navigation: |
+ if (!m_navigationTiming) |
+ m_navigationTiming = getNavigationTimingInstance(); |
if (m_navigationTiming) |
entries.push_back(m_navigationTiming); |
break; |
@@ -195,6 +175,8 @@ PerformanceEntryVector PerformanceBase::getEntriesByName( |
} |
if (entryType.isNull() || type == PerformanceEntry::Navigation) { |
+ if (!m_navigationTiming) |
+ m_navigationTiming = getNavigationTimingInstance(); |
if (m_navigationTiming && m_navigationTiming->name() == name) |
entries.push_back(m_navigationTiming); |
} |
@@ -344,65 +326,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(), 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::notifyNavigationTimingToObserver() { |
panicker
2017/02/03 23:53:52
s/ToObserver/ToObservers/
sunjian
2017/02/10 18:32:46
Done.
|
+ if (!m_navigationTiming) |
+ m_navigationTiming = getNavigationTimingInstance(); |
+ if (m_navigationTiming) |
+ notifyObserversOfEntry(*m_navigationTiming); |
} |
void PerformanceBase::addFirstPaintTiming(double startTime) { |