| 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/loader/fetch/ResourceRequest.h" | 36 #include "platform/loader/fetch/ResourceRequest.h" |
| 37 #include "platform/loader/fetch/ResourceResponse.h" | 37 #include "platform/loader/fetch/ResourceResponse.h" |
| 38 #include "platform/loader/fetch/ResourceTimingInfo.h" | 38 #include "platform/loader/fetch/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_timing) | 143 ResourceLoadTiming* timing = resourceLoadTiming(); |
| 144 if (!timing) |
| 140 return PerformanceEntry::startTime(); | 145 return PerformanceEntry::startTime(); |
| 141 | 146 |
| 142 if (m_lastRedirectEndTime) { | 147 if (m_lastRedirectEndTime) { |
| 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 |