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 |