| 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 21 matching lines...) Expand all Loading... |
| 32 #include "core/timing/PerformanceResourceTiming.h" | 32 #include "core/timing/PerformanceResourceTiming.h" |
| 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 // TODO(majidvp): Should return DOMHighResTimeStamp type instead | |
| 43 static double monotonicTimeToDOMHighResTimeStamp(double timeOrigin, | |
| 44 double seconds) { | |
| 45 ASSERT(seconds >= 0.0); | |
| 46 if (!seconds || !timeOrigin) | |
| 47 return 0.0; | |
| 48 return PerformanceBase::clampTimeResolution(seconds - timeOrigin) * 1000.0; | |
| 49 } | |
| 50 | |
| 51 PerformanceResourceTiming::PerformanceResourceTiming( | 42 PerformanceResourceTiming::PerformanceResourceTiming( |
| 52 const AtomicString& initiatorType, | 43 const AtomicString& initiatorType, |
| 53 double timeOrigin, | 44 double timeOrigin, |
| 54 ResourceLoadTiming* timing, | 45 ResourceLoadTiming* timing, |
| 55 double lastRedirectEndTime, | 46 double lastRedirectEndTime, |
| 56 double finishTime, | 47 double finishTime, |
| 57 unsigned long long transferSize, | 48 unsigned long long transferSize, |
| 58 unsigned long long encodedBodyLength, | 49 unsigned long long encodedBodyLength, |
| 59 unsigned long long decodedBodyLength, | 50 unsigned long long decodedBodyLength, |
| 60 bool didReuseConnection, | 51 bool didReuseConnection, |
| 61 bool allowTimingDetails, | 52 bool allowTimingDetails, |
| 62 bool allowRedirectDetails, | 53 bool allowRedirectDetails, |
| 63 const String& name, | 54 const String& name, |
| 64 const String& entryType, | 55 const String& entryType, |
| 65 double startTime) | 56 double startTime) |
| 66 : PerformanceEntry( | 57 : PerformanceEntry( |
| 67 name, | 58 name, |
| 68 entryType, | 59 entryType, |
| 69 monotonicTimeToDOMHighResTimeStamp(timeOrigin, startTime), | 60 PerformanceBase::monotonicTimeToDOMHighResTimeStamp(timeOrigin, |
| 70 monotonicTimeToDOMHighResTimeStamp(timeOrigin, finishTime)), | 61 startTime), |
| 62 PerformanceBase::monotonicTimeToDOMHighResTimeStamp(timeOrigin, |
| 63 finishTime)), |
| 71 m_initiatorType(initiatorType), | 64 m_initiatorType(initiatorType), |
| 72 m_timeOrigin(timeOrigin), | 65 m_timeOrigin(timeOrigin), |
| 73 m_timing(timing), | 66 m_timing(timing), |
| 74 m_lastRedirectEndTime(lastRedirectEndTime), | 67 m_lastRedirectEndTime(lastRedirectEndTime), |
| 75 m_finishTime(finishTime), | 68 m_finishTime(finishTime), |
| 76 m_transferSize(transferSize), | 69 m_transferSize(transferSize), |
| 77 m_encodedBodySize(encodedBodyLength), | 70 m_encodedBodySize(encodedBodyLength), |
| 78 m_decodedBodySize(decodedBodyLength), | 71 m_decodedBodySize(decodedBodyLength), |
| 79 m_didReuseConnection(didReuseConnection), | 72 m_didReuseConnection(didReuseConnection), |
| 80 m_allowTimingDetails(allowTimingDetails), | 73 m_allowTimingDetails(allowTimingDetails), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 101 info.initialURL().getString(), | 94 info.initialURL().getString(), |
| 102 "resource", | 95 "resource", |
| 103 startTime) {} | 96 startTime) {} |
| 104 | 97 |
| 105 PerformanceResourceTiming::~PerformanceResourceTiming() {} | 98 PerformanceResourceTiming::~PerformanceResourceTiming() {} |
| 106 | 99 |
| 107 AtomicString PerformanceResourceTiming::initiatorType() const { | 100 AtomicString PerformanceResourceTiming::initiatorType() const { |
| 108 return m_initiatorType; | 101 return m_initiatorType; |
| 109 } | 102 } |
| 110 | 103 |
| 111 double PerformanceResourceTiming::workerStart() const { | 104 DOMHighResTimeStamp PerformanceResourceTiming::workerStart() const { |
| 112 if (!m_timing || m_timing->workerStart() == 0.0) | 105 if (!m_timing || m_timing->workerStart() == 0.0) |
| 113 return 0.0; | 106 return 0.0; |
| 114 | 107 |
| 115 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 108 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 116 m_timing->workerStart()); | 109 m_timeOrigin, m_timing->workerStart()); |
| 117 } | 110 } |
| 118 | 111 |
| 119 double PerformanceResourceTiming::workerReady() const { | 112 DOMHighResTimeStamp PerformanceResourceTiming::workerReady() const { |
| 120 if (!m_timing || m_timing->workerReady() == 0.0) | 113 if (!m_timing || m_timing->workerReady() == 0.0) |
| 121 return 0.0; | 114 return 0.0; |
| 122 | 115 |
| 123 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 116 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 124 m_timing->workerReady()); | 117 m_timeOrigin, m_timing->workerReady()); |
| 125 } | 118 } |
| 126 | 119 |
| 127 double PerformanceResourceTiming::redirectStart() const { | 120 DOMHighResTimeStamp PerformanceResourceTiming::redirectStart() const { |
| 128 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) | 121 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) |
| 129 return 0.0; | 122 return 0.0; |
| 130 | 123 |
| 131 if (double workerReadyTime = workerReady()) | 124 if (DOMHighResTimeStamp workerReadyTime = workerReady()) |
| 132 return workerReadyTime; | 125 return workerReadyTime; |
| 133 | 126 |
| 134 return PerformanceEntry::startTime(); | 127 return PerformanceEntry::startTime(); |
| 135 } | 128 } |
| 136 | 129 |
| 137 double PerformanceResourceTiming::redirectEnd() const { | 130 DOMHighResTimeStamp PerformanceResourceTiming::redirectEnd() const { |
| 138 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) | 131 if (!m_lastRedirectEndTime || !m_allowRedirectDetails) |
| 139 return 0.0; | 132 return 0.0; |
| 140 | 133 |
| 141 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 134 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 142 m_lastRedirectEndTime); | 135 m_timeOrigin, m_lastRedirectEndTime); |
| 143 } | 136 } |
| 144 | 137 |
| 145 double PerformanceResourceTiming::fetchStart() const { | 138 DOMHighResTimeStamp PerformanceResourceTiming::fetchStart() const { |
| 146 if (m_lastRedirectEndTime) { | 139 if (m_lastRedirectEndTime) { |
| 147 // FIXME: ASSERT(m_timing) should be in constructor once timeticks of | 140 // FIXME: ASSERT(m_timing) should be in constructor once timeticks of |
| 148 // AppCache is exposed from chrome network stack, crbug/251100 | 141 // AppCache is exposed from chrome network stack, crbug/251100 |
| 149 ASSERT(m_timing); | 142 ASSERT(m_timing); |
| 150 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 143 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 151 m_timing->requestTime()); | 144 m_timeOrigin, m_timing->requestTime()); |
| 152 } | 145 } |
| 153 | 146 |
| 154 if (double workerReadyTime = workerReady()) | 147 if (DOMHighResTimeStamp workerReadyTime = workerReady()) |
| 155 return workerReadyTime; | 148 return workerReadyTime; |
| 156 | 149 |
| 157 return PerformanceEntry::startTime(); | 150 return PerformanceEntry::startTime(); |
| 158 } | 151 } |
| 159 | 152 |
| 160 double PerformanceResourceTiming::domainLookupStart() const { | 153 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupStart() const { |
| 161 if (!m_allowTimingDetails) | 154 if (!m_allowTimingDetails) |
| 162 return 0.0; | 155 return 0.0; |
| 163 | 156 |
| 164 if (!m_timing || m_timing->dnsStart() == 0.0) | 157 if (!m_timing || m_timing->dnsStart() == 0.0) |
| 165 return fetchStart(); | 158 return fetchStart(); |
| 166 | 159 |
| 167 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, m_timing->dnsStart()); | 160 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 161 m_timeOrigin, m_timing->dnsStart()); |
| 168 } | 162 } |
| 169 | 163 |
| 170 double PerformanceResourceTiming::domainLookupEnd() const { | 164 DOMHighResTimeStamp PerformanceResourceTiming::domainLookupEnd() const { |
| 171 if (!m_allowTimingDetails) | 165 if (!m_allowTimingDetails) |
| 172 return 0.0; | 166 return 0.0; |
| 173 | 167 |
| 174 if (!m_timing || m_timing->dnsEnd() == 0.0) | 168 if (!m_timing || m_timing->dnsEnd() == 0.0) |
| 175 return domainLookupStart(); | 169 return domainLookupStart(); |
| 176 | 170 |
| 177 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, m_timing->dnsEnd()); | 171 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 172 m_timeOrigin, m_timing->dnsEnd()); |
| 178 } | 173 } |
| 179 | 174 |
| 180 double PerformanceResourceTiming::connectStart() const { | 175 DOMHighResTimeStamp PerformanceResourceTiming::connectStart() const { |
| 181 if (!m_allowTimingDetails) | 176 if (!m_allowTimingDetails) |
| 182 return 0.0; | 177 return 0.0; |
| 183 | 178 |
| 184 // connectStart will be zero when a network request is not made. | 179 // connectStart will be zero when a network request is not made. |
| 185 if (!m_timing || m_timing->connectStart() == 0.0 || m_didReuseConnection) | 180 if (!m_timing || m_timing->connectStart() == 0.0 || m_didReuseConnection) |
| 186 return domainLookupEnd(); | 181 return domainLookupEnd(); |
| 187 | 182 |
| 188 // connectStart includes any DNS time, so we may need to trim that off. | 183 // connectStart includes any DNS time, so we may need to trim that off. |
| 189 double connectStart = m_timing->connectStart(); | 184 double connectStart = m_timing->connectStart(); |
| 190 if (m_timing->dnsEnd() > 0.0) | 185 if (m_timing->dnsEnd() > 0.0) |
| 191 connectStart = m_timing->dnsEnd(); | 186 connectStart = m_timing->dnsEnd(); |
| 192 | 187 |
| 193 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, connectStart); | 188 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, |
| 189 connectStart); |
| 194 } | 190 } |
| 195 | 191 |
| 196 double PerformanceResourceTiming::connectEnd() const { | 192 DOMHighResTimeStamp PerformanceResourceTiming::connectEnd() const { |
| 197 if (!m_allowTimingDetails) | 193 if (!m_allowTimingDetails) |
| 198 return 0.0; | 194 return 0.0; |
| 199 | 195 |
| 200 // connectStart will be zero when a network request is not made. | 196 // connectStart will be zero when a network request is not made. |
| 201 if (!m_timing || m_timing->connectEnd() == 0.0 || m_didReuseConnection) | 197 if (!m_timing || m_timing->connectEnd() == 0.0 || m_didReuseConnection) |
| 202 return connectStart(); | 198 return connectStart(); |
| 203 | 199 |
| 204 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 200 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 205 m_timing->connectEnd()); | 201 m_timeOrigin, m_timing->connectEnd()); |
| 206 } | 202 } |
| 207 | 203 |
| 208 double PerformanceResourceTiming::secureConnectionStart() const { | 204 DOMHighResTimeStamp PerformanceResourceTiming::secureConnectionStart() const { |
| 209 if (!m_allowTimingDetails) | 205 if (!m_allowTimingDetails) |
| 210 return 0.0; | 206 return 0.0; |
| 211 | 207 |
| 212 if (!m_timing || | 208 if (!m_timing || |
| 213 m_timing->sslStart() == 0.0) // Secure connection not negotiated. | 209 m_timing->sslStart() == 0.0) // Secure connection not negotiated. |
| 214 return 0.0; | 210 return 0.0; |
| 215 | 211 |
| 216 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, m_timing->sslStart()); | 212 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 213 m_timeOrigin, m_timing->sslStart()); |
| 217 } | 214 } |
| 218 | 215 |
| 219 double PerformanceResourceTiming::requestStart() const { | 216 DOMHighResTimeStamp PerformanceResourceTiming::requestStart() const { |
| 220 if (!m_allowTimingDetails) | 217 if (!m_allowTimingDetails) |
| 221 return 0.0; | 218 return 0.0; |
| 222 | 219 |
| 223 if (!m_timing) | 220 if (!m_timing) |
| 224 return connectEnd(); | 221 return connectEnd(); |
| 225 | 222 |
| 226 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 223 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 227 m_timing->sendStart()); | 224 m_timeOrigin, m_timing->sendStart()); |
| 228 } | 225 } |
| 229 | 226 |
| 230 double PerformanceResourceTiming::responseStart() const { | 227 DOMHighResTimeStamp PerformanceResourceTiming::responseStart() const { |
| 231 if (!m_allowTimingDetails) | 228 if (!m_allowTimingDetails) |
| 232 return 0.0; | 229 return 0.0; |
| 233 | 230 |
| 234 if (!m_timing) | 231 if (!m_timing) |
| 235 return requestStart(); | 232 return requestStart(); |
| 236 | 233 |
| 237 // FIXME: This number isn't exactly correct. See the notes in | 234 // FIXME: This number isn't exactly correct. See the notes in |
| 238 // PerformanceTiming::responseStart(). | 235 // PerformanceTiming::responseStart(). |
| 239 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 236 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp( |
| 240 m_timing->receiveHeadersEnd()); | 237 m_timeOrigin, m_timing->receiveHeadersEnd()); |
| 241 } | 238 } |
| 242 | 239 |
| 243 double PerformanceResourceTiming::responseEnd() const { | 240 DOMHighResTimeStamp PerformanceResourceTiming::responseEnd() const { |
| 244 if (!m_finishTime) | 241 if (!m_finishTime) |
| 245 return responseStart(); | 242 return responseStart(); |
| 246 | 243 |
| 247 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, m_finishTime); | 244 return PerformanceBase::monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, |
| 245 m_finishTime); |
| 248 } | 246 } |
| 249 | 247 |
| 250 unsigned long long PerformanceResourceTiming::transferSize() const { | 248 unsigned long long PerformanceResourceTiming::transferSize() const { |
| 251 if (!m_allowTimingDetails) | 249 if (!m_allowTimingDetails) |
| 252 return 0; | 250 return 0; |
| 253 | 251 |
| 254 return m_transferSize; | 252 return m_transferSize; |
| 255 } | 253 } |
| 256 | 254 |
| 257 unsigned long long PerformanceResourceTiming::encodedBodySize() const { | 255 unsigned long long PerformanceResourceTiming::encodedBodySize() const { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 282 builder.addNumber("secureConnectionStart", secureConnectionStart()); | 280 builder.addNumber("secureConnectionStart", secureConnectionStart()); |
| 283 builder.addNumber("requestStart", requestStart()); | 281 builder.addNumber("requestStart", requestStart()); |
| 284 builder.addNumber("responseStart", responseStart()); | 282 builder.addNumber("responseStart", responseStart()); |
| 285 builder.addNumber("responseEnd", responseEnd()); | 283 builder.addNumber("responseEnd", responseEnd()); |
| 286 builder.addNumber("transferSize", transferSize()); | 284 builder.addNumber("transferSize", transferSize()); |
| 287 builder.addNumber("encodedBodySize", encodedBodySize()); | 285 builder.addNumber("encodedBodySize", encodedBodySize()); |
| 288 builder.addNumber("decodedBodySize", decodedBodySize()); | 286 builder.addNumber("decodedBodySize", decodedBodySize()); |
| 289 } | 287 } |
| 290 | 288 |
| 291 } // namespace blink | 289 } // namespace blink |
| OLD | NEW |