Chromium Code Reviews| 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 18 matching lines...) Expand all Loading... | |
| 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 30 */ | 30 */ |
| 31 | 31 |
| 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 #include <regex> | |
| 39 | 40 |
| 40 namespace blink { | 41 namespace blink { |
| 41 | 42 |
| 42 // TODO(majidvp): Should return DOMHighResTimeStamp type instead | 43 // TODO(majidvp): Should return DOMHighResTimeStamp type instead |
| 43 static double monotonicTimeToDOMHighResTimeStamp(double timeOrigin, | 44 static double monotonicTimeToDOMHighResTimeStamp(double timeOrigin, |
| 44 double seconds) { | 45 double seconds) { |
| 45 ASSERT(seconds >= 0.0); | 46 ASSERT(seconds >= 0.0); |
| 46 if (!seconds || !timeOrigin) | 47 if (!seconds || !timeOrigin) |
| 47 return 0.0; | 48 return 0.0; |
| 48 return PerformanceBase::clampTimeResolution(seconds - timeOrigin) * 1000.0; | 49 return PerformanceBase::clampTimeResolution(seconds - timeOrigin) * 1000.0; |
| 49 } | 50 } |
| 50 | 51 |
| 51 PerformanceResourceTiming::PerformanceResourceTiming( | 52 PerformanceResourceTiming::PerformanceResourceTiming( |
| 52 const ResourceTimingInfo& info, | 53 const ResourceTimingInfo& info, |
| 53 double timeOrigin, | 54 double timeOrigin, |
| 54 double startTime, | 55 double startTime, |
| 55 double lastRedirectEndTime, | 56 double lastRedirectEndTime, |
| 56 bool allowTimingDetails, | 57 bool allowTimingDetails, |
| 57 bool allowRedirectDetails) | 58 bool allowRedirectDetails) |
| 58 : PerformanceEntry( | 59 : PerformanceEntry( |
| 59 info.initialURL().getString(), | 60 info.initialURL().getString(), |
| 60 "resource", | 61 "resource", |
| 61 monotonicTimeToDOMHighResTimeStamp(timeOrigin, startTime), | 62 monotonicTimeToDOMHighResTimeStamp(timeOrigin, startTime), |
| 62 monotonicTimeToDOMHighResTimeStamp(timeOrigin, | 63 monotonicTimeToDOMHighResTimeStamp(timeOrigin, |
| 63 info.loadFinishTime())), | 64 info.loadFinishTime())), |
| 64 m_initiatorType(info.initiatorType()), | 65 m_initiatorType(info.initiatorType()), |
| 66 m_nextHopProtocol(info.finalResponse().alpnNegotiatedProtocol()), | |
| 67 m_connectionInfo(info.finalResponse().connectionInfo()), | |
| 65 m_timeOrigin(timeOrigin), | 68 m_timeOrigin(timeOrigin), |
| 66 m_timing(info.finalResponse().resourceLoadTiming()), | 69 m_timing(info.finalResponse().resourceLoadTiming()), |
| 67 m_lastRedirectEndTime(lastRedirectEndTime), | 70 m_lastRedirectEndTime(lastRedirectEndTime), |
| 68 m_finishTime(info.loadFinishTime()), | 71 m_finishTime(info.loadFinishTime()), |
| 69 m_transferSize(info.transferSize()), | 72 m_transferSize(info.transferSize()), |
| 70 m_encodedBodySize(info.finalResponse().encodedBodyLength()), | 73 m_encodedBodySize(info.finalResponse().encodedBodyLength()), |
| 71 m_decodedBodySize(info.finalResponse().decodedBodyLength()), | 74 m_decodedBodySize(info.finalResponse().decodedBodyLength()), |
| 72 m_didReuseConnection(info.finalResponse().connectionReused()), | 75 m_didReuseConnection(info.finalResponse().connectionReused()), |
| 73 m_allowTimingDetails(allowTimingDetails), | 76 m_allowTimingDetails(allowTimingDetails), |
| 74 m_allowRedirectDetails(allowRedirectDetails) {} | 77 m_allowRedirectDetails(allowRedirectDetails) {} |
| 75 | 78 |
| 76 PerformanceResourceTiming::~PerformanceResourceTiming() {} | 79 PerformanceResourceTiming::~PerformanceResourceTiming() {} |
| 77 | 80 |
| 78 AtomicString PerformanceResourceTiming::initiatorType() const { | 81 AtomicString PerformanceResourceTiming::initiatorType() const { |
| 79 return m_initiatorType; | 82 return m_initiatorType; |
| 80 } | 83 } |
| 81 | 84 |
| 85 AtomicString PerformanceResourceTiming::produceNextHopProtocol( | |
| 86 const AtomicString& alpnNegotiatedProtocol, | |
| 87 const AtomicString& connectionInfo) { | |
| 88 AtomicString returnedProtocol = alpnNegotiatedProtocol == "unknown" | |
| 89 ? connectionInfo | |
| 90 : alpnNegotiatedProtocol; | |
| 91 returnedProtocol = | |
|
panicker
2016/10/25 23:53:26
Add a comment explaining this
sunjian
2016/10/26 19:56:52
Done.
| |
| 92 returnedProtocol == "unknown" ? "http/1.1" : returnedProtocol; | |
| 93 std::string returnedProtocolCopy = returnedProtocol.ascii().data(); | |
|
panicker
2016/10/25 23:53:26
std::string and std::regex are not allowed in Sour
sunjian
2016/10/26 19:56:52
Done.
| |
| 94 if (std::regex_match(returnedProtocolCopy, std::regex("(quic/)(.*)"))) { | |
| 95 returnedProtocol = | |
| 96 ("http2/+" + | |
| 97 returnedProtocolCopy.substr(0, returnedProtocolCopy.find('+'))) | |
| 98 .c_str(); | |
| 99 } | |
| 100 return returnedProtocol; | |
| 101 } | |
| 102 | |
| 103 AtomicString PerformanceResourceTiming::nextHopProtocol() const { | |
| 104 return PerformanceResourceTiming::produceNextHopProtocol(m_nextHopProtocol, | |
| 105 m_connectionInfo); | |
| 106 } | |
| 107 | |
| 82 double PerformanceResourceTiming::workerStart() const { | 108 double PerformanceResourceTiming::workerStart() const { |
| 83 if (!m_timing || m_timing->workerStart() == 0.0) | 109 if (!m_timing || m_timing->workerStart() == 0.0) |
| 84 return 0.0; | 110 return 0.0; |
| 85 | 111 |
| 86 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, | 112 return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, |
| 87 m_timing->workerStart()); | 113 m_timing->workerStart()); |
| 88 } | 114 } |
| 89 | 115 |
| 90 double PerformanceResourceTiming::workerReady() const { | 116 double PerformanceResourceTiming::workerReady() const { |
| 91 if (!m_timing || m_timing->workerReady() == 0.0) | 117 if (!m_timing || m_timing->workerReady() == 0.0) |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 unsigned long long PerformanceResourceTiming::decodedBodySize() const { | 261 unsigned long long PerformanceResourceTiming::decodedBodySize() const { |
| 236 if (!m_allowTimingDetails) | 262 if (!m_allowTimingDetails) |
| 237 return 0; | 263 return 0; |
| 238 | 264 |
| 239 return m_decodedBodySize; | 265 return m_decodedBodySize; |
| 240 } | 266 } |
| 241 | 267 |
| 242 void PerformanceResourceTiming::buildJSONValue(V8ObjectBuilder& builder) const { | 268 void PerformanceResourceTiming::buildJSONValue(V8ObjectBuilder& builder) const { |
| 243 PerformanceEntry::buildJSONValue(builder); | 269 PerformanceEntry::buildJSONValue(builder); |
| 244 builder.addString("initiatorType", initiatorType()); | 270 builder.addString("initiatorType", initiatorType()); |
| 271 builder.addString("nextHopProtocol", nextHopProtocol()); | |
| 245 builder.addNumber("workerStart", workerStart()); | 272 builder.addNumber("workerStart", workerStart()); |
| 246 builder.addNumber("redirectStart", redirectStart()); | 273 builder.addNumber("redirectStart", redirectStart()); |
| 247 builder.addNumber("redirectEnd", redirectEnd()); | 274 builder.addNumber("redirectEnd", redirectEnd()); |
| 248 builder.addNumber("fetchStart", fetchStart()); | 275 builder.addNumber("fetchStart", fetchStart()); |
| 249 builder.addNumber("domainLookupStart", domainLookupStart()); | 276 builder.addNumber("domainLookupStart", domainLookupStart()); |
| 250 builder.addNumber("domainLookupEnd", domainLookupEnd()); | 277 builder.addNumber("domainLookupEnd", domainLookupEnd()); |
| 251 builder.addNumber("connectStart", connectStart()); | 278 builder.addNumber("connectStart", connectStart()); |
| 252 builder.addNumber("connectEnd", connectEnd()); | 279 builder.addNumber("connectEnd", connectEnd()); |
| 253 builder.addNumber("secureConnectionStart", secureConnectionStart()); | 280 builder.addNumber("secureConnectionStart", secureConnectionStart()); |
| 254 builder.addNumber("requestStart", requestStart()); | 281 builder.addNumber("requestStart", requestStart()); |
| 255 builder.addNumber("responseStart", responseStart()); | 282 builder.addNumber("responseStart", responseStart()); |
| 256 builder.addNumber("responseEnd", responseEnd()); | 283 builder.addNumber("responseEnd", responseEnd()); |
| 257 builder.addNumber("transferSize", transferSize()); | 284 builder.addNumber("transferSize", transferSize()); |
| 258 builder.addNumber("encodedBodySize", encodedBodySize()); | 285 builder.addNumber("encodedBodySize", encodedBodySize()); |
| 259 builder.addNumber("decodedBodySize", decodedBodySize()); | 286 builder.addNumber("decodedBodySize", decodedBodySize()); |
| 260 } | 287 } |
| 261 | 288 |
| 262 } // namespace blink | 289 } // namespace blink |
| OLD | NEW |