| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |