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

Side by Side Diff: third_party/WebKit/Source/core/timing/PerformanceResourceTiming.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 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * Copyright (C) 2012 Intel Inc. All rights reserved. 3 * Copyright (C) 2012 Intel Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 22 matching lines...) Expand all
33 33
34 #include "bindings/core/v8/V8ObjectBuilder.h" 34 #include "bindings/core/v8/V8ObjectBuilder.h"
35 #include "core/timing/PerformanceBase.h" 35 #include "core/timing/PerformanceBase.h"
36 #include "platform/network/ResourceRequest.h" 36 #include "platform/network/ResourceRequest.h"
37 #include "platform/network/ResourceResponse.h" 37 #include "platform/network/ResourceResponse.h"
38 #include "platform/network/ResourceTimingInfo.h" 38 #include "platform/network/ResourceTimingInfo.h"
39 39
40 namespace blink { 40 namespace blink {
41 41
42 PerformanceResourceTiming::PerformanceResourceTiming( 42 PerformanceResourceTiming::PerformanceResourceTiming(
43 const AtomicString& initiatorType,
44 double timeOrigin,
45 ResourceLoadTiming* timing,
46 double lastRedirectEndTime,
47 double finishTime,
48 unsigned long long transferSize,
49 unsigned long long encodedBodyLength,
50 unsigned long long decodedBodyLength,
51 bool didReuseConnection,
52 bool allowTimingDetails,
53 bool allowRedirectDetails,
54 const String& name,
55 const String& entryType,
56 double startTime)
57 : PerformanceEntry(
58 name,
59 entryType,
60 PerformanceBase::monotonicTimeToDOMHighResTimeStamp(timeOrigin,
61 startTime),
62 PerformanceBase::monotonicTimeToDOMHighResTimeStamp(timeOrigin,
63 finishTime)),
64 m_initiatorType(initiatorType),
65 m_timeOrigin(timeOrigin),
66 m_timing(timing),
67 m_lastRedirectEndTime(lastRedirectEndTime),
68 m_finishTime(finishTime),
69 m_transferSize(transferSize),
70 m_encodedBodySize(encodedBodyLength),
71 m_decodedBodySize(decodedBodyLength),
72 m_didReuseConnection(didReuseConnection),
73 m_allowTimingDetails(allowTimingDetails),
74 m_allowRedirectDetails(allowRedirectDetails) {}
75
76 PerformanceResourceTiming::PerformanceResourceTiming(
77 const ResourceTimingInfo& info, 43 const ResourceTimingInfo& info,
78 double timeOrigin, 44 double timeOrigin,
79 double startTime, 45 double startTime,
80 double lastRedirectEndTime, 46 double lastRedirectEndTime,
81 bool allowTimingDetails, 47 bool allowTimingDetails,
82 bool allowRedirectDetails) 48 bool allowRedirectDetails)
83 : PerformanceResourceTiming(info.initiatorType(), 49 : PerformanceEntry(
84 timeOrigin, 50 info.initialURL().getString(),
85 info.finalResponse().resourceLoadTiming(), 51 "resource",
86 lastRedirectEndTime, 52 PerformanceBase::monotonicTimeToDOMHighResTimeStamp(timeOrigin,
87 info.loadFinishTime(), 53 startTime),
88 info.transferSize(), 54 PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
89 info.finalResponse().encodedBodyLength(), 55 timeOrigin,
90 info.finalResponse().decodedBodyLength(), 56 info.loadFinishTime())),
91 info.finalResponse().connectionReused(), 57 m_initiatorType(info.initiatorType()),
92 allowTimingDetails, 58 m_timeOrigin(timeOrigin),
93 allowRedirectDetails, 59 m_timing(info.finalResponse().resourceLoadTiming()),
94 info.initialURL().getString(), 60 m_lastRedirectEndTime(lastRedirectEndTime),
95 "resource", 61 m_finishTime(info.loadFinishTime()),
96 startTime) {} 62 m_transferSize(info.transferSize()),
63 m_encodedBodySize(info.finalResponse().encodedBodyLength()),
64 m_decodedBodySize(info.finalResponse().decodedBodyLength()),
65 m_didReuseConnection(info.finalResponse().connectionReused()),
66 m_allowTimingDetails(allowTimingDetails),
67 m_allowRedirectDetails(allowRedirectDetails) {}
68
69 // This constructor is for PerformanceNavigationTiming.
70 PerformanceResourceTiming::PerformanceResourceTiming(const String& name,
71 const String& entryType,
72 double startTime,
73 double duration)
74 : PerformanceEntry(name, entryType, startTime, duration) {}
97 75
98 PerformanceResourceTiming::~PerformanceResourceTiming() {} 76 PerformanceResourceTiming::~PerformanceResourceTiming() {}
99 77
100 AtomicString PerformanceResourceTiming::initiatorType() const { 78 ResourceLoadTiming* PerformanceResourceTiming::resourceLoadTiming() const {
79 return m_timing.get();
80 }
81
82 bool PerformanceResourceTiming::allowTimingDetails() const {
83 return m_allowTimingDetails;
84 }
85
86 bool PerformanceResourceTiming::didReuseConnection() const {
87 return m_didReuseConnection;
88 }
89
90 unsigned long long PerformanceResourceTiming::getTransferSize() const {
91 return m_transferSize;
92 }
93
94 unsigned long long PerformanceResourceTiming::getEncodedBodySize() const {
95 return m_encodedBodySize;
96 }
97
98 unsigned long long PerformanceResourceTiming::getDecodedBodySize() const {
99 return m_decodedBodySize;
100 }
101
102 AtomicString PerformanceResourceTiming::getInitiatorType() const {
101 return m_initiatorType; 103 return m_initiatorType;
102 } 104 }
103 105
106 AtomicString PerformanceResourceTiming::initiatorType() const {
Kunihiko Sakamoto 2017/02/16 08:42:30 Let's make this a virtual function directly.
sunjian 2017/02/16 22:30:49 Done.
107 return getInitiatorType();
108 }
109
104 DOMHighResTimeStamp PerformanceResourceTiming::workerStart() const { 110 DOMHighResTimeStamp PerformanceResourceTiming::workerStart() const {
105 if (!m_timing || m_timing->workerStart() == 0.0) 111 ResourceLoadTiming* timing = resourceLoadTiming();
112 if (!timing || timing->workerStart() == 0.0)
106 return 0.0; 113 return 0.0;
107 114
108 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 115 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
109 m_timeOrigin, m_timing->workerStart()); 116 m_timeOrigin, timing->workerStart());
110 } 117 }
111 118
112 DOMHighResTimeStamp PerformanceResourceTiming::workerReady() const { 119 DOMHighResTimeStamp PerformanceResourceTiming::workerReady() const {
113 if (!m_timing || m_timing->workerReady() == 0.0) 120 ResourceLoadTiming* timing = resourceLoadTiming();
121 if (!timing || timing->workerReady() == 0.0)
114 return 0.0; 122 return 0.0;
115 123
116 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 124 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
117 m_timeOrigin, m_timing->workerReady()); 125 m_timeOrigin, timing->workerReady());
118 } 126 }
119 127
120 DOMHighResTimeStamp PerformanceResourceTiming::redirectStart() const { 128 DOMHighResTimeStamp PerformanceResourceTiming::redirectStart() const {
121 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) 129 if (!m_lastRedirectEndTime || !m_allowRedirectDetails)
122 return 0.0; 130 return 0.0;
123 131
124 if (DOMHighResTimeStamp workerReadyTime = workerReady()) 132 if (DOMHighResTimeStamp workerReadyTime = workerReady())
125 return workerReadyTime; 133 return workerReadyTime;
126 134
127 return PerformanceEntry::startTime(); 135 return PerformanceEntry::startTime();
128 } 136 }
129 137
130 DOMHighResTimeStamp PerformanceResourceTiming::redirectEnd() const { 138 DOMHighResTimeStamp PerformanceResourceTiming::redirectEnd() const {
131 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) 139 if (!m_lastRedirectEndTime || !m_allowRedirectDetails)
132 return 0.0; 140 return 0.0;
133 141
134 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 142 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
135 m_timeOrigin, m_lastRedirectEndTime); 143 m_timeOrigin, m_lastRedirectEndTime);
136 } 144 }
137 145
138 DOMHighResTimeStamp PerformanceResourceTiming::fetchStart() const { 146 DOMHighResTimeStamp PerformanceResourceTiming::fetchStart() const {
139 if (m_lastRedirectEndTime) { 147 if (m_lastRedirectEndTime) {
140 // FIXME: ASSERT(m_timing) should be in constructor once timeticks of 148 // FIXME: ASSERT(m_timing) should be in constructor once timeticks of
141 // AppCache is exposed from chrome network stack, crbug/251100 149 // AppCache is exposed from chrome network stack, crbug/251100
142 ASSERT(m_timing); 150 ResourceLoadTiming* timing = resourceLoadTiming();
151 DCHECK(timing);
143 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 152 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
144 m_timeOrigin, m_timing->requestTime()); 153 m_timeOrigin, timing->requestTime());
145 } 154 }
146 155
147 if (DOMHighResTimeStamp workerReadyTime = workerReady()) 156 if (DOMHighResTimeStamp workerReadyTime = workerReady())
148 return workerReadyTime; 157 return workerReadyTime;
149 158
150 return PerformanceEntry::startTime(); 159 return PerformanceEntry::startTime();
151 } 160 }
152 161
153 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupStart() const { 162 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupStart() const {
154 if (!m_allowTimingDetails) 163 if (!allowTimingDetails())
155 return 0.0; 164 return 0.0;
156 165 ResourceLoadTiming* timing = resourceLoadTiming();
157 if (!m_timing || m_timing->dnsStart() == 0.0) 166 if (!timing || timing->dnsStart() == 0.0)
158 return fetchStart(); 167 return fetchStart();
159 168
160 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 169 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
161 m_timeOrigin, m_timing->dnsStart()); 170 m_timeOrigin, timing->dnsStart());
162 } 171 }
163 172
164 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupEnd() const { 173 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupEnd() const {
165 if (!m_allowTimingDetails) 174 if (!allowTimingDetails())
166 return 0.0; 175 return 0.0;
167 176 ResourceLoadTiming* timing = resourceLoadTiming();
168 if (!m_timing || m_timing->dnsEnd() == 0.0) 177 if (!timing || timing->dnsEnd() == 0.0)
169 return domainLookupStart(); 178 return domainLookupStart();
170 179
171 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 180 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin,
172 m_timeOrigin, m_timing->dnsEnd()); 181 timing->dnsEnd());
173 } 182 }
174 183
175 DOMHighResTimeStamp PerformanceResourceTiming::connectStart() const { 184 DOMHighResTimeStamp PerformanceResourceTiming::connectStart() const {
176 if (!m_allowTimingDetails) 185 if (!allowTimingDetails())
177 return 0.0; 186 return 0.0;
178 187 ResourceLoadTiming* timing = resourceLoadTiming();
179 // connectStart will be zero when a network request is not made. 188 // connectStart will be zero when a network request is not made.
180 if (!m_timing || m_timing->connectStart() == 0.0 || m_didReuseConnection) 189 if (!timing || timing->connectStart() == 0.0 || didReuseConnection())
181 return domainLookupEnd(); 190 return domainLookupEnd();
182 191
183 // connectStart includes any DNS time, so we may need to trim that off. 192 // connectStart includes any DNS time, so we may need to trim that off.
184 double connectStart = m_timing->connectStart(); 193 double connectStart = timing->connectStart();
185 if (m_timing->dnsEnd() > 0.0) 194 if (timing->dnsEnd() > 0.0)
186 connectStart = m_timing->dnsEnd(); 195 connectStart = timing->dnsEnd();
187 196
188 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 197 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin,
189 connectStart); 198 connectStart);
190 } 199 }
191 200
192 DOMHighResTimeStamp PerformanceResourceTiming::connectEnd() const { 201 DOMHighResTimeStamp PerformanceResourceTiming::connectEnd() const {
193 if (!m_allowTimingDetails) 202 if (!allowTimingDetails())
194 return 0.0; 203 return 0.0;
195 204 ResourceLoadTiming* timing = resourceLoadTiming();
196 // connectStart will be zero when a network request is not made. 205 // connectStart will be zero when a network request is not made.
197 if (!m_timing || m_timing->connectEnd() == 0.0 || m_didReuseConnection) 206 if (!timing || timing->connectEnd() == 0.0 || didReuseConnection())
198 return connectStart(); 207 return connectStart();
199 208
200 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 209 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
201 m_timeOrigin, m_timing->connectEnd()); 210 m_timeOrigin, timing->connectEnd());
202 } 211 }
203 212
204 DOMHighResTimeStamp PerformanceResourceTiming::secureConnectionStart() const { 213 DOMHighResTimeStamp PerformanceResourceTiming::secureConnectionStart() const {
205 if (!m_allowTimingDetails) 214 if (!allowTimingDetails())
206 return 0.0; 215 return 0.0;
207 216 ResourceLoadTiming* timing = resourceLoadTiming();
208 if (!m_timing || 217 if (!timing ||
209 m_timing->sslStart() == 0.0) // Secure connection not negotiated. 218 timing->sslStart() == 0.0) // Secure connection not negotiated.
210 return 0.0; 219 return 0.0;
211 220
212 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 221 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
213 m_timeOrigin, m_timing->sslStart()); 222 m_timeOrigin, timing->sslStart());
214 } 223 }
215 224
216 DOMHighResTimeStamp PerformanceResourceTiming::requestStart() const { 225 DOMHighResTimeStamp PerformanceResourceTiming::requestStart() const {
217 if (!m_allowTimingDetails) 226 if (!allowTimingDetails())
218 return 0.0; 227 return 0.0;
219 228 ResourceLoadTiming* timing = resourceLoadTiming();
220 if (!m_timing) 229 if (!timing)
221 return connectEnd(); 230 return connectEnd();
222 231
223 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 232 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
224 m_timeOrigin, m_timing->sendStart()); 233 m_timeOrigin, timing->sendStart());
225 } 234 }
226 235
227 DOMHighResTimeStamp PerformanceResourceTiming::responseStart() const { 236 DOMHighResTimeStamp PerformanceResourceTiming::responseStart() const {
228 if (!m_allowTimingDetails) 237 if (!allowTimingDetails())
229 return 0.0; 238 return 0.0;
230 239 ResourceLoadTiming* timing = resourceLoadTiming();
231 if (!m_timing) 240 if (!timing)
232 return requestStart(); 241 return requestStart();
233 242
234 // FIXME: This number isn't exactly correct. See the notes in 243 // FIXME: This number isn't exactly correct. See the notes in
235 // PerformanceTiming::responseStart(). 244 // PerformanceTiming::responseStart().
236 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( 245 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(
237 m_timeOrigin, m_timing->receiveHeadersEnd()); 246 m_timeOrigin, timing->receiveHeadersEnd());
238 } 247 }
239 248
240 DOMHighResTimeStamp PerformanceResourceTiming::responseEnd() const { 249 DOMHighResTimeStamp PerformanceResourceTiming::responseEnd() const {
241 if (!m_finishTime) 250 if (!m_finishTime)
242 return responseStart(); 251 return responseStart();
243 252
244 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, 253 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin,
245 m_finishTime); 254 m_finishTime);
246 } 255 }
247 256
248 unsigned long long PerformanceResourceTiming::transferSize() const { 257 unsigned long long PerformanceResourceTiming::transferSize() const {
249 if (!m_allowTimingDetails) 258 if (!allowTimingDetails())
250 return 0; 259 return 0;
251 260
252 return m_transferSize; 261 return getTransferSize();
253 } 262 }
254 263
255 unsigned long long PerformanceResourceTiming::encodedBodySize() const { 264 unsigned long long PerformanceResourceTiming::encodedBodySize() const {
256 if (!m_allowTimingDetails) 265 if (!allowTimingDetails())
257 return 0; 266 return 0;
258 267
259 return m_encodedBodySize; 268 return getEncodedBodySize();
260 } 269 }
261 270
262 unsigned long long PerformanceResourceTiming::decodedBodySize() const { 271 unsigned long long PerformanceResourceTiming::decodedBodySize() const {
263 if (!m_allowTimingDetails) 272 if (!allowTimingDetails())
264 return 0; 273 return 0;
265 274
266 return m_decodedBodySize; 275 return getDecodedBodySize();
267 } 276 }
268 277
269 void PerformanceResourceTiming::buildJSONValue(V8ObjectBuilder& builder) const { 278 void PerformanceResourceTiming::buildJSONValue(V8ObjectBuilder& builder) const {
270 PerformanceEntry::buildJSONValue(builder); 279 PerformanceEntry::buildJSONValue(builder);
271 builder.addString("initiatorType", initiatorType()); 280 builder.addString("initiatorType", initiatorType());
272 builder.addNumber("workerStart", workerStart()); 281 builder.addNumber("workerStart", workerStart());
273 builder.addNumber("redirectStart", redirectStart()); 282 builder.addNumber("redirectStart", redirectStart());
274 builder.addNumber("redirectEnd", redirectEnd()); 283 builder.addNumber("redirectEnd", redirectEnd());
275 builder.addNumber("fetchStart", fetchStart()); 284 builder.addNumber("fetchStart", fetchStart());
276 builder.addNumber("domainLookupStart", domainLookupStart()); 285 builder.addNumber("domainLookupStart", domainLookupStart());
277 builder.addNumber("domainLookupEnd", domainLookupEnd()); 286 builder.addNumber("domainLookupEnd", domainLookupEnd());
278 builder.addNumber("connectStart", connectStart()); 287 builder.addNumber("connectStart", connectStart());
279 builder.addNumber("connectEnd", connectEnd()); 288 builder.addNumber("connectEnd", connectEnd());
280 builder.addNumber("secureConnectionStart", secureConnectionStart()); 289 builder.addNumber("secureConnectionStart", secureConnectionStart());
281 builder.addNumber("requestStart", requestStart()); 290 builder.addNumber("requestStart", requestStart());
282 builder.addNumber("responseStart", responseStart()); 291 builder.addNumber("responseStart", responseStart());
283 builder.addNumber("responseEnd", responseEnd()); 292 builder.addNumber("responseEnd", responseEnd());
284 builder.addNumber("transferSize", transferSize()); 293 builder.addNumber("transferSize", transferSize());
285 builder.addNumber("encodedBodySize", encodedBodySize()); 294 builder.addNumber("encodedBodySize", encodedBodySize());
286 builder.addNumber("decodedBodySize", decodedBodySize()); 295 builder.addNumber("decodedBodySize", decodedBodySize());
287 } 296 }
288 297
289 } // namespace blink 298 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698