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

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

Powered by Google App Engine
This is Rietveld 408576698