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 "config.h" | 32 #include "config.h" |
| 33 #include "core/page/PerformanceResourceTiming.h" | 33 #include "core/page/PerformanceResourceTiming.h" |
| 34 | 34 |
| 35 #include <wtf/Vector.h> | 35 #include <wtf/Vector.h> |
| 36 #include "core/dom/Document.h" | 36 #include "core/dom/Document.h" |
| 37 #include "core/loader/DocumentLoadTiming.h" | 37 #include "core/loader/DocumentLoadTiming.h" |
| 38 #include "core/loader/DocumentLoader.h" | 38 #include "core/loader/DocumentLoader.h" |
| 39 #include "core/page/ResourceTimingInfo.h" | |
| 39 #include "core/platform/KURL.h" | 40 #include "core/platform/KURL.h" |
| 40 #include "core/platform/network/ResourceRequest.h" | 41 #include "core/platform/network/ResourceRequest.h" |
| 41 #include "core/platform/network/ResourceResponse.h" | 42 #include "core/platform/network/ResourceResponse.h" |
| 42 #include "weborigin/SecurityOrigin.h" | |
| 43 | 43 |
| 44 namespace WebCore { | 44 namespace WebCore { |
| 45 | 45 |
| 46 static double monotonicTimeToDocumentMilliseconds(Document* document, double sec onds) | 46 static double monotonicTimeToDocumentMilliseconds(Document* document, double sec onds) |
| 47 { | 47 { |
| 48 ASSERT(seconds >= 0.0); | 48 ASSERT(seconds >= 0.0); |
| 49 return document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(se conds) * 1000.0; | 49 return document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(se conds) * 1000.0; |
| 50 } | 50 } |
| 51 | 51 |
| 52 static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r equestingDocument) | 52 PerformanceResourceTiming::PerformanceResourceTiming(const ResourceTimingInfo& i nfo, Document* requestingDocument, double startTime, double lastRedirectEndTime, bool allowTimingFetch, bool allowTimingRedirect) |
| 53 { | 53 : PerformanceEntry(info.initialRequest().url().string(), "resource", monoton icTimeToDocumentMilliseconds(requestingDocument, startTime), monotonicTimeToDocu mentMilliseconds(requestingDocument, info.loadFinishTime())) |
| 54 AtomicallyInitializedStatic(AtomicString&, timingAllowOrigin = *new AtomicSt ring("timing-allow-origin")); | 54 , m_initiatorType(info.initiatorType()) |
| 55 | 55 , m_timing(info.finalResponse().resourceLoadTiming()) |
| 56 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url( )); | 56 , m_lastRedirectEndTime(lastRedirectEndTime) |
| 57 if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin( ))) | 57 , m_finishTime(info.loadFinishTime()) |
| 58 return true; | 58 , m_didReuseConnection(info.finalResponse().connectionReused()) |
| 59 | 59 , m_allowTimingFetch(allowTimingFetch) |
| 60 const String& timingAllowOriginString = response.httpHeaderField(timingAllow Origin); | 60 , m_allowTimingRedirect(allowTimingRedirect) |
| 61 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin String, "null")) | |
| 62 return false; | |
| 63 | |
| 64 if (timingAllowOriginString == "*") | |
| 65 return true; | |
| 66 | |
| 67 const String& securityOrigin = requestingDocument->securityOrigin()->toStrin g(); | |
| 68 Vector<String> timingAllowOrigins; | |
| 69 timingAllowOriginString.split(" ", timingAllowOrigins); | |
| 70 for (size_t i = 0; i < timingAllowOrigins.size(); ++i) | |
| 71 if (timingAllowOrigins[i] == securityOrigin) | |
| 72 return true; | |
| 73 | |
| 74 return false; | |
| 75 } | |
| 76 | |
| 77 PerformanceResourceTiming::PerformanceResourceTiming(const AtomicString& initiat orType, const ResourceRequest& request, const ResourceResponse& response, double initiationTime, double finishTime, Document* requestingDocument) | |
| 78 : PerformanceEntry(request.url().string(), "resource", monotonicTimeToDocume ntMilliseconds(requestingDocument, initiationTime), monotonicTimeToDocumentMilli seconds(requestingDocument, finishTime)) | |
| 79 , m_initiatorType(initiatorType) | |
| 80 , m_timing(response.resourceLoadTiming()) | |
| 81 , m_finishTime(finishTime) | |
| 82 , m_didReuseConnection(response.connectionReused()) | |
| 83 , m_shouldReportDetails(passesTimingAllowCheck(response, requestingDocument) ) | |
| 84 , m_requestingDocument(requestingDocument) | 61 , m_requestingDocument(requestingDocument) |
| 85 { | 62 { |
| 63 ASSERT(m_timing); | |
| 86 ScriptWrappable::init(this); | 64 ScriptWrappable::init(this); |
| 87 } | 65 } |
| 88 | 66 |
| 89 PerformanceResourceTiming::~PerformanceResourceTiming() | 67 PerformanceResourceTiming::~PerformanceResourceTiming() |
| 90 { | 68 { |
| 91 } | 69 } |
| 92 | 70 |
| 93 AtomicString PerformanceResourceTiming::initiatorType() const | 71 AtomicString PerformanceResourceTiming::initiatorType() const |
| 94 { | 72 { |
| 95 return m_initiatorType; | 73 return m_initiatorType; |
| 96 } | 74 } |
| 97 | 75 |
| 98 double PerformanceResourceTiming::redirectStart() const | 76 double PerformanceResourceTiming::redirectStart() const |
| 99 { | 77 { |
| 100 // FIXME: Need to track and report redirects for resources. | 78 if (!m_lastRedirectEndTime || !m_allowTimingRedirect) |
|
James Simonsen
2013/06/04 01:13:04
m_allowRedirectDetails sounds better.
Pan
2013/06/04 02:48:34
yep, thanks!
| |
| 101 if (!m_shouldReportDetails) | |
| 102 return 0.0; | 79 return 0.0; |
| 103 return 0; | 80 |
| 81 return PerformanceEntry::startTime(); | |
| 104 } | 82 } |
| 105 | 83 |
| 106 double PerformanceResourceTiming::redirectEnd() const | 84 double PerformanceResourceTiming::redirectEnd() const |
| 107 { | 85 { |
| 108 if (!m_shouldReportDetails) | 86 if (!m_lastRedirectEndTime || !m_allowTimingRedirect) |
| 109 return 0.0; | 87 return 0.0; |
| 110 return 0; | 88 |
| 89 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_las tRedirectEndTime); | |
| 111 } | 90 } |
| 112 | 91 |
| 113 double PerformanceResourceTiming::fetchStart() const | 92 double PerformanceResourceTiming::fetchStart() const |
| 114 { | 93 { |
| 115 // FIXME: This should be different depending on redirects. | 94 if (m_lastRedirectEndTime) |
| 116 return (startTime()); | 95 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m _timing->requestTime); |
| 96 | |
| 97 return PerformanceEntry::startTime(); | |
| 117 } | 98 } |
| 118 | 99 |
| 119 double PerformanceResourceTiming::domainLookupStart() const | 100 double PerformanceResourceTiming::domainLookupStart() const |
| 120 { | 101 { |
| 121 if (!m_shouldReportDetails) | 102 if (!m_allowTimingFetch) |
|
James Simonsen
2013/06/04 01:13:04
m_allowTimingDetails sounds better.
Pan
2013/06/04 02:48:34
yep, thanks!
| |
| 122 return 0.0; | 103 return 0.0; |
| 123 | 104 |
| 124 if (!m_timing || m_timing->dnsStart == 0.0) | 105 if (!m_timing || m_timing->dnsStart == 0.0) |
| 125 return fetchStart(); | 106 return fetchStart(); |
| 126 | 107 |
| 127 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsStart); | 108 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsStart); |
| 128 } | 109 } |
| 129 | 110 |
| 130 double PerformanceResourceTiming::domainLookupEnd() const | 111 double PerformanceResourceTiming::domainLookupEnd() const |
| 131 { | 112 { |
| 132 if (!m_shouldReportDetails) | 113 if (!m_allowTimingFetch) |
| 133 return 0.0; | 114 return 0.0; |
| 134 | 115 |
| 135 if (!m_timing || m_timing->dnsEnd == 0.0) | 116 if (!m_timing || m_timing->dnsEnd == 0.0) |
| 136 return domainLookupStart(); | 117 return domainLookupStart(); |
| 137 | 118 |
| 138 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsEnd); | 119 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsEnd); |
| 139 } | 120 } |
| 140 | 121 |
| 141 double PerformanceResourceTiming::connectStart() const | 122 double PerformanceResourceTiming::connectStart() const |
| 142 { | 123 { |
| 143 if (!m_shouldReportDetails) | 124 if (!m_allowTimingFetch) |
| 144 return 0.0; | 125 return 0.0; |
| 145 | 126 |
| 146 // connectStart will be zero when a network request is not made. | 127 // connectStart will be zero when a network request is not made. |
| 147 if (!m_timing || m_timing->connectStart == 0.0 || m_didReuseConnection) | 128 if (!m_timing || m_timing->connectStart == 0.0 || m_didReuseConnection) |
| 148 return domainLookupEnd(); | 129 return domainLookupEnd(); |
| 149 | 130 |
| 150 // connectStart includes any DNS time, so we may need to trim that off. | 131 // connectStart includes any DNS time, so we may need to trim that off. |
| 151 double connectStart = m_timing->connectStart; | 132 double connectStart = m_timing->connectStart; |
| 152 if (m_timing->dnsEnd > 0.0) | 133 if (m_timing->dnsEnd > 0.0) |
| 153 connectStart = m_timing->dnsEnd; | 134 connectStart = m_timing->dnsEnd; |
| 154 | 135 |
| 155 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), conne ctStart); | 136 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), conne ctStart); |
| 156 } | 137 } |
| 157 | 138 |
| 158 double PerformanceResourceTiming::connectEnd() const | 139 double PerformanceResourceTiming::connectEnd() const |
| 159 { | 140 { |
| 160 if (!m_shouldReportDetails) | 141 if (!m_allowTimingFetch) |
| 161 return 0.0; | 142 return 0.0; |
| 162 | 143 |
| 163 // connectStart will be zero when a network request is not made. | 144 // connectStart will be zero when a network request is not made. |
| 164 if (!m_timing || m_timing->connectEnd == 0.0 || m_didReuseConnection) | 145 if (!m_timing || m_timing->connectEnd == 0.0 || m_didReuseConnection) |
| 165 return connectStart(); | 146 return connectStart(); |
| 166 | 147 |
| 167 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->connectEnd); | 148 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->connectEnd); |
| 168 } | 149 } |
| 169 | 150 |
| 170 double PerformanceResourceTiming::secureConnectionStart() const | 151 double PerformanceResourceTiming::secureConnectionStart() const |
| 171 { | 152 { |
| 172 if (!m_shouldReportDetails) | 153 if (!m_allowTimingFetch) |
| 173 return 0.0; | 154 return 0.0; |
| 174 | 155 |
| 175 if (!m_timing || m_timing->sslStart == 0.0) // Secure connection not negotia ted. | 156 if (!m_timing || m_timing->sslStart == 0.0) // Secure connection not negotia ted. |
| 176 return 0.0; | 157 return 0.0; |
| 177 | 158 |
| 178 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sslStart); | 159 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sslStart); |
| 179 } | 160 } |
| 180 | 161 |
| 181 double PerformanceResourceTiming::requestStart() const | 162 double PerformanceResourceTiming::requestStart() const |
| 182 { | 163 { |
| 183 if (!m_shouldReportDetails) | 164 if (!m_allowTimingFetch) |
| 184 return 0.0; | 165 return 0.0; |
| 185 | 166 |
| 186 if (!m_timing) | 167 if (!m_timing) |
| 187 return connectEnd(); | 168 return connectEnd(); |
| 188 | 169 |
| 189 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sendStart); | 170 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sendStart); |
| 190 } | 171 } |
| 191 | 172 |
| 192 double PerformanceResourceTiming::responseStart() const | 173 double PerformanceResourceTiming::responseStart() const |
| 193 { | 174 { |
| 194 if (!m_shouldReportDetails) | 175 if (!m_allowTimingFetch) |
| 195 return 0.0; | 176 return 0.0; |
| 196 | 177 |
| 197 if (!m_timing) | 178 if (!m_timing) |
| 198 return requestStart(); | 179 return requestStart(); |
| 199 | 180 |
| 200 // FIXME: This number isn't exactly correct. See the notes in PerformanceTim ing::responseStart(). | 181 // FIXME: This number isn't exactly correct. See the notes in PerformanceTim ing::responseStart(). |
| 201 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->receiveHeadersEnd); | 182 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->receiveHeadersEnd); |
| 202 } | 183 } |
| 203 | 184 |
| 204 double PerformanceResourceTiming::responseEnd() const | 185 double PerformanceResourceTiming::responseEnd() const |
| 205 { | 186 { |
| 206 if (!m_finishTime) | 187 if (!m_finishTime) |
| 207 return responseStart(); | 188 return responseStart(); |
| 208 | 189 |
| 209 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_fin ishTime); | 190 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_fin ishTime); |
| 210 } | 191 } |
| 211 | 192 |
| 212 } // namespace WebCore | 193 } // namespace WebCore |
| OLD | NEW |