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 88094fa06e3bbc734cc74a5cfebffa8c64b236f7..e26004c586070c1d1b072b007dc95f0aee8674e2 100644 |
--- a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp |
+++ b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp |
@@ -32,12 +32,18 @@ |
#include "core/timing/PerformanceBase.h" |
#include "core/dom/Document.h" |
+#include "core/dom/DocumentTiming.h" |
Yoav Weiss
2016/11/12 17:13:47
Is there anything in the style guide on such cases
panicker
2016/11/14 17:38:52
I think it's entirely reasonable to include header
sunjian
2016/11/14 22:12:28
Acknowledged.
|
#include "core/events/Event.h" |
+#include "core/frame/LocalFrame.h" |
#include "core/frame/UseCounter.h" |
+#include "core/loader/DocumentLoadTiming.h" |
Yoav Weiss
2016/11/13 13:48:02
Same for LocalFrame.h and DocumentLoadTiming.h.
Th
sunjian
2016/11/14 22:12:28
I actually agree more with Shubhie on this.
|
+#include "core/loader/DocumentLoader.h" |
#include "core/timing/PerformanceLongTaskTiming.h" |
+#include "core/timing/PerformanceNavigationTiming.h" |
#include "core/timing/PerformanceObserver.h" |
#include "core/timing/PerformanceResourceTiming.h" |
#include "core/timing/PerformanceUserTiming.h" |
+#include "platform/RuntimeEnabledFeatures.h" |
#include "platform/network/ResourceTimingInfo.h" |
#include "platform/weborigin/SecurityOrigin.h" |
#include "wtf/CurrentTime.h" |
@@ -74,6 +80,8 @@ PerformanceEntryVector PerformanceBase::getEntries() const { |
PerformanceEntryVector entries; |
entries.appendVector(m_resourceTimingBuffer); |
+ if (m_navigationTiming) |
+ entries.append(m_navigationTiming); |
entries.appendVector(m_frameTimingBuffer); |
if (m_userTiming) { |
@@ -103,6 +111,10 @@ PerformanceEntryVector PerformanceBase::getEntriesByType( |
for (const auto& resource : m_resourceTimingBuffer) |
entries.append(resource); |
break; |
+ case PerformanceEntry::Navigation: |
+ if (m_navigationTiming) |
+ entries.append(m_navigationTiming); |
+ break; |
case PerformanceEntry::Composite: |
case PerformanceEntry::Render: |
for (const auto& frame : m_frameTimingBuffer) { |
@@ -143,6 +155,11 @@ PerformanceEntryVector PerformanceBase::getEntriesByName( |
} |
} |
+ if (entryType.isNull() || type == PerformanceEntry::Navigation) { |
+ if (m_navigationTiming && m_navigationTiming->name() == name) |
+ entries.append(m_navigationTiming); |
+ } |
+ |
if (entryType.isNull() || type == PerformanceEntry::Composite || |
type == PerformanceEntry::Render) { |
for (const auto& frame : m_frameTimingBuffer) { |
@@ -292,6 +309,43 @@ void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) { |
addResourceTimingBuffer(*entry); |
} |
+void PerformanceBase::addNavigationTiming(LocalFrame* frame) { |
+ if (!RuntimeEnabledFeatures::performanceNavigationTiming2Enabled()) |
+ return; |
Yoav Weiss
2016/11/13 13:48:02
Can we add a `DCHECK(frame)` here?
sunjian
2016/11/14 22:12:28
Done.
|
+ const DocumentLoader* documentLoader = frame->loader().documentLoader(); |
+ DCHECK(documentLoader); |
+ const DocumentLoadTiming documentLoadTiming = documentLoader->timing(); |
Yoav Weiss
2016/11/12 17:13:47
const DocumentLoadTiming&
sunjian
2016/11/14 22:12:28
Done.
|
+ const DocumentTiming documentTiming = frame->document()->timing(); |
Yoav Weiss
2016/11/12 17:13:47
const DocumentTiming&
Yoav Weiss
2016/11/13 13:48:02
Are you sure frame->document() is not null?
If so
sunjian
2016/11/14 22:12:28
Done.
sunjian
2016/11/14 22:12:28
Done.
sunjian
2016/11/14 22:12:28
Done.
|
+ |
+ const ResourceResponse& finalResponse = documentLoader->response(); |
+ |
+ ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming(); |
+ double lastRedirectEndTime = documentLoadTiming.redirectEnd(); |
+ double finishTime = documentLoadTiming.loadEventEnd(); |
+ |
+ // TODO(sunjian) Implement transfer size. crbug/663187 |
+ unsigned long long transferSize = 0; |
+ unsigned long long encodedBodyLength = finalResponse.encodedBodyLength(); |
+ unsigned long long decodedBodyLength = finalResponse.decodedBodyLength(); |
+ bool didReuseConnection = finalResponse.connectionReused(); |
+ |
+ m_navigationTiming = new PerformanceNavigationTiming( |
+ timeOrigin(), documentLoadTiming.unloadEventStart(), |
+ documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(), |
+ documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(), |
+ documentTiming.domInteractive(), |
+ documentTiming.domContentLoadedEventStart(), |
+ documentTiming.domContentLoadedEventEnd(), documentTiming.domComplete(), |
+ documentLoader->getNavigationType(), documentLoadTiming.redirectStart(), |
+ documentLoadTiming.redirectEnd(), documentLoadTiming.fetchStart(), |
+ documentLoadTiming.responseEnd(), |
+ documentLoadTiming.hasCrossOriginRedirect(), |
+ documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming, |
+ lastRedirectEndTime, finishTime, transferSize, encodedBodyLength, |
+ decodedBodyLength, didReuseConnection); |
+ notifyObserversOfEntry(*m_navigationTiming); |
+} |
+ |
void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) { |
m_resourceTimingBuffer.append(&entry); |
@@ -464,6 +518,7 @@ DOMHighResTimeStamp PerformanceBase::now() const { |
DEFINE_TRACE(PerformanceBase) { |
visitor->trace(m_frameTimingBuffer); |
visitor->trace(m_resourceTimingBuffer); |
+ visitor->trace(m_navigationTiming); |
visitor->trace(m_userTiming); |
visitor->trace(m_observers); |
visitor->trace(m_activeObservers); |