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

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

Issue 2550883003: nav timing 2 redirect allow opt-in (Closed)
Patch Set: sync Created 4 years 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #include "core/timing/PerformanceResourceTiming.h" 43 #include "core/timing/PerformanceResourceTiming.h"
44 #include "core/timing/PerformanceUserTiming.h" 44 #include "core/timing/PerformanceUserTiming.h"
45 #include "platform/RuntimeEnabledFeatures.h" 45 #include "platform/RuntimeEnabledFeatures.h"
46 #include "platform/network/ResourceTimingInfo.h" 46 #include "platform/network/ResourceTimingInfo.h"
47 #include "platform/weborigin/SecurityOrigin.h" 47 #include "platform/weborigin/SecurityOrigin.h"
48 #include "wtf/CurrentTime.h" 48 #include "wtf/CurrentTime.h"
49 #include <algorithm> 49 #include <algorithm>
50 50
51 namespace blink { 51 namespace blink {
52 52
53 namespace {
54
55 SecurityOrigin* getSecurityOrigin(ExecutionContext* context) {
56 if (context)
57 return context->getSecurityOrigin();
58 return nullptr;
59 }
60
61 } // namespace
62
53 using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>; 63 using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>;
54 64
55 static const size_t defaultResourceTimingBufferSize = 150; 65 static const size_t defaultResourceTimingBufferSize = 150;
56 static const size_t defaultFrameTimingBufferSize = 150; 66 static const size_t defaultFrameTimingBufferSize = 150;
57 67
58 PerformanceBase::PerformanceBase(double timeOrigin) 68 PerformanceBase::PerformanceBase(double timeOrigin)
59 : m_frameTimingBufferSize(defaultFrameTimingBufferSize), 69 : m_frameTimingBufferSize(defaultFrameTimingBufferSize),
60 m_resourceTimingBufferSize(defaultResourceTimingBufferSize), 70 m_resourceTimingBufferSize(defaultResourceTimingBufferSize),
61 m_userTiming(nullptr), 71 m_userTiming(nullptr),
62 m_timeOrigin(timeOrigin), 72 m_timeOrigin(timeOrigin),
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 void PerformanceBase::clearFrameTimings() { 228 void PerformanceBase::clearFrameTimings() {
219 m_frameTimingBuffer.clear(); 229 m_frameTimingBuffer.clear();
220 } 230 }
221 231
222 void PerformanceBase::setFrameTimingBufferSize(unsigned size) { 232 void PerformanceBase::setFrameTimingBufferSize(unsigned size) {
223 m_frameTimingBufferSize = size; 233 m_frameTimingBufferSize = size;
224 if (isFrameTimingBufferFull()) 234 if (isFrameTimingBufferFull())
225 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); 235 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull));
226 } 236 }
227 237
228 static bool passesTimingAllowCheck( 238 bool PerformanceBase::passesTimingAllowCheck(
229 const ResourceResponse& response, 239 const ResourceResponse& response,
230 const SecurityOrigin& initiatorSecurityOrigin, 240 const SecurityOrigin& initiatorSecurityOrigin,
231 const AtomicString& originalTimingAllowOrigin, 241 const AtomicString& originalTimingAllowOrigin,
232 ExecutionContext* context) { 242 ExecutionContext* context) {
233 RefPtr<SecurityOrigin> resourceOrigin = 243 RefPtr<SecurityOrigin> resourceOrigin =
234 SecurityOrigin::create(response.url()); 244 SecurityOrigin::create(response.url());
235 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) 245 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin))
236 return true; 246 return true;
237 247
238 const AtomicString& timingAllowOriginString = 248 const AtomicString& timingAllowOriginString =
(...skipping 17 matching lines...) Expand all
256 else if (timingAllowOrigins.size() == 1) 266 else if (timingAllowOrigins.size() == 1)
257 UseCounter::count(context, UseCounter::SingleOriginInTimingAllowOrigin); 267 UseCounter::count(context, UseCounter::SingleOriginInTimingAllowOrigin);
258 for (const String& allowOrigin : timingAllowOrigins) { 268 for (const String& allowOrigin : timingAllowOrigins) {
259 if (allowOrigin == securityOrigin) 269 if (allowOrigin == securityOrigin)
260 return true; 270 return true;
261 } 271 }
262 272
263 return false; 273 return false;
264 } 274 }
265 275
266 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, 276 bool PerformanceBase::allowsTimingRedirect(
267 const ResourceResponse& finalResponse, 277 const Vector<ResourceResponse>& redirectChain,
268 const SecurityOrigin& initiatorSecurityOrigin, 278 const ResourceResponse& finalResponse,
269 ExecutionContext* context) { 279 const SecurityOrigin& initiatorSecurityOrigin,
280 ExecutionContext* context) {
270 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, 281 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin,
271 AtomicString(), context)) 282 AtomicString(), context))
272 return false; 283 return false;
273 284
274 for (const ResourceResponse& response : redirectChain) { 285 for (const ResourceResponse& response : redirectChain) {
275 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, 286 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin,
276 AtomicString(), context)) 287 AtomicString(), context))
277 return false; 288 return false;
278 } 289 }
279 290
280 return true; 291 return true;
281 } 292 }
282 293
283 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) { 294 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) {
284 if (isResourceTimingBufferFull() && 295 if (isResourceTimingBufferFull() &&
285 !hasObserverFor(PerformanceEntry::Resource)) 296 !hasObserverFor(PerformanceEntry::Resource))
286 return; 297 return;
287 SecurityOrigin* securityOrigin = nullptr;
288 ExecutionContext* context = getExecutionContext(); 298 ExecutionContext* context = getExecutionContext();
289 if (context) 299 SecurityOrigin* securityOrigin = getSecurityOrigin(context);
290 securityOrigin = context->getSecurityOrigin();
291 if (!securityOrigin) 300 if (!securityOrigin)
292 return; 301 return;
293 302
294 const ResourceResponse& finalResponse = info.finalResponse(); 303 const ResourceResponse& finalResponse = info.finalResponse();
295 bool allowTimingDetails = 304 bool allowTimingDetails =
296 passesTimingAllowCheck(finalResponse, *securityOrigin, 305 passesTimingAllowCheck(finalResponse, *securityOrigin,
297 info.originalTimingAllowOrigin(), context); 306 info.originalTimingAllowOrigin(), context);
298 double startTime = info.initialTime(); 307 double startTime = info.initialTime();
299 308
300 if (info.redirectChain().isEmpty()) { 309 if (info.redirectChain().isEmpty()) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 359
351 ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming(); 360 ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming();
352 // Don't create a navigation timing instance when 361 // Don't create a navigation timing instance when
353 // resourceLoadTiming is null, which could happen when visiting non-http sites 362 // resourceLoadTiming is null, which could happen when visiting non-http sites
354 // such as about:blank or in some error cases. 363 // such as about:blank or in some error cases.
355 if (!resourceLoadTiming) 364 if (!resourceLoadTiming)
356 return; 365 return;
357 double lastRedirectEndTime = documentLoadTiming.redirectEnd(); 366 double lastRedirectEndTime = documentLoadTiming.redirectEnd();
358 double finishTime = documentLoadTiming.loadEventEnd(); 367 double finishTime = documentLoadTiming.loadEventEnd();
359 368
369 ExecutionContext* context = getExecutionContext();
370 SecurityOrigin* securityOrigin = getSecurityOrigin(context);
371 if (!securityOrigin)
372 return;
373
374 bool allowRedirectDetails =
375 allowsTimingRedirect(navigationTimingInfo->redirectChain(), finalResponse,
376 *securityOrigin, context);
377
360 unsigned long long transferSize = navigationTimingInfo->transferSize(); 378 unsigned long long transferSize = navigationTimingInfo->transferSize();
361 unsigned long long encodedBodyLength = finalResponse.encodedBodyLength(); 379 unsigned long long encodedBodyLength = finalResponse.encodedBodyLength();
362 unsigned long long decodedBodyLength = finalResponse.decodedBodyLength(); 380 unsigned long long decodedBodyLength = finalResponse.decodedBodyLength();
363 bool didReuseConnection = finalResponse.connectionReused(); 381 bool didReuseConnection = finalResponse.connectionReused();
364 PerformanceNavigationTiming::NavigationType type = 382 PerformanceNavigationTiming::NavigationType type =
365 getNavigationType(documentLoader->getNavigationType(), frame->document()); 383 getNavigationType(documentLoader->getNavigationType(), frame->document());
366 384
367 m_navigationTiming = new PerformanceNavigationTiming( 385 m_navigationTiming = new PerformanceNavigationTiming(
368 timeOrigin(), documentLoadTiming.unloadEventStart(), 386 timeOrigin(), documentLoadTiming.unloadEventStart(),
369 documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(), 387 documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(),
370 documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(), 388 documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(),
371 documentTiming ? documentTiming->domInteractive() : 0, 389 documentTiming ? documentTiming->domInteractive() : 0,
372 documentTiming ? documentTiming->domContentLoadedEventStart() : 0, 390 documentTiming ? documentTiming->domContentLoadedEventStart() : 0,
373 documentTiming ? documentTiming->domContentLoadedEventEnd() : 0, 391 documentTiming ? documentTiming->domContentLoadedEventEnd() : 0,
374 documentTiming ? documentTiming->domComplete() : 0, type, 392 documentTiming ? documentTiming->domComplete() : 0, type,
375 documentLoadTiming.redirectStart(), documentLoadTiming.redirectEnd(), 393 documentLoadTiming.redirectStart(), documentLoadTiming.redirectEnd(),
376 documentLoadTiming.fetchStart(), documentLoadTiming.responseEnd(), 394 documentLoadTiming.fetchStart(), documentLoadTiming.responseEnd(),
377 documentLoadTiming.hasCrossOriginRedirect(), 395 allowRedirectDetails,
378 documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming, 396 documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming,
379 lastRedirectEndTime, finishTime, transferSize, encodedBodyLength, 397 lastRedirectEndTime, finishTime, transferSize, encodedBodyLength,
380 decodedBodyLength, didReuseConnection); 398 decodedBodyLength, didReuseConnection);
381 notifyObserversOfEntry(*m_navigationTiming); 399 notifyObserversOfEntry(*m_navigationTiming);
382 } 400 }
383 401
384 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) { 402 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) {
385 m_resourceTimingBuffer.append(&entry); 403 m_resourceTimingBuffer.append(&entry);
386 404
387 if (isResourceTimingBufferFull()) { 405 if (isResourceTimingBufferFull()) {
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 visitor->trace(m_resourceTimingBuffer); 576 visitor->trace(m_resourceTimingBuffer);
559 visitor->trace(m_navigationTiming); 577 visitor->trace(m_navigationTiming);
560 visitor->trace(m_userTiming); 578 visitor->trace(m_userTiming);
561 visitor->trace(m_observers); 579 visitor->trace(m_observers);
562 visitor->trace(m_activeObservers); 580 visitor->trace(m_activeObservers);
563 visitor->trace(m_suspendedObservers); 581 visitor->trace(m_suspendedObservers);
564 EventTargetWithInlineData::trace(visitor); 582 EventTargetWithInlineData::trace(visitor);
565 } 583 }
566 584
567 } // namespace blink 585 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/timing/PerformanceBase.h ('k') | third_party/WebKit/Source/core/timing/PerformanceBaseTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698