Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Side by Side Diff: third_party/WebKit/Source/core/timing/PerformanceBase.cpp

Issue 2178973002: Add use counter for multiple origins in Timing-Allow-Origin (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added counters Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698