OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 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 15 matching lines...) Expand all Loading... |
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
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/PerformanceBase.h" | 32 #include "core/timing/PerformanceBase.h" |
33 | 33 |
34 #include "core/dom/Document.h" | 34 #include "core/dom/Document.h" |
35 #include "core/events/Event.h" | 35 #include "core/events/Event.h" |
| 36 #include "core/frame/UseCounter.h" |
36 #include "core/timing/PerformanceCompositeTiming.h" | 37 #include "core/timing/PerformanceCompositeTiming.h" |
37 #include "core/timing/PerformanceObserver.h" | 38 #include "core/timing/PerformanceObserver.h" |
38 #include "core/timing/PerformanceRenderTiming.h" | 39 #include "core/timing/PerformanceRenderTiming.h" |
39 #include "core/timing/PerformanceResourceTiming.h" | 40 #include "core/timing/PerformanceResourceTiming.h" |
40 #include "core/timing/PerformanceUserTiming.h" | 41 #include "core/timing/PerformanceUserTiming.h" |
41 #include "platform/network/ResourceTimingInfo.h" | 42 #include "platform/network/ResourceTimingInfo.h" |
42 #include "platform/weborigin/SecurityOrigin.h" | 43 #include "platform/weborigin/SecurityOrigin.h" |
43 #include "wtf/CurrentTime.h" | 44 #include "wtf/CurrentTime.h" |
44 #include <algorithm> | 45 #include <algorithm> |
45 | 46 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 m_frameTimingBuffer.clear(); | 179 m_frameTimingBuffer.clear(); |
179 } | 180 } |
180 | 181 |
181 void PerformanceBase::setFrameTimingBufferSize(unsigned size) | 182 void PerformanceBase::setFrameTimingBufferSize(unsigned size) |
182 { | 183 { |
183 m_frameTimingBufferSize = size; | 184 m_frameTimingBufferSize = size; |
184 if (isFrameTimingBufferFull()) | 185 if (isFrameTimingBufferFull()) |
185 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); | 186 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); |
186 } | 187 } |
187 | 188 |
188 static bool passesTimingAllowCheck(const ResourceResponse& response, const Secur
ityOrigin& initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigi
n) | 189 static bool passesTimingAllowCheck(const ResourceResponse& response, const Secur
ityOrigin& initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigi
n, ExecutionContext* context) |
189 { | 190 { |
190 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url(
)); | 191 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url(
)); |
191 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) | 192 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) |
192 return true; | 193 return true; |
193 | 194 |
194 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm
pty() ? response.httpHeaderField(HTTPNames::Timing_Allow_Origin) : originalTimin
gAllowOrigin; | 195 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm
pty() ? response.httpHeaderField(HTTPNames::Timing_Allow_Origin) : originalTimin
gAllowOrigin; |
195 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin
String, "null")) | 196 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin
String, "null")) |
196 return false; | 197 return false; |
197 | 198 |
198 if (timingAllowOriginString == "*") | 199 if (timingAllowOriginString == "*") { |
| 200 UseCounter::count(context, UseCounter::StarInTimingAllowOrigin); |
199 return true; | 201 return true; |
| 202 } |
200 | 203 |
201 const String& securityOrigin = initiatorSecurityOrigin.toString(); | 204 const String& securityOrigin = initiatorSecurityOrigin.toString(); |
202 Vector<String> timingAllowOrigins; | 205 Vector<String> timingAllowOrigins; |
203 timingAllowOriginString.getString().split(' ', timingAllowOrigins); | 206 timingAllowOriginString.getString().split(' ', timingAllowOrigins); |
| 207 if (timingAllowOrigins.size() > 1) |
| 208 UseCounter::count(context, UseCounter::MultipleOriginsInTimingAllowOrigi
n); |
| 209 else if (timingAllowOrigins.size() == 1) |
| 210 UseCounter::count(context, UseCounter::SingleOriginInTimingAllowOrigin); |
204 for (const String& allowOrigin : timingAllowOrigins) { | 211 for (const String& allowOrigin : timingAllowOrigins) { |
205 if (allowOrigin == securityOrigin) | 212 if (allowOrigin == securityOrigin) |
206 return true; | 213 return true; |
207 } | 214 } |
208 | 215 |
209 return false; | 216 return false; |
210 } | 217 } |
211 | 218 |
212 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain,
const ResourceResponse& finalResponse, const SecurityOrigin& initiatorSecurityOr
igin) | 219 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain,
const ResourceResponse& finalResponse, const SecurityOrigin& initiatorSecurityOr
igin, ExecutionContext* context) |
213 { | 220 { |
214 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, AtomicSt
ring())) | 221 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, AtomicSt
ring(), context)) |
215 return false; | 222 return false; |
216 | 223 |
217 for (const ResourceResponse& response : redirectChain) { | 224 for (const ResourceResponse& response : redirectChain) { |
218 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, AtomicStr
ing())) | 225 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, AtomicStr
ing(), context)) |
219 return false; | 226 return false; |
220 } | 227 } |
221 | 228 |
222 return true; | 229 return true; |
223 } | 230 } |
224 | 231 |
225 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) | 232 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) |
226 { | 233 { |
227 if (isResourceTimingBufferFull() && !hasObserverFor(PerformanceEntry::Resour
ce)) | 234 if (isResourceTimingBufferFull() && !hasObserverFor(PerformanceEntry::Resour
ce)) |
228 return; | 235 return; |
229 SecurityOrigin* securityOrigin = nullptr; | 236 SecurityOrigin* securityOrigin = nullptr; |
230 if (ExecutionContext* context = getExecutionContext()) | 237 ExecutionContext* context = getExecutionContext(); |
| 238 if (context) |
231 securityOrigin = context->getSecurityOrigin(); | 239 securityOrigin = context->getSecurityOrigin(); |
232 if (!securityOrigin) | 240 if (!securityOrigin) |
233 return; | 241 return; |
234 | 242 |
235 const ResourceResponse& finalResponse = info.finalResponse(); | 243 const ResourceResponse& finalResponse = info.finalResponse(); |
236 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, *securityOri
gin, info.originalTimingAllowOrigin()); | 244 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, *securityOri
gin, info.originalTimingAllowOrigin(), getExecutionContext()); |
237 double startTime = info.initialTime(); | 245 double startTime = info.initialTime(); |
238 | 246 |
239 if (info.redirectChain().isEmpty()) { | 247 if (info.redirectChain().isEmpty()) { |
240 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOr
igin(), startTime, allowTimingDetails); | 248 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOr
igin(), startTime, allowTimingDetails); |
241 notifyObserversOfEntry(*entry); | 249 notifyObserversOfEntry(*entry); |
242 if (!isResourceTimingBufferFull()) | 250 if (!isResourceTimingBufferFull()) |
243 addResourceTimingBuffer(*entry); | 251 addResourceTimingBuffer(*entry); |
244 return; | 252 return; |
245 } | 253 } |
246 | 254 |
247 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); | 255 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); |
248 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons
e, *securityOrigin); | 256 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons
e, *securityOrigin, context); |
249 | 257 |
250 if (!allowRedirectDetails) { | 258 if (!allowRedirectDetails) { |
251 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); | 259 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); |
252 ASSERT(finalTiming); | 260 ASSERT(finalTiming); |
253 if (finalTiming) | 261 if (finalTiming) |
254 startTime = finalTiming->requestTime(); | 262 startTime = finalTiming->requestTime(); |
255 } | 263 } |
256 | 264 |
257 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi
ming(); | 265 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi
ming(); |
258 ASSERT(lastRedirectTiming); | 266 ASSERT(lastRedirectTiming); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 visitor->trace(m_frameTimingBuffer); | 455 visitor->trace(m_frameTimingBuffer); |
448 visitor->trace(m_resourceTimingBuffer); | 456 visitor->trace(m_resourceTimingBuffer); |
449 visitor->trace(m_userTiming); | 457 visitor->trace(m_userTiming); |
450 visitor->trace(m_observers); | 458 visitor->trace(m_observers); |
451 visitor->trace(m_activeObservers); | 459 visitor->trace(m_activeObservers); |
452 visitor->trace(m_suspendedObservers); | 460 visitor->trace(m_suspendedObservers); |
453 EventTargetWithInlineData::trace(visitor); | 461 EventTargetWithInlineData::trace(visitor); |
454 } | 462 } |
455 | 463 |
456 } // namespace blink | 464 } // namespace blink |
OLD | NEW |