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

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: moved layout test to external/wpt directory 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();
76 return 0; 109 DocumentLoadTiming* timing = documentLoadTiming();
77 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 110
78 m_timeOrigin, m_unloadEventStart); 111 if (!allowRedirectDetails || !timing ||
112 !timing->hasSameOriginAsPreviousDocument())
113 return 0;
114 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
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();
83 return 0; 120 DocumentLoadTiming* timing = documentLoadTiming();
84 121
85 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 122 if (!allowRedirectDetails || !timing ||
86 m_unloadEventEnd); 123 !timing->hasSameOriginAsPreviousDocument())
124 return 0;
125 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
126 m_timeOrigin, timing->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 {
96 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 139 const DocumentTiming* timing = documentTiming();
97 m_timeOrigin, m_domContentLoadedEventStart); 140 if (!timing)
141 return 0.0;
142 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
143 m_timeOrigin, timing->domContentLoadedEventStart());
98 } 144 }
99 145
100 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd() 146 DOMHighResTimeStamp PerformanceNavigationTiming::domContentLoadedEventEnd()
101 const { 147 const {
102 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 148 const DocumentTiming* timing = documentTiming();
103 m_timeOrigin, m_domContentLoadedEventEnd); 149 if (!timing)
150 return 0.0;
151 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
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)
119 } 174 return 0.0;
120 175 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
121 AtomicString PerformanceNavigationTiming::type() const { 176 m_timeOrigin, timing->loadEventEnd());
122 switch (m_type) { 177 }
123 case NavigationType::Reload: 178
179 AtomicString PerformanceNavigationTiming::getNavigationType(
180 NavigationType type,
181 const Document* document) {
182 if (document &&
183 document->pageVisibilityState() == PageVisibilityStatePrerender) {
184 return "prerender";
185 }
186 switch (type) {
187 case NavigationTypeReload:
124 return "reload"; 188 return "reload";
125 case NavigationType::BackForward: 189 case NavigationTypeBackForward:
126 return "back_forward"; 190 return "back_forward";
127 case NavigationType::Prerender: 191 case NavigationTypeLinkClicked:
128 return "prerender"; 192 case NavigationTypeFormSubmitted:
129 case NavigationType::Navigate: 193 case NavigationTypeFormResubmitted:
194 case NavigationTypeOther:
130 return "navigate"; 195 return "navigate";
131 } 196 }
132 NOTREACHED(); 197 NOTREACHED();
133 return "navigate"; 198 return "navigate";
134 } 199 }
135 200
201 AtomicString PerformanceNavigationTiming::type() const {
202 DocumentLoader* loader = documentLoader();
203 DCHECK(m_frame);
204 DCHECK(loader);
205 Document* document = m_frame->document();
206 return getNavigationType(loader->getNavigationType(), document);
207 }
208
136 unsigned short PerformanceNavigationTiming::redirectCount() const { 209 unsigned short PerformanceNavigationTiming::redirectCount() const {
137 if (!m_allowRedirectDetails) 210 bool allowRedirectDetails = getAllowRedirectDetails();
138 return 0; 211 DocumentLoadTiming* timing = documentLoadTiming();
139 return m_redirectCount; 212 if (!allowRedirectDetails || !timing)
213 return 0;
214 return timing->redirectCount();
215 }
216
217 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const {
218 bool allowRedirectDetails = getAllowRedirectDetails();
219 DocumentLoadTiming* timing = documentLoadTiming();
220 if (!allowRedirectDetails || !timing)
221 return 0;
222 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
223 m_timeOrigin, timing->redirectStart());
224 }
225
226 DOMHighResTimeStamp PerformanceNavigationTiming::redirectEnd() const {
227 bool allowRedirectDetails = getAllowRedirectDetails();
228 DocumentLoadTiming* timing = documentLoadTiming();
229 if (!allowRedirectDetails || !timing)
230 return 0;
231 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
232 m_timeOrigin, timing->redirectEnd());
140 } 233 }
141 234
142 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const { 235 DOMHighResTimeStamp PerformanceNavigationTiming::fetchStart() const {
143 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 236 DocumentLoadTiming* timing = documentLoadTiming();
144 m_fetchStart); 237 if (!timing)
145 } 238 return 0.0;
146 239 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
147 DOMHighResTimeStamp PerformanceNavigationTiming::redirectStart() const { 240 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 } 241 }
160 242
161 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const { 243 DOMHighResTimeStamp PerformanceNavigationTiming::responseEnd() const {
162 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 244 DocumentLoadTiming* timing = documentLoadTiming();
163 m_responseEnd); 245 if (!timing)
246 return 0.0;
247 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
248 m_timeOrigin, timing->responseEnd());
249 }
250
251 // Overriding PerformanceEntry's attributes.
252 DOMHighResTimeStamp PerformanceNavigationTiming::duration() const {
253 return loadEventEnd();
164 } 254 }
165 255
166 void PerformanceNavigationTiming::buildJSONValue( 256 void PerformanceNavigationTiming::buildJSONValue(
167 V8ObjectBuilder& builder) const { 257 V8ObjectBuilder& builder) const {
168 PerformanceResourceTiming::buildJSONValue(builder); 258 PerformanceResourceTiming::buildJSONValue(builder);
169 builder.addNumber("unloadEventStart", unloadEventStart()); 259 builder.addNumber("unloadEventStart", unloadEventStart());
170 builder.addNumber("unloadEventEnd", unloadEventEnd()); 260 builder.addNumber("unloadEventEnd", unloadEventEnd());
171 builder.addNumber("domInteractive", domInteractive()); 261 builder.addNumber("domInteractive", domInteractive());
172 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart()); 262 builder.addNumber("domContentLoadedEventStart", domContentLoadedEventStart());
173 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd()); 263 builder.addNumber("domContentLoadedEventEnd", domContentLoadedEventEnd());
174 builder.addNumber("domComplete", domComplete()); 264 builder.addNumber("domComplete", domComplete());
175 builder.addNumber("loadEventStart", loadEventStart()); 265 builder.addNumber("loadEventStart", loadEventStart());
176 builder.addNumber("loadEventEnd", loadEventEnd()); 266 builder.addNumber("loadEventEnd", loadEventEnd());
177 builder.addString("type", type()); 267 builder.addString("type", type());
178 builder.addNumber("redirectCount", redirectCount()); 268 builder.addNumber("redirectCount", redirectCount());
179 } 269 }
180 } 270 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698