OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |