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

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: make a copy of navigationTimingInfo for ResourceFetcher 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 double unloadEventStart, 20 std::unique_ptr<ResourceTimingInfo> info,
15 double unloadEventEnd, 21 double timeOrigin)
16 double loadEventStart, 22 : PerformanceResourceTiming("document", "navigation", 0.0, 0.0),
17 double loadEventEnd,
18 unsigned short redirectCount,
19 double domInteractive,
20 double domContentLoadedEventStart,
21 double domContentLoadedEventEnd,
22 double domComplete,
23 NavigationType type,
24 double redirectStart,
25 double redirectEnd,
26 double fetchStart,
27 double responseEnd,
28 bool allowRedirectDetails,
29 bool hasSameOriginAsPreviousDocument,
30 ResourceLoadTiming* timing,
31 double lastRedirectEndTime,
32 double finishTime,
33 unsigned long long transferSize,
34 unsigned long long encodedBodyLength,
35 unsigned long long decodedBodyLength,
36 bool didReuseConnection)
37 : PerformanceResourceTiming("navigation",
38 timeOrigin,
39 timing,
40 lastRedirectEndTime,
41 finishTime,
42 transferSize,
43 encodedBodyLength,
44 decodedBodyLength,
45 didReuseConnection,
46 true /*allowTimingDetails*/, // TODO(sunjian):
47 // Create an enum
48 // for this.
49 allowRedirectDetails,
50 "document",
51 "navigation",
52 timeOrigin),
53 m_timeOrigin(timeOrigin), 23 m_timeOrigin(timeOrigin),
54 m_unloadEventStart(unloadEventStart), 24 m_resourceTimingInfo(std::move(info)),
55 m_unloadEventEnd(unloadEventEnd), 25 m_frame(frame) {}
56 m_loadEventStart(loadEventStart),
57 m_loadEventEnd(loadEventEnd),
58 m_redirectCount(redirectCount),
59 m_domInteractive(domInteractive),
60 m_domContentLoadedEventStart(domContentLoadedEventStart),
61 m_domContentLoadedEventEnd(domContentLoadedEventEnd),
62 m_domComplete(domComplete),
63 m_type(type),
64 m_redirectStart(redirectStart),
65 m_redirectEnd(redirectEnd),
66 m_fetchStart(fetchStart),
67 m_responseEnd(responseEnd),
68 m_allowRedirectDetails(allowRedirectDetails),
69 m_hasSameOriginAsPreviousDocument(hasSameOriginAsPreviousDocument) {}
70 26
71 PerformanceNavigationTiming::~PerformanceNavigationTiming() {} 27 PerformanceNavigationTiming::~PerformanceNavigationTiming() {}
72 28
29 DEFINE_TRACE(PerformanceNavigationTiming) {
30 visitor->trace(m_frame);
31 PerformanceEntry::trace(visitor);
32 }
33
34 DocumentLoadTiming* PerformanceNavigationTiming::documentLoadTiming() const {
35 DocumentLoader* loader = documentLoader();
36 if (!loader)
37 return nullptr;
38
39 return &loader->timing();
40 }
41
42 DocumentLoader* PerformanceNavigationTiming::documentLoader() const {
43 if (!m_frame)
44 return nullptr;
45
46 return m_frame->loader().documentLoader();
47 }
48
49 const DocumentTiming* PerformanceNavigationTiming::documentTiming() const {
50 if (!m_frame)
51 return nullptr;
52
53 Document* document = m_frame->document();
54 if (!document)
55 return nullptr;
56
57 return &document->timing();
58 }
59
60 ResourceLoadTiming* PerformanceNavigationTiming::resourceLoadTiming() const {
61 if (!m_resourceTimingInfo)
62 return nullptr;
63 return m_resourceTimingInfo->finalResponse().resourceLoadTiming();
64 }
65
66 ExecutionContext* PerformanceNavigationTiming::getExecutionContext() const {
67 return m_frame ? m_frame->document() : nullptr;
68 }
69
70 bool PerformanceNavigationTiming::getAllowRedirectDetails() const {
71 ExecutionContext* context = getExecutionContext();
72 SecurityOrigin* securityOrigin = PerformanceBase::getSecurityOrigin(context);
73 if (!securityOrigin)
74 return false;
75 if (!m_resourceTimingInfo)
76 return false;
77
78 return PerformanceBase::allowsTimingRedirect(
79 m_resourceTimingInfo->redirectChain(),
80 m_resourceTimingInfo->finalResponse(), *securityOrigin, context);
81 }
82
73 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventStart() const { 83 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventStart() const {
74 if (!m_allowRedirectDetails || !m_hasSameOriginAsPreviousDocument) 84 bool allowRedirectDetails = getAllowRedirectDetails();
75 return 0; 85 DocumentLoadTiming* timing = documentLoadTiming();
76 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 86
77 m_timeOrigin, m_unloadEventStart); 87 if (!allowRedirectDetails || !timing ||
88 !timing->hasSameOriginAsPreviousDocument())
89 return 0;
90 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
91 m_timeOrigin, timing->unloadEventStart());
78 } 92 }
79 93
80 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventEnd() const { 94 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventEnd() const {
81 if (!m_allowRedirectDetails || !m_hasSameOriginAsPreviousDocument) 95 bool allowRedirectDetails = getAllowRedirectDetails();
82 return 0; 96 DocumentLoadTiming* timing = documentLoadTiming();
83 97
84 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 98 if (!allowRedirectDetails || !timing ||
85 m_unloadEventEnd); 99 !timing->hasSameOriginAsPreviousDocument())
100 return 0;
101 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
102 m_timeOrigin, timing->unloadEventEnd());
86 } 103 }
87 104
88 DOMHighResTimeStamp PerformanceNavigationTiming::domInteractive() const { 105 DOMHighResTimeStamp PerformanceNavigationTiming::domInteractive() const {
89 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 106 const DocumentTiming* timing = documentTiming();
90 m_domInteractive); 107 if (!timing)
108 return 0.0;
109 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
110 m_timeOrigin, timing->domInteractive());
91 } 111 }
92 112
93 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventStart() 113 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventStart()
94 const { 114 const {
95 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 115 const DocumentTiming* timing = documentTiming();
96 m_timeOrigin, m_domContentLoadedEventStart); 116 if (!timing)
117 return 0.0;
118 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
119 m_timeOrigin, timing->domContentLoadedEventStart());
97 } 120 }
98 121
99 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd() 122 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd()
100 const { 123 const {
101 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 124 const DocumentTiming* timing = documentTiming();
102 m_timeOrigin, m_domContentLoadedEventEnd); 125 if (!timing)
126 return 0.0;
127 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
128 m_timeOrigin, timing->domContentLoadedEventEnd());
103 } 129 }
104 130
105 DOMHighResTimeStamp PerformanceNavigationTiming::domComplete() const { 131 DOMHighResTimeStamp PerformanceNavigationTiming::domComplete() const {
106 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 132 const DocumentTiming* timing = documentTiming();
107 m_domComplete); 133 if (!timing)
134 return 0.0;
135 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
136 m_timeOrigin, timing->domComplete());
108 } 137 }
109 138
110 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventStart() const { 139 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventStart() const {
111 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 140 DocumentLoadTiming* timing = documentLoadTiming();
112 m_loadEventStart); 141 if (!timing)
142 return 0.0;
143 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
144 m_timeOrigin, timing->loadEventStart());
113 } 145 }
114 146
115 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventEnd() const { 147 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventEnd() const {
116 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 148 DocumentLoadTiming* timing = documentLoadTiming();
117 m_loadEventEnd); 149 if (!timing)
118 } 150 return 0.0;
119 151 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
120 AtomicString PerformanceNavigationTiming::type() const { 152 m_timeOrigin, timing->loadEventEnd());
121 switch (m_type) { 153 }
122 case NavigationType::Reload: 154
155 AtomicString PerformanceNavigationTiming::getNavigationType(
156 NavigationType type,
157 const Document* document) {
158 if (document &&
159 document->pageVisibilityState() == PageVisibilityStatePrerender) {
160 return "prerender";
161 }
162 switch (type) {
163 case NavigationTypeReload:
123 return "reload"; 164 return "reload";
124 case NavigationType::BackForward: 165 case NavigationTypeBackForward:
125 return "back_forward"; 166 return "back_forward";
126 case NavigationType::Prerender: 167 case NavigationTypeLinkClicked:
127 return "prerender"; 168 case NavigationTypeFormSubmitted:
128 case NavigationType::Navigate: 169 case NavigationTypeFormResubmitted:
170 case NavigationTypeOther:
129 return "navigate"; 171 return "navigate";
130 } 172 }
131 NOTREACHED(); 173 NOTREACHED();
132 return "navigate"; 174 return "navigate";
133 } 175 }
134 176
177 AtomicString PerformanceNavigationTiming::type() const {
178 DocumentLoader* loader = documentLoader();
179 if (!m_frame || !loader)
180 return ""; // Not available yet.
181 Document* document = m_frame->document();
182 return getNavigationType(loader->getNavigationType(), document);
183 }
184
135 unsigned short PerformanceNavigationTiming::redirectCount() const { 185 unsigned short PerformanceNavigationTiming::redirectCount() const {
136 if (!m_allowRedirectDetails) 186 bool allowRedirectDetails = getAllowRedirectDetails();
137 return 0; 187 DocumentLoadTiming* timing = documentLoadTiming();
138 return m_redirectCount; 188 if (!allowRedirectDetails || !timing)
189 return 0;
190 return timing->redirectCount();
191 }
192
193 // Overriding PerformanceResourceTiming's attributes.
194 AtomicString PerformanceNavigationTiming::initiatorType() const {
195 return "navigation";
196 }
197
198 DOMHighResTimeStamp PerformanceNavigationTiming::workerStart() const {
199 ResourceLoadTiming* timing = resourceLoadTiming();
200 if (!timing || timing->workerStart() == 0.0)
201 return 0.0;
202 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
203 m_timeOrigin, timing->workerStart());
204 }
205
206 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const {
207 bool allowRedirectDetails = getAllowRedirectDetails();
208 DocumentLoadTiming* timing = documentLoadTiming();
209 if (!allowRedirectDetails || !timing)
210 return 0;
211 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
212 m_timeOrigin, timing->redirectStart());
213 }
214
215 DOMHighResTimeStamp PerformanceNavigationTiming::redirectEnd() const {
216 bool allowRedirectDetails = getAllowRedirectDetails();
217 DocumentLoadTiming* timing = documentLoadTiming();
218 if (!allowRedirectDetails || !timing)
219 return 0;
220 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
221 m_timeOrigin, timing->redirectEnd());
139 } 222 }
140 223
141 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const { 224 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const {
225 DocumentLoadTiming* timing = documentLoadTiming();
226 if (!timing)
227 return 0.0;
228 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
229 m_timeOrigin, timing->fetchStart());
230 }
231
232 DOMHighResTimeStamp PerformanceNavigationTiming::domainLookupStart() const {
233 ResourceLoadTiming* timing = resourceLoadTiming();
234 if (!timing || timing->dnsStart() == 0.0)
235 return fetchStart();
236 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
237 m_timeOrigin, timing->dnsStart());
238 }
239
240 DOMHighResTimeStamp PerformanceNavigationTiming::domainLookupEnd() const {
241 ResourceLoadTiming* timing = resourceLoadTiming();
242 if (!timing || timing->dnsEnd() == 0.0)
243 return domainLookupStart();
142 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 244 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin,
143 m_fetchStart); 245 timing->dnsEnd());
144 } 246 }
145 247
146 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const { 248 DOMHighResTimeStamp PerformanceNavigationTiming::connectStart() const {
147 if (!m_allowRedirectDetails) 249 DocumentLoader* loader = documentLoader();
148 return 0; 250 if (!loader)
251 return domainLookupEnd();
252 ResourceLoadTiming* timing = resourceLoadTiming();
253 if (!timing || timing->connectStart() == 0.0 ||
254 m_resourceTimingInfo->finalResponse().connectionReused())
255 return domainLookupEnd();
256 double connectStart = timing->connectStart();
257 if (timing->dnsEnd() > 0.0 && timing->dnsEnd() > connectStart)
258 connectStart = timing->dnsEnd();
259
149 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 260 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin,
150 m_redirectStart); 261 connectStart);
151 } 262 }
152 263
153 DOMHighResTimeStamp PerformanceNavigationTiming::redirectEnd() const { 264 DOMHighResTimeStamp PerformanceNavigationTiming::connectEnd() const {
154 if (!m_allowRedirectDetails) 265 DocumentLoader* loader = documentLoader();
155 return 0; 266 if (!loader)
156 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 267 return connectStart();
157 m_redirectEnd); 268 ResourceLoadTiming* timing = resourceLoadTiming();
269 if (!timing || timing->connectEnd() == 0.0 ||
270 m_resourceTimingInfo->finalResponse().connectionReused())
271 return connectStart();
272 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
273 m_timeOrigin, timing->connectEnd());
274 }
275
276 DOMHighResTimeStamp PerformanceNavigationTiming::secureConnectionStart() const {
277 DocumentLoader* loader = documentLoader();
278 if (!loader)
279 return 0.0;
280 ResourceLoadTiming* timing = resourceLoadTiming();
281 if (!timing ||
282 timing->sslStart() == 0.0) // Secure connection not negotiated.
283 return 0.0;
284 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
285 m_timeOrigin, timing->sslStart());
286 }
287
288 DOMHighResTimeStamp PerformanceNavigationTiming::requestStart() const {
289 ResourceLoadTiming* timing = resourceLoadTiming();
290 if (!timing || timing->sendStart() == 0.0)
291 return connectEnd();
292 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
293 m_timeOrigin, timing->sendStart());
294 }
295
296 DOMHighResTimeStamp PerformanceNavigationTiming::responseStart() const {
297 ResourceLoadTiming* timing = resourceLoadTiming();
298 if (!timing || timing->receiveHeadersEnd() == 0.0)
299 return requestStart();
300 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
301 m_timeOrigin, timing->receiveHeadersEnd());
158 } 302 }
159 303
160 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const { 304 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const {
161 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 305 DocumentLoadTiming* timing = documentLoadTiming();
162 m_responseEnd); 306 if (!timing)
307 return 0.0;
308 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
309 m_timeOrigin, timing->responseEnd());
310 }
311
312 unsigned long long PerformanceNavigationTiming::transferSize() const {
313 return !m_resourceTimingInfo ? 0 : m_resourceTimingInfo->transferSize();
314 }
315
316 unsigned long long PerformanceNavigationTiming::encodedBodySize() const {
317 return !m_resourceTimingInfo
318 ? 0
319 : m_resourceTimingInfo->finalResponse().encodedBodyLength();
320 }
321
322 unsigned long long PerformanceNavigationTiming::decodedBodySize() const {
323 return !m_resourceTimingInfo
324 ? 0
325 : m_resourceTimingInfo->finalResponse().decodedBodyLength();
326 }
327
328 // Overriding PerformanceEntry's attributes.
329 DOMHighResTimeStamp PerformanceNavigationTiming::duration() const {
330 return loadEventEnd();
163 } 331 }
164 332
165 void PerformanceNavigationTiming::buildJSONValue( 333 void PerformanceNavigationTiming::buildJSONValue(
166 V8ObjectBuilder& builder) const { 334 V8ObjectBuilder& builder) const {
167 PerformanceResourceTiming::buildJSONValue(builder); 335 PerformanceResourceTiming::buildJSONValue(builder);
168 builder.addNumber("unloadEventStart", unloadEventStart()); 336 builder.addNumber("unloadEventStart", unloadEventStart());
169 builder.addNumber("unloadEventEnd", unloadEventEnd()); 337 builder.addNumber("unloadEventEnd", unloadEventEnd());
170 builder.addNumber("domInteractive", domInteractive()); 338 builder.addNumber("domInteractive", domInteractive());
171 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart()); 339 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart());
172 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd()); 340 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd());
173 builder.addNumber("domComplete", domComplete()); 341 builder.addNumber("domComplete", domComplete());
174 builder.addNumber("loadEventStart", loadEventStart()); 342 builder.addNumber("loadEventStart", loadEventStart());
175 builder.addNumber("loadEventEnd", loadEventEnd()); 343 builder.addNumber("loadEventEnd", loadEventEnd());
176 builder.addString("type", type()); 344 builder.addString("type", type());
177 builder.addNumber("redirectCount", redirectCount()); 345 builder.addNumber("redirectCount", redirectCount());
178 } 346 }
179 } 347 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698