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 == "*") |
199 return true; | 200 return true; |
200 | 201 |
201 const String& securityOrigin = initiatorSecurityOrigin.toString(); | 202 const String& securityOrigin = initiatorSecurityOrigin.toString(); |
202 Vector<String> timingAllowOrigins; | 203 Vector<String> timingAllowOrigins; |
203 timingAllowOriginString.getString().split(' ', timingAllowOrigins); | 204 timingAllowOriginString.getString().split(' ', timingAllowOrigins); |
205 if (timingAllowOrigins.size() > 1) | |
206 UseCounter::count(context, UseCounter::MultipleOriginsInTimingAllowOrigi n); | |
Mike West
2016/07/27 08:46:09
It's probably worth adding a counter for single or
| |
204 for (const String& allowOrigin : timingAllowOrigins) { | 207 for (const String& allowOrigin : timingAllowOrigins) { |
205 if (allowOrigin == securityOrigin) | 208 if (allowOrigin == securityOrigin) |
206 return true; | 209 return true; |
207 } | 210 } |
208 | 211 |
209 return false; | 212 return false; |
210 } | 213 } |
211 | 214 |
212 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, const SecurityOrigin& initiatorSecurityOr igin) | 215 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, const SecurityOrigin& initiatorSecurityOr igin, ExecutionContext* context) |
213 { | 216 { |
214 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, AtomicSt ring())) | 217 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, AtomicSt ring(), context)) |
215 return false; | 218 return false; |
216 | 219 |
217 for (const ResourceResponse& response : redirectChain) { | 220 for (const ResourceResponse& response : redirectChain) { |
218 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, AtomicStr ing())) | 221 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, AtomicStr ing(), context)) |
219 return false; | 222 return false; |
220 } | 223 } |
221 | 224 |
222 return true; | 225 return true; |
223 } | 226 } |
224 | 227 |
225 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) | 228 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) |
226 { | 229 { |
227 if (isResourceTimingBufferFull() && !hasObserverFor(PerformanceEntry::Resour ce)) | 230 if (isResourceTimingBufferFull() && !hasObserverFor(PerformanceEntry::Resour ce)) |
228 return; | 231 return; |
229 SecurityOrigin* securityOrigin = nullptr; | 232 SecurityOrigin* securityOrigin = nullptr; |
230 if (ExecutionContext* context = getExecutionContext()) | 233 ExecutionContext* context = getExecutionContext(); |
234 if (context) | |
231 securityOrigin = context->getSecurityOrigin(); | 235 securityOrigin = context->getSecurityOrigin(); |
232 if (!securityOrigin) | 236 if (!securityOrigin) |
233 return; | 237 return; |
234 | 238 |
235 const ResourceResponse& finalResponse = info.finalResponse(); | 239 const ResourceResponse& finalResponse = info.finalResponse(); |
236 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, *securityOri gin, info.originalTimingAllowOrigin()); | 240 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, *securityOri gin, info.originalTimingAllowOrigin(), getExecutionContext()); |
Mike West
2016/07/27 08:46:09
Nit: This is |context|, right?
| |
237 double startTime = info.initialTime(); | 241 double startTime = info.initialTime(); |
238 | 242 |
239 if (info.redirectChain().isEmpty()) { | 243 if (info.redirectChain().isEmpty()) { |
240 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOr igin(), startTime, allowTimingDetails); | 244 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOr igin(), startTime, allowTimingDetails); |
241 notifyObserversOfEntry(*entry); | 245 notifyObserversOfEntry(*entry); |
242 if (!isResourceTimingBufferFull()) | 246 if (!isResourceTimingBufferFull()) |
243 addResourceTimingBuffer(*entry); | 247 addResourceTimingBuffer(*entry); |
244 return; | 248 return; |
245 } | 249 } |
246 | 250 |
247 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); | 251 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); |
248 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons e, *securityOrigin); | 252 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons e, *securityOrigin, context); |
249 | 253 |
250 if (!allowRedirectDetails) { | 254 if (!allowRedirectDetails) { |
251 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); | 255 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); |
252 ASSERT(finalTiming); | 256 ASSERT(finalTiming); |
253 if (finalTiming) | 257 if (finalTiming) |
254 startTime = finalTiming->requestTime(); | 258 startTime = finalTiming->requestTime(); |
255 } | 259 } |
256 | 260 |
257 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi ming(); | 261 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi ming(); |
258 ASSERT(lastRedirectTiming); | 262 ASSERT(lastRedirectTiming); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
447 visitor->trace(m_frameTimingBuffer); | 451 visitor->trace(m_frameTimingBuffer); |
448 visitor->trace(m_resourceTimingBuffer); | 452 visitor->trace(m_resourceTimingBuffer); |
449 visitor->trace(m_userTiming); | 453 visitor->trace(m_userTiming); |
450 visitor->trace(m_observers); | 454 visitor->trace(m_observers); |
451 visitor->trace(m_activeObservers); | 455 visitor->trace(m_activeObservers); |
452 visitor->trace(m_suspendedObservers); | 456 visitor->trace(m_suspendedObservers); |
453 EventTargetWithInlineData::trace(visitor); | 457 EventTargetWithInlineData::trace(visitor); |
454 } | 458 } |
455 | 459 |
456 } // namespace blink | 460 } // namespace blink |
OLD | NEW |