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 |
| 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 |
100 AtomicString PerformanceResourceTiming::initiatorType() const { | 102 AtomicString PerformanceResourceTiming::initiatorType() const { |
101 return m_initiatorType; | 103 return m_initiatorType; |
102 } | 104 } |
103 | 105 |
104 DOMHighResTimeStamp PerformanceResourceTiming::workerStart() const { | 106 DOMHighResTimeStamp PerformanceResourceTiming::workerStart() const { |
105 if (!m_timing || m_timing->workerStart() == 0.0) | 107 ResourceLoadTiming* timing = resourceLoadTiming(); |
| 108 if (!timing || timing->workerStart() == 0.0) |
106 return 0.0; | 109 return 0.0; |
107 | 110 |
108 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 111 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
109 m_timeOrigin, m_timing->workerStart()); | 112 m_timeOrigin, timing->workerStart()); |
110 } | 113 } |
111 | 114 |
112 DOMHighResTimeStamp PerformanceResourceTiming::workerReady() const { | 115 DOMHighResTimeStamp PerformanceResourceTiming::workerReady() const { |
113 if (!m_timing || m_timing->workerReady() == 0.0) | 116 ResourceLoadTiming* timing = resourceLoadTiming(); |
| 117 if (!timing || timing->workerReady() == 0.0) |
114 return 0.0; | 118 return 0.0; |
115 | 119 |
116 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 120 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
117 m_timeOrigin, m_timing->workerReady()); | 121 m_timeOrigin, timing->workerReady()); |
118 } | 122 } |
119 | 123 |
120 DOMHighResTimeStamp PerformanceResourceTiming::redirectStart() const { | 124 DOMHighResTimeStamp PerformanceResourceTiming::redirectStart() const { |
121 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) | 125 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) |
122 return 0.0; | 126 return 0.0; |
123 | 127 |
124 if (DOMHighResTimeStamp workerReadyTime = workerReady()) | 128 if (DOMHighResTimeStamp workerReadyTime = workerReady()) |
125 return workerReadyTime; | 129 return workerReadyTime; |
126 | 130 |
127 return PerformanceEntry::startTime(); | 131 return PerformanceEntry::startTime(); |
128 } | 132 } |
129 | 133 |
130 DOMHighResTimeStamp PerformanceResourceTiming::redirectEnd() const { | 134 DOMHighResTimeStamp PerformanceResourceTiming::redirectEnd() const { |
131 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) | 135 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) |
132 return 0.0; | 136 return 0.0; |
133 | 137 |
134 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 138 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
135 m_timeOrigin, m_lastRedirectEndTime); | 139 m_timeOrigin, m_lastRedirectEndTime); |
136 } | 140 } |
137 | 141 |
138 DOMHighResTimeStamp PerformanceResourceTiming::fetchStart() const { | 142 DOMHighResTimeStamp PerformanceResourceTiming::fetchStart() const { |
139 if (m_lastRedirectEndTime) { | 143 if (m_lastRedirectEndTime) { |
140 // FIXME: ASSERT(m_timing) should be in constructor once timeticks of | 144 // FIXME: ASSERT(m_timing) should be in constructor once timeticks of |
141 // AppCache is exposed from chrome network stack, crbug/251100 | 145 // AppCache is exposed from chrome network stack, crbug/251100 |
142 ASSERT(m_timing); | 146 ResourceLoadTiming* timing = resourceLoadTiming(); |
| 147 DCHECK(timing); |
143 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 148 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
144 m_timeOrigin, m_timing->requestTime()); | 149 m_timeOrigin, timing->requestTime()); |
145 } | 150 } |
146 | 151 |
147 if (DOMHighResTimeStamp workerReadyTime = workerReady()) | 152 if (DOMHighResTimeStamp workerReadyTime = workerReady()) |
148 return workerReadyTime; | 153 return workerReadyTime; |
149 | 154 |
150 return PerformanceEntry::startTime(); | 155 return PerformanceEntry::startTime(); |
151 } | 156 } |
152 | 157 |
153 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupStart() const { | 158 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupStart() const { |
154 if (!m_allowTimingDetails) | 159 if (!allowTimingDetails()) |
155 return 0.0; | 160 return 0.0; |
156 | 161 ResourceLoadTiming* timing = resourceLoadTiming(); |
157 if (!m_timing || m_timing->dnsStart() == 0.0) | 162 if (!timing || timing->dnsStart() == 0.0) |
158 return fetchStart(); | 163 return fetchStart(); |
159 | 164 |
160 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 165 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
161 m_timeOrigin, m_timing->dnsStart()); | 166 m_timeOrigin, timing->dnsStart()); |
162 } | 167 } |
163 | 168 |
164 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupEnd() const { | 169 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupEnd() const { |
165 if (!m_allowTimingDetails) | 170 if (!allowTimingDetails()) |
166 return 0.0; | 171 return 0.0; |
167 | 172 ResourceLoadTiming* timing = resourceLoadTiming(); |
168 if (!m_timing || m_timing->dnsEnd() == 0.0) | 173 if (!timing || timing->dnsEnd() == 0.0) |
169 return domainLookupStart(); | 174 return domainLookupStart(); |
170 | 175 |
171 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 176 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, |
172 m_timeOrigin, m_timing->dnsEnd()); | 177 timing->dnsEnd()); |
173 } | 178 } |
174 | 179 |
175 DOMHighResTimeStamp PerformanceResourceTiming::connectStart() const { | 180 DOMHighResTimeStamp PerformanceResourceTiming::connectStart() const { |
176 if (!m_allowTimingDetails) | 181 if (!allowTimingDetails()) |
177 return 0.0; | 182 return 0.0; |
178 | 183 ResourceLoadTiming* timing = resourceLoadTiming(); |
179 // connectStart will be zero when a network request is not made. | 184 // connectStart will be zero when a network request is not made. |
180 if (!m_timing || m_timing->connectStart() == 0.0 || m_didReuseConnection) | 185 if (!timing || timing->connectStart() == 0.0 || didReuseConnection()) |
181 return domainLookupEnd(); | 186 return domainLookupEnd(); |
182 | 187 |
183 // connectStart includes any DNS time, so we may need to trim that off. | 188 // connectStart includes any DNS time, so we may need to trim that off. |
184 double connectStart = m_timing->connectStart(); | 189 double connectStart = timing->connectStart(); |
185 if (m_timing->dnsEnd() > 0.0) | 190 if (timing->dnsEnd() > 0.0) |
186 connectStart = m_timing->dnsEnd(); | 191 connectStart = timing->dnsEnd(); |
187 | 192 |
188 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 193 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, |
189 connectStart); | 194 connectStart); |
190 } | 195 } |
191 | 196 |
192 DOMHighResTimeStamp PerformanceResourceTiming::connectEnd() const { | 197 DOMHighResTimeStamp PerformanceResourceTiming::connectEnd() const { |
193 if (!m_allowTimingDetails) | 198 if (!allowTimingDetails()) |
194 return 0.0; | 199 return 0.0; |
195 | 200 ResourceLoadTiming* timing = resourceLoadTiming(); |
196 // connectStart will be zero when a network request is not made. | 201 // connectStart will be zero when a network request is not made. |
197 if (!m_timing || m_timing->connectEnd() == 0.0 || m_didReuseConnection) | 202 if (!timing || timing->connectEnd() == 0.0 || didReuseConnection()) |
198 return connectStart(); | 203 return connectStart(); |
199 | 204 |
200 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 205 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
201 m_timeOrigin, m_timing->connectEnd()); | 206 m_timeOrigin, timing->connectEnd()); |
202 } | 207 } |
203 | 208 |
204 DOMHighResTimeStamp PerformanceResourceTiming::secureConnectionStart() const { | 209 DOMHighResTimeStamp PerformanceResourceTiming::secureConnectionStart() const { |
205 if (!m_allowTimingDetails) | 210 if (!allowTimingDetails()) |
206 return 0.0; | 211 return 0.0; |
207 | 212 ResourceLoadTiming* timing = resourceLoadTiming(); |
208 if (!m_timing || | 213 if (!timing || |
209 m_timing->sslStart() == 0.0) // Secure connection not negotiated. | 214 timing->sslStart() == 0.0) // Secure connection not negotiated. |
210 return 0.0; | 215 return 0.0; |
211 | 216 |
212 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 217 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
213 m_timeOrigin, m_timing->sslStart()); | 218 m_timeOrigin, timing->sslStart()); |
214 } | 219 } |
215 | 220 |
216 DOMHighResTimeStamp PerformanceResourceTiming::requestStart() const { | 221 DOMHighResTimeStamp PerformanceResourceTiming::requestStart() const { |
217 if (!m_allowTimingDetails) | 222 if (!allowTimingDetails()) |
218 return 0.0; | 223 return 0.0; |
219 | 224 ResourceLoadTiming* timing = resourceLoadTiming(); |
220 if (!m_timing) | 225 if (!timing) |
221 return connectEnd(); | 226 return connectEnd(); |
222 | 227 |
223 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 228 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
224 m_timeOrigin, m_timing->sendStart()); | 229 m_timeOrigin, timing->sendStart()); |
225 } | 230 } |
226 | 231 |
227 DOMHighResTimeStamp PerformanceResourceTiming::responseStart() const { | 232 DOMHighResTimeStamp PerformanceResourceTiming::responseStart() const { |
228 if (!m_allowTimingDetails) | 233 if (!allowTimingDetails()) |
229 return 0.0; | 234 return 0.0; |
230 | 235 ResourceLoadTiming* timing = resourceLoadTiming(); |
231 if (!m_timing) | 236 if (!timing) |
232 return requestStart(); | 237 return requestStart(); |
233 | 238 |
234 // FIXME: This number isn't exactly correct. See the notes in | 239 // FIXME: This number isn't exactly correct. See the notes in |
235 // PerformanceTiming::responseStart(). | 240 // PerformanceTiming::responseStart(). |
236 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( | 241 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
237 m_timeOrigin, m_timing->receiveHeadersEnd()); | 242 m_timeOrigin, timing->receiveHeadersEnd()); |
238 } | 243 } |
239 | 244 |
240 DOMHighResTimeStamp PerformanceResourceTiming::responseEnd() const { | 245 DOMHighResTimeStamp PerformanceResourceTiming::responseEnd() const { |
241 if (!m_finishTime) | 246 if (!m_finishTime) |
242 return responseStart(); | 247 return responseStart(); |
243 | 248 |
244 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 249 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, |
245 m_finishTime); | 250 m_finishTime); |
246 } | 251 } |
247 | 252 |
248 unsigned long long PerformanceResourceTiming::transferSize() const { | 253 unsigned long long PerformanceResourceTiming::transferSize() const { |
249 if (!m_allowTimingDetails) | 254 if (!allowTimingDetails()) |
250 return 0; | 255 return 0; |
251 | 256 |
252 return m_transferSize; | 257 return getTransferSize(); |
253 } | 258 } |
254 | 259 |
255 unsigned long long PerformanceResourceTiming::encodedBodySize() const { | 260 unsigned long long PerformanceResourceTiming::encodedBodySize() const { |
256 if (!m_allowTimingDetails) | 261 if (!allowTimingDetails()) |
257 return 0; | 262 return 0; |
258 | 263 |
259 return m_encodedBodySize; | 264 return getEncodedBodySize(); |
260 } | 265 } |
261 | 266 |
262 unsigned long long PerformanceResourceTiming::decodedBodySize() const { | 267 unsigned long long PerformanceResourceTiming::decodedBodySize() const { |
263 if (!m_allowTimingDetails) | 268 if (!allowTimingDetails()) |
264 return 0; | 269 return 0; |
265 | 270 |
266 return m_decodedBodySize; | 271 return getDecodedBodySize(); |
267 } | 272 } |
268 | 273 |
269 void PerformanceResourceTiming::buildJSONValue(V8ObjectBuilder& builder) const { | 274 void PerformanceResourceTiming::buildJSONValue(V8ObjectBuilder& builder) const { |
270 PerformanceEntry::buildJSONValue(builder); | 275 PerformanceEntry::buildJSONValue(builder); |
271 builder.addString("initiatorType", initiatorType()); | 276 builder.addString("initiatorType", initiatorType()); |
272 builder.addNumber("workerStart", workerStart()); | 277 builder.addNumber("workerStart", workerStart()); |
273 builder.addNumber("redirectStart", redirectStart()); | 278 builder.addNumber("redirectStart", redirectStart()); |
274 builder.addNumber("redirectEnd", redirectEnd()); | 279 builder.addNumber("redirectEnd", redirectEnd()); |
275 builder.addNumber("fetchStart", fetchStart()); | 280 builder.addNumber("fetchStart", fetchStart()); |
276 builder.addNumber("domainLookupStart", domainLookupStart()); | 281 builder.addNumber("domainLookupStart", domainLookupStart()); |
277 builder.addNumber("domainLookupEnd", domainLookupEnd()); | 282 builder.addNumber("domainLookupEnd", domainLookupEnd()); |
278 builder.addNumber("connectStart", connectStart()); | 283 builder.addNumber("connectStart", connectStart()); |
279 builder.addNumber("connectEnd", connectEnd()); | 284 builder.addNumber("connectEnd", connectEnd()); |
280 builder.addNumber("secureConnectionStart", secureConnectionStart()); | 285 builder.addNumber("secureConnectionStart", secureConnectionStart()); |
281 builder.addNumber("requestStart", requestStart()); | 286 builder.addNumber("requestStart", requestStart()); |
282 builder.addNumber("responseStart", responseStart()); | 287 builder.addNumber("responseStart", responseStart()); |
283 builder.addNumber("responseEnd", responseEnd()); | 288 builder.addNumber("responseEnd", responseEnd()); |
284 builder.addNumber("transferSize", transferSize()); | 289 builder.addNumber("transferSize", transferSize()); |
285 builder.addNumber("encodedBodySize", encodedBodySize()); | 290 builder.addNumber("encodedBodySize", encodedBodySize()); |
286 builder.addNumber("decodedBodySize", decodedBodySize()); | 291 builder.addNumber("decodedBodySize", decodedBodySize()); |
287 } | 292 } |
288 | 293 |
289 } // namespace blink | 294 } // namespace blink |
OLD | NEW |