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

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: refactor getNavigationType(...) out Created 3 years, 9 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), 29 DCHECK(info);
58 m_loadEventEnd(loadEventEnd), 30 }
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 31
72 PerformanceNavigationTiming::~PerformanceNavigationTiming() {} 32 PerformanceNavigationTiming::~PerformanceNavigationTiming() {}
73 33
34 DEFINE_TRACE(PerformanceNavigationTiming) {
35 visitor->trace(m_frame);
36 PerformanceEntry::trace(visitor);
37 }
38
39 DocumentLoadTiming* PerformanceNavigationTiming::documentLoadTiming() const {
40 DocumentLoader* loader = documentLoader();
41 if (!loader)
42 return nullptr;
43
44 return &loader->timing();
45 }
46
47 DocumentLoader* PerformanceNavigationTiming::documentLoader() const {
48 if (!m_frame)
49 return nullptr;
50
51 return m_frame->loader().documentLoader();
52 }
53
54 const DocumentTiming* PerformanceNavigationTiming::documentTiming() const {
55 if (!m_frame)
56 return nullptr;
57
58 Document* document = m_frame->document();
59 if (!document)
60 return nullptr;
61
62 return &document->timing();
63 }
64
65 ResourceLoadTiming* PerformanceNavigationTiming::resourceLoadTiming() const {
66 return m_resourceTimingInfo->finalResponse().resourceLoadTiming();
67 }
68
69 bool PerformanceNavigationTiming::allowTimingDetails() const {
70 return true;
71 }
72
73 bool PerformanceNavigationTiming::didReuseConnection() const {
74 return m_resourceTimingInfo->finalResponse().connectionReused();
75 }
76
77 unsigned long long PerformanceNavigationTiming::getTransferSize() const {
78 return m_resourceTimingInfo->transferSize();
79 }
80
81 unsigned long long PerformanceNavigationTiming::getEncodedBodySize() const {
82 return m_resourceTimingInfo->finalResponse().encodedBodyLength();
83 }
84
85 unsigned long long PerformanceNavigationTiming::getDecodedBodySize() const {
86 return m_resourceTimingInfo->finalResponse().decodedBodyLength();
87 }
88
89 AtomicString PerformanceNavigationTiming::initiatorType() const {
90 return "navigation";
91 }
92
93 bool PerformanceNavigationTiming::getAllowRedirectDetails() const {
94 ExecutionContext* context = m_frame ? m_frame->document() : nullptr;
95 SecurityOrigin* securityOrigin = nullptr;
96 if (context)
97 securityOrigin = context->getSecurityOrigin();
98 if (!securityOrigin)
99 return false;
100 // TODO(sunjian): Think about how to make this flag deterministic.
101 // crbug/693183.
102 return PerformanceBase::allowsTimingRedirect(
103 m_resourceTimingInfo->redirectChain(),
104 m_resourceTimingInfo->finalResponse(), *securityOrigin, context);
105 }
106
74 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventStart() const { 107 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventStart() const {
75 if (!m_allowRedirectDetails || !m_hasSameOriginAsPreviousDocument) 108 bool allowRedirectDetails = getAllowRedirectDetails();
109 DocumentLoadTiming* timing = documentLoadTiming();
110
111 if (!allowRedirectDetails || !timing ||
112 !timing->hasSameOriginAsPreviousDocument())
76 return 0; 113 return 0;
77 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 114 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
78 m_timeOrigin, m_unloadEventStart); 115 m_timeOrigin, timing->unloadEventStart());
79 } 116 }
80 117
81 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventEnd() const { 118 DOMHighResTimeStamp PerformanceNavigationTiming::unloadEventEnd() const {
82 if (!m_allowRedirectDetails || !m_hasSameOriginAsPreviousDocument) 119 bool allowRedirectDetails = getAllowRedirectDetails();
120 DocumentLoadTiming* timing = documentLoadTiming();
121
122 if (!allowRedirectDetails || !timing ||
123 !timing->hasSameOriginAsPreviousDocument())
83 return 0; 124 return 0;
84 125 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
85 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 126 m_timeOrigin, timing->unloadEventEnd());
86 m_unloadEventEnd);
87 } 127 }
88 128
89 DOMHighResTimeStamp PerformanceNavigationTiming::domInteractive() const { 129 DOMHighResTimeStamp PerformanceNavigationTiming::domInteractive() const {
90 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 130 const DocumentTiming* timing = documentTiming();
91 m_domInteractive); 131 if (!timing)
132 return 0.0;
133 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
134 m_timeOrigin, timing->domInteractive());
92 } 135 }
93 136
94 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventStart() 137 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventStart()
95 const { 138 const {
139 const DocumentTiming* timing = documentTiming();
140 if (!timing)
141 return 0.0;
96 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 142 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
97 m_timeOrigin, m_domContentLoadedEventStart); 143 m_timeOrigin, timing->domContentLoadedEventStart());
98 } 144 }
99 145
100 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd() 146 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd()
101 const { 147 const {
148 const DocumentTiming* timing = documentTiming();
149 if (!timing)
150 return 0.0;
102 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 151 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
103 m_timeOrigin, m_domContentLoadedEventEnd); 152 m_timeOrigin, timing->domContentLoadedEventEnd());
104 } 153 }
105 154
106 DOMHighResTimeStamp PerformanceNavigationTiming::domComplete() const { 155 DOMHighResTimeStamp PerformanceNavigationTiming::domComplete() const {
107 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 156 const DocumentTiming* timing = documentTiming();
108 m_domComplete); 157 if (!timing)
158 return 0.0;
159 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
160 m_timeOrigin, timing->domComplete());
109 } 161 }
110 162
111 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventStart() const { 163 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventStart() const {
112 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 164 DocumentLoadTiming* timing = documentLoadTiming();
113 m_loadEventStart); 165 if (!timing)
166 return 0.0;
167 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
168 m_timeOrigin, timing->loadEventStart());
114 } 169 }
115 170
116 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventEnd() const { 171 DOMHighResTimeStamp PerformanceNavigationTiming::loadEventEnd() const {
117 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 172 DocumentLoadTiming* timing = documentLoadTiming();
118 m_loadEventEnd); 173 if (!timing)
174 return 0.0;
175 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
176 m_timeOrigin, timing->loadEventEnd());
119 } 177 }
120 178
121 AtomicString PerformanceNavigationTiming::type() const { 179 AtomicString PerformanceNavigationTiming::type() const {
122 switch (m_type) { 180 DocumentLoader* loader = documentLoader();
181 DCHECK(m_frame);
182 DCHECK(loader);
183 Document* document = m_frame->document();
184 switch (PerformanceBase::getNavigationType(loader->getNavigationType(),
185 document)) {
186 case NavigationType::Prerender:
187 return "prerender";
123 case NavigationType::Reload: 188 case NavigationType::Reload:
124 return "reload"; 189 return "reload";
125 case NavigationType::BackForward: 190 case NavigationType::BackForward:
126 return "back_forward"; 191 return "back_forward";
127 case NavigationType::Prerender:
128 return "prerender";
129 case NavigationType::Navigate: 192 case NavigationType::Navigate:
130 return "navigate"; 193 return "navigate";
131 } 194 }
132 NOTREACHED(); 195 NOTREACHED();
133 return "navigate"; 196 return "navigate";
134 } 197 }
135 198
136 unsigned short PerformanceNavigationTiming::redirectCount() const { 199 unsigned short PerformanceNavigationTiming::redirectCount() const {
137 if (!m_allowRedirectDetails) 200 bool allowRedirectDetails = getAllowRedirectDetails();
201 DocumentLoadTiming* timing = documentLoadTiming();
202 if (!allowRedirectDetails || !timing)
138 return 0; 203 return 0;
139 return m_redirectCount; 204 return timing->redirectCount();
205 }
206
207 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const {
208 bool allowRedirectDetails = getAllowRedirectDetails();
209 DocumentLoadTiming* timing = documentLoadTiming();
210 if (!allowRedirectDetails || !timing)
211 return 0;
212 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
213 m_timeOrigin, timing->redirectStart());
214 }
215
216 DOMHighResTimeStamp PerformanceNavigationTiming::redirectEnd() const {
217 bool allowRedirectDetails = getAllowRedirectDetails();
218 DocumentLoadTiming* timing = documentLoadTiming();
219 if (!allowRedirectDetails || !timing)
220 return 0;
221 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
222 m_timeOrigin, timing->redirectEnd());
140 } 223 }
141 224
142 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const { 225 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const {
143 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 226 DocumentLoadTiming* timing = documentLoadTiming();
144 m_fetchStart); 227 if (!timing)
145 } 228 return 0.0;
146 229 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
147 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const { 230 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 } 231 }
160 232
161 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const { 233 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const {
162 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 234 DocumentLoadTiming* timing = documentLoadTiming();
163 m_responseEnd); 235 if (!timing)
236 return 0.0;
237 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
238 m_timeOrigin, timing->responseEnd());
239 }
240
241 // Overriding PerformanceEntry's attributes.
242 DOMHighResTimeStamp PerformanceNavigationTiming::duration() const {
243 return loadEventEnd();
164 } 244 }
165 245
166 void PerformanceNavigationTiming::buildJSONValue( 246 void PerformanceNavigationTiming::buildJSONValue(
167 V8ObjectBuilder& builder) const { 247 V8ObjectBuilder& builder) const {
168 PerformanceResourceTiming::buildJSONValue(builder); 248 PerformanceResourceTiming::buildJSONValue(builder);
169 builder.addNumber("unloadEventStart", unloadEventStart()); 249 builder.addNumber("unloadEventStart", unloadEventStart());
170 builder.addNumber("unloadEventEnd", unloadEventEnd()); 250 builder.addNumber("unloadEventEnd", unloadEventEnd());
171 builder.addNumber("domInteractive", domInteractive()); 251 builder.addNumber("domInteractive", domInteractive());
172 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart()); 252 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart());
173 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd()); 253 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd());
174 builder.addNumber("domComplete", domComplete()); 254 builder.addNumber("domComplete", domComplete());
175 builder.addNumber("loadEventStart", loadEventStart()); 255 builder.addNumber("loadEventStart", loadEventStart());
176 builder.addNumber("loadEventEnd", loadEventEnd()); 256 builder.addNumber("loadEventEnd", loadEventEnd());
177 builder.addString("type", type()); 257 builder.addString("type", type());
178 builder.addNumber("redirectCount", redirectCount()); 258 builder.addNumber("redirectCount", redirectCount());
179 } 259 }
180 } 260 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698