Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: third_party/WebKit/Source/core/timing/PerformanceNavigationTiming.cpp

Issue 2647643004: Report nav timing 2 instance as soon as it's requested. (Closed)
Patch Set: addressed comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/timing/PerformanceNavigationTiming.h" 5 #include "core/timing/PerformanceNavigationTiming.h"
6 6
7 #include "bindings/core/v8/V8ObjectBuilder.h" 7 #include "bindings/core/v8/V8ObjectBuilder.h"
8 #include "core/dom/Document.h"
9 #include "core/dom/DocumentTiming.h"
10 #include "core/frame/LocalFrame.h"
11 #include "core/loader/DocumentLoadTiming.h"
12 #include "core/loader/DocumentLoader.h"
8 #include "core/timing/PerformanceBase.h" 13 #include "core/timing/PerformanceBase.h"
14 #include "platform/network/ResourceTimingInfo.h"
9 15
10 namespace blink { 16 namespace blink {
11 17
12 PerformanceNavigationTiming::PerformanceNavigationTiming( 18 PerformanceNavigationTiming::PerformanceNavigationTiming(
13 double timeOrigin, 19 LocalFrame* frame,
14 const String& requestedUrl, 20 ResourceTimingInfo* info,
15 double unloadEventStart, 21 double timeOrigin)
16 double unloadEventEnd, 22 : PerformanceResourceTiming(info ? info->initialURL().getString() : "",
17 double loadEventStart,
18 double loadEventEnd,
19 unsigned short redirectCount,
20 double domInteractive,
21 double domContentLoadedEventStart,
22 double domContentLoadedEventEnd,
23 double domComplete,
24 NavigationType type,
25 double redirectStart,
26 double redirectEnd,
27 double fetchStart,
28 double responseEnd,
29 bool allowRedirectDetails,
30 bool hasSameOriginAsPreviousDocument,
31 ResourceLoadTiming* timing,
32 double lastRedirectEndTime,
33 double finishTime,
34 unsigned long long transferSize,
35 unsigned long long encodedBodyLength,
36 unsigned long long decodedBodyLength,
37 bool didReuseConnection)
38 : PerformanceResourceTiming("navigation",
39 timeOrigin,
40 timing,
41 lastRedirectEndTime,
42 finishTime,
43 transferSize,
44 encodedBodyLength,
45 decodedBodyLength,
46 didReuseConnection,
47 true /*allowTimingDetails*/, // TODO(sunjian):
48 // Create an enum
49 // for this.
50 allowRedirectDetails,
51 requestedUrl,
52 "navigation", 23 "navigation",
53 timeOrigin), 24 0.0,
25 0.0),
54 m_timeOrigin(timeOrigin), 26 m_timeOrigin(timeOrigin),
55 m_unloadEventStart(unloadEventStart), 27 m_resourceTimingInfo(info),
56 m_unloadEventEnd(unloadEventEnd), 28 m_frame(frame) {}
57 m_loadEventStart(loadEventStart),
58 m_loadEventEnd(loadEventEnd),
59 m_redirectCount(redirectCount),
60 m_domInteractive(domInteractive),
61 m_domContentLoadedEventStart(domContentLoadedEventStart),
62 m_domContentLoadedEventEnd(domContentLoadedEventEnd),
63 m_domComplete(domComplete),
64 m_type(type),
65 m_redirectStart(redirectStart),
66 m_redirectEnd(redirectEnd),
67 m_fetchStart(fetchStart),
68 m_responseEnd(responseEnd),
69 m_allowRedirectDetails(allowRedirectDetails),
70 m_hasSameOriginAsPreviousDocument(hasSameOriginAsPreviousDocument) {}
71 29
72 PerformanceNavigationTiming::~PerformanceNavigationTiming() {} 30 PerformanceNavigationTiming::~PerformanceNavigationTiming() {}
73 31
32 DEFINE_TRACE(PerformanceNavigationTiming) {
33 visitor->trace(m_frame);
34 PerformanceEntry::trace(visitor);
35 }
36
37 DocumentLoadTiming* PerformanceNavigationTiming::documentLoadTiming() const {
38 DocumentLoader* loader = documentLoader();
39 if (!loader)
40 return nullptr;
41
42 return &loader->timing();
43 }
44
45 DocumentLoader* PerformanceNavigationTiming::documentLoader() const {
46 if (!m_frame)
47 return nullptr;
48
49 return m_frame->loader().documentLoader();
50 }
51
52 const DocumentTiming* PerformanceNavigationTiming::documentTiming() const {
53 if (!m_frame)
54 return nullptr;
55
56 Document* document = m_frame->document();
57 if (!document)
58 return nullptr;
59
60 return &document->timing();
61 }
62
63 ResourceLoadTiming* PerformanceNavigationTiming::resourceLoadTiming() const {
64 if (!m_resourceTimingInfo)
65 return nullptr;
66 return m_resourceTimingInfo->finalResponse().resourceLoadTiming();
67 }
68
69 bool PerformanceNavigationTiming::allowTimingDetails() const {
70 return true;
71 }
72
73 bool PerformanceNavigationTiming::didReuseConnection() const {
74 if (m_resourceTimingInfo)
75 return m_resourceTimingInfo->finalResponse().connectionReused();
76 return false;
77 }
78
79 unsigned long long PerformanceNavigationTiming::getTransferSize() const {
80 return !m_resourceTimingInfo ? 0 : m_resourceTimingInfo->transferSize();
81 }
82
83 unsigned long long PerformanceNavigationTiming::getEncodedBodySize() const {
84 return !m_resourceTimingInfo
85 ? 0
86 : m_resourceTimingInfo->finalResponse().encodedBodyLength();
87 }
88
89 unsigned long long PerformanceNavigationTiming::getDecodedBodySize() const {
90 return !m_resourceTimingInfo
91 ? 0
92 : m_resourceTimingInfo->finalResponse().decodedBodyLength();
93 }
94
95 AtomicString PerformanceNavigationTiming::getInitiatorType() const {
96 return "navigation";
97 }
98
99 ExecutionContext* PerformanceNavigationTiming::getExecutionContext() const {
Kunihiko Sakamoto 2017/02/16 08:42:29 This function is used only once. Inline?
sunjian 2017/02/16 22:30:49 Done.
100 return m_frame ? m_frame->document() : nullptr;
101 }
102
103 bool PerformanceNavigationTiming::getAllowRedirectDetails() const {
104 ExecutionContext* context = getExecutionContext();
105 SecurityOrigin* securityOrigin = nullptr;
106 if (context)
107 securityOrigin = context->getSecurityOrigin();
108 if (!securityOrigin)
109 return false;
110 if (!m_resourceTimingInfo)
111 return false;
112
113 return PerformanceBase::allowsTimingRedirect(
114 m_resourceTimingInfo->redirectChain(),
115 m_resourceTimingInfo->finalResponse(), *securityOrigin, context);
116 }
117
74 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventStart() const { 118 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventStart() const {
75 if (!m_allowRedirectDetails || !m_hasSameOriginAsPreviousDocument) 119 bool allowRedirectDetails = getAllowRedirectDetails();
76 return 0; 120 DocumentLoadTiming* timing = documentLoadTiming();
77 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 121
78 m_timeOrigin, m_unloadEventStart); 122 if (!allowRedirectDetails || !timing ||
123 !timing->hasSameOriginAsPreviousDocument())
124 return 0;
125 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
126 m_timeOrigin, timing->unloadEventStart());
79 } 127 }
80 128
81 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventEnd() const { 129 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventEnd() const {
82 if (!m_allowRedirectDetails || !m_hasSameOriginAsPreviousDocument) 130 bool allowRedirectDetails = getAllowRedirectDetails();
83 return 0; 131 DocumentLoadTiming* timing = documentLoadTiming();
84 132
85 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 133 if (!allowRedirectDetails || !timing ||
86 m_unloadEventEnd); 134 !timing->hasSameOriginAsPreviousDocument())
135 return 0;
136 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
137 m_timeOrigin, timing->unloadEventEnd());
87 } 138 }
88 139
89 DOMHighResTimeStamp PerformanceNavigationTiming::domInteractive() const { 140 DOMHighResTimeStamp PerformanceNavigationTiming::domInteractive() const {
90 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 141 const DocumentTiming* timing = documentTiming();
91 m_domInteractive); 142 if (!timing)
143 return 0.0;
144 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
145 m_timeOrigin, timing->domInteractive());
92 } 146 }
93 147
94 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventStart() 148 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventStart()
95 const { 149 const {
96 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 150 const DocumentTiming* timing = documentTiming();
97 m_timeOrigin, m_domContentLoadedEventStart); 151 if (!timing)
152 return 0.0;
153 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
154 m_timeOrigin, timing->domContentLoadedEventStart());
98 } 155 }
99 156
100 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd() 157 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd()
101 const { 158 const {
102 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 159 const DocumentTiming* timing = documentTiming();
103 m_timeOrigin, m_domContentLoadedEventEnd); 160 if (!timing)
161 return 0.0;
162 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
163 m_timeOrigin, timing->domContentLoadedEventEnd());
104 } 164 }
105 165
106 DOMHighResTimeStamp PerformanceNavigationTiming::domComplete() const { 166 DOMHighResTimeStamp PerformanceNavigationTiming::domComplete() const {
107 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 167 const DocumentTiming* timing = documentTiming();
108 m_domComplete); 168 if (!timing)
169 return 0.0;
170 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
171 m_timeOrigin, timing->domComplete());
109 } 172 }
110 173
111 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventStart() const { 174 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventStart() const {
112 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 175 DocumentLoadTiming* timing = documentLoadTiming();
113 m_loadEventStart); 176 if (!timing)
177 return 0.0;
178 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
179 m_timeOrigin, timing->loadEventStart());
114 } 180 }
115 181
116 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventEnd() const { 182 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventEnd() const {
117 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 183 DocumentLoadTiming* timing = documentLoadTiming();
118 m_loadEventEnd); 184 if (!timing)
119 } 185 return 0.0;
120 186 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
121 AtomicString PerformanceNavigationTiming::type() const { 187 m_timeOrigin, timing->loadEventEnd());
122 switch (m_type) { 188 }
123 case NavigationType::Reload: 189
190 AtomicString PerformanceNavigationTiming::getNavigationType(
191 NavigationType type,
192 const Document* document) {
193 if (document &&
194 document->pageVisibilityState() == PageVisibilityStatePrerender) {
195 return "prerender";
196 }
197 switch (type) {
198 case NavigationTypeReload:
124 return "reload"; 199 return "reload";
125 case NavigationType::BackForward: 200 case NavigationTypeBackForward:
126 return "back_forward"; 201 return "back_forward";
127 case NavigationType::Prerender: 202 case NavigationTypeLinkClicked:
128 return "prerender"; 203 case NavigationTypeFormSubmitted:
129 case NavigationType::Navigate: 204 case NavigationTypeFormResubmitted:
205 case NavigationTypeOther:
130 return "navigate"; 206 return "navigate";
131 } 207 }
132 NOTREACHED(); 208 NOTREACHED();
133 return "navigate"; 209 return "navigate";
134 } 210 }
135 211
212 AtomicString PerformanceNavigationTiming::type() const {
213 DocumentLoader* loader = documentLoader();
214 DCHECK(m_frame);
215 DCHECK(loader);
216 Document* document = m_frame->document();
217 return getNavigationType(loader->getNavigationType(), document);
218 }
219
136 unsigned short PerformanceNavigationTiming::redirectCount() const { 220 unsigned short PerformanceNavigationTiming::redirectCount() const {
137 if (!m_allowRedirectDetails) 221 bool allowRedirectDetails = getAllowRedirectDetails();
138 return 0; 222 DocumentLoadTiming* timing = documentLoadTiming();
139 return m_redirectCount; 223 if (!allowRedirectDetails || !timing)
224 return 0;
225 return timing->redirectCount();
226 }
227
228 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const {
229 bool allowRedirectDetails = getAllowRedirectDetails();
230 DocumentLoadTiming* timing = documentLoadTiming();
231 if (!allowRedirectDetails || !timing)
232 return 0;
233 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
234 m_timeOrigin, timing->redirectStart());
235 }
236
237 DOMHighResTimeStamp PerformanceNavigationTiming::redirectEnd() const {
238 bool allowRedirectDetails = getAllowRedirectDetails();
239 DocumentLoadTiming* timing = documentLoadTiming();
240 if (!allowRedirectDetails || !timing)
241 return 0;
242 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
243 m_timeOrigin, timing->redirectEnd());
140 } 244 }
141 245
142 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const { 246 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const {
143 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 247 DocumentLoadTiming* timing = documentLoadTiming();
144 m_fetchStart); 248 if (!timing)
145 } 249 return 0.0;
146 250 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
147 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const { 251 m_timeOrigin, timing->fetchStart());
148 if (!m_allowRedirectDetails)
149 return 0;
150 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin,
151 m_redirectStart);
152 }
153
154 DOMHighResTimeStamp PerformanceNavigationTiming::redirectEnd() const {
155 if (!m_allowRedirectDetails)
156 return 0;
157 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin,
158 m_redirectEnd);
159 } 252 }
160 253
161 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const { 254 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const {
162 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 255 DocumentLoadTiming* timing = documentLoadTiming();
163 m_responseEnd); 256 if (!timing)
257 return 0.0;
258 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
259 m_timeOrigin, timing->responseEnd());
260 }
261
262 // Overriding PerformanceEntry's attributes.
263 DOMHighResTimeStamp PerformanceNavigationTiming::duration() const {
264 return loadEventEnd();
164 } 265 }
165 266
166 void PerformanceNavigationTiming::buildJSONValue( 267 void PerformanceNavigationTiming::buildJSONValue(
167 V8ObjectBuilder& builder) const { 268 V8ObjectBuilder& builder) const {
168 PerformanceResourceTiming::buildJSONValue(builder); 269 PerformanceResourceTiming::buildJSONValue(builder);
169 builder.addNumber("unloadEventStart", unloadEventStart()); 270 builder.addNumber("unloadEventStart", unloadEventStart());
170 builder.addNumber("unloadEventEnd", unloadEventEnd()); 271 builder.addNumber("unloadEventEnd", unloadEventEnd());
171 builder.addNumber("domInteractive", domInteractive()); 272 builder.addNumber("domInteractive", domInteractive());
172 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart()); 273 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart());
173 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd()); 274 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd());
174 builder.addNumber("domComplete", domComplete()); 275 builder.addNumber("domComplete", domComplete());
175 builder.addNumber("loadEventStart", loadEventStart()); 276 builder.addNumber("loadEventStart", loadEventStart());
176 builder.addNumber("loadEventEnd", loadEventEnd()); 277 builder.addNumber("loadEventEnd", loadEventEnd());
177 builder.addString("type", type()); 278 builder.addString("type", type());
178 builder.addNumber("redirectCount", redirectCount()); 279 builder.addNumber("redirectCount", redirectCount());
179 } 280 }
180 } 281 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698