Chromium Code Reviews| 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 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 218 void PerformanceBase::clearFrameTimings() { | 218 void PerformanceBase::clearFrameTimings() { |
| 219 m_frameTimingBuffer.clear(); | 219 m_frameTimingBuffer.clear(); |
| 220 } | 220 } |
| 221 | 221 |
| 222 void PerformanceBase::setFrameTimingBufferSize(unsigned size) { | 222 void PerformanceBase::setFrameTimingBufferSize(unsigned size) { |
| 223 m_frameTimingBufferSize = size; | 223 m_frameTimingBufferSize = size; |
| 224 if (isFrameTimingBufferFull()) | 224 if (isFrameTimingBufferFull()) |
| 225 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); | 225 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); |
| 226 } | 226 } |
| 227 | 227 |
| 228 static bool passesTimingAllowCheck( | 228 bool PerformanceBase::passesTimingAllowCheck( |
| 229 const ResourceResponse& response, | 229 const ResourceResponse& response, |
| 230 const SecurityOrigin& initiatorSecurityOrigin, | 230 const SecurityOrigin& initiatorSecurityOrigin, |
| 231 const AtomicString& originalTimingAllowOrigin, | 231 const AtomicString& originalTimingAllowOrigin, |
| 232 ExecutionContext* context) { | 232 ExecutionContext* context) { |
| 233 RefPtr<SecurityOrigin> resourceOrigin = | 233 RefPtr<SecurityOrigin> resourceOrigin = |
| 234 SecurityOrigin::create(response.url()); | 234 SecurityOrigin::create(response.url()); |
| 235 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) | 235 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) |
| 236 return true; | 236 return true; |
| 237 | 237 |
| 238 const AtomicString& timingAllowOriginString = | 238 const AtomicString& timingAllowOriginString = |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 256 else if (timingAllowOrigins.size() == 1) | 256 else if (timingAllowOrigins.size() == 1) |
| 257 UseCounter::count(context, UseCounter::SingleOriginInTimingAllowOrigin); | 257 UseCounter::count(context, UseCounter::SingleOriginInTimingAllowOrigin); |
| 258 for (const String& allowOrigin : timingAllowOrigins) { | 258 for (const String& allowOrigin : timingAllowOrigins) { |
| 259 if (allowOrigin == securityOrigin) | 259 if (allowOrigin == securityOrigin) |
| 260 return true; | 260 return true; |
| 261 } | 261 } |
| 262 | 262 |
| 263 return false; | 263 return false; |
| 264 } | 264 } |
| 265 | 265 |
| 266 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, | 266 bool PerformanceBase::allowsTimingRedirect( |
| 267 const ResourceResponse& finalResponse, | 267 const Vector<ResourceResponse>& redirectChain, |
| 268 const SecurityOrigin& initiatorSecurityOrigin, | 268 const ResourceResponse& finalResponse, |
| 269 ExecutionContext* context) { | 269 const SecurityOrigin& initiatorSecurityOrigin, |
| 270 ExecutionContext* context) { | |
| 270 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, | 271 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, |
| 271 AtomicString(), context)) | 272 AtomicString(), context)) |
| 272 return false; | 273 return false; |
| 273 | 274 |
| 274 for (const ResourceResponse& response : redirectChain) { | 275 for (const ResourceResponse& response : redirectChain) { |
| 275 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, | 276 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, |
| 276 AtomicString(), context)) | 277 AtomicString(), context)) |
| 277 return false; | 278 return false; |
| 278 } | 279 } |
| 279 | 280 |
| 280 return true; | 281 return true; |
| 281 } | 282 } |
| 282 | 283 |
| 284 SecurityOrigin* PerformanceBase::getSecurityOrigin() const { | |
|
panicker
2016/12/07 00:40:52
Nit: prefer moving to anonymous namespace here as
sunjian
2016/12/07 20:10:32
Done.
| |
| 285 ExecutionContext* context = getExecutionContext(); | |
| 286 if (context) | |
| 287 return context->getSecurityOrigin(); | |
| 288 return nullptr; | |
| 289 } | |
| 290 | |
| 283 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) { | 291 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) { |
| 284 if (isResourceTimingBufferFull() && | 292 if (isResourceTimingBufferFull() && |
| 285 !hasObserverFor(PerformanceEntry::Resource)) | 293 !hasObserverFor(PerformanceEntry::Resource)) |
| 286 return; | 294 return; |
| 287 SecurityOrigin* securityOrigin = nullptr; | |
| 288 ExecutionContext* context = getExecutionContext(); | 295 ExecutionContext* context = getExecutionContext(); |
| 289 if (context) | 296 SecurityOrigin* securityOrigin = getSecurityOrigin(); |
| 290 securityOrigin = context->getSecurityOrigin(); | |
| 291 if (!securityOrigin) | 297 if (!securityOrigin) |
| 292 return; | 298 return; |
| 293 | 299 |
| 294 const ResourceResponse& finalResponse = info.finalResponse(); | 300 const ResourceResponse& finalResponse = info.finalResponse(); |
| 295 bool allowTimingDetails = | 301 bool allowTimingDetails = |
| 296 passesTimingAllowCheck(finalResponse, *securityOrigin, | 302 passesTimingAllowCheck(finalResponse, *securityOrigin, |
| 297 info.originalTimingAllowOrigin(), context); | 303 info.originalTimingAllowOrigin(), context); |
| 298 double startTime = info.initialTime(); | 304 double startTime = info.initialTime(); |
| 299 | 305 |
| 300 if (info.redirectChain().isEmpty()) { | 306 if (info.redirectChain().isEmpty()) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 338 DCHECK(documentLoader); | 344 DCHECK(documentLoader); |
| 339 | 345 |
| 340 const DocumentLoadTiming& documentLoadTiming = documentLoader->timing(); | 346 const DocumentLoadTiming& documentLoadTiming = documentLoader->timing(); |
| 341 | 347 |
| 342 const DocumentTiming* documentTiming = | 348 const DocumentTiming* documentTiming = |
| 343 frame->document() ? &(frame->document()->timing()) : nullptr; | 349 frame->document() ? &(frame->document()->timing()) : nullptr; |
| 344 | 350 |
| 345 const ResourceResponse& finalResponse = documentLoader->response(); | 351 const ResourceResponse& finalResponse = documentLoader->response(); |
| 346 ResourceTimingInfo* resourceTimingInfo = | 352 ResourceTimingInfo* resourceTimingInfo = |
| 347 documentLoader->getMainResourceTimingInfo(); | 353 documentLoader->getMainResourceTimingInfo(); |
| 354 | |
| 348 // Don't create navigation timing instance when resourceTimingInfo | 355 // Don't create navigation timing instance when resourceTimingInfo |
| 349 // is null, which could happen when it is an iframe navigation restored | 356 // is null, which could happen when it is an iframe navigation restored |
| 350 // from history, since its location may have been changed after initial | 357 // from history, since its location may have been changed after initial |
| 351 // navigation. | 358 // navigation. |
| 352 if (!resourceTimingInfo) | 359 if (!resourceTimingInfo) |
| 353 return; | 360 return; |
| 354 | 361 |
| 355 ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming(); | 362 ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming(); |
| 356 // Don't create a navigation timing instance when | 363 // Don't create a navigation timing instance when |
| 357 // resourceLoadTiming is null, which could happen when visiting non-http sites | 364 // resourceLoadTiming is null, which could happen when visiting non-http sites |
| 358 // such as about:blank or in some error cases. | 365 // such as about:blank or in some error cases. |
| 359 if (!resourceLoadTiming) | 366 if (!resourceLoadTiming) |
| 360 return; | 367 return; |
| 361 double lastRedirectEndTime = documentLoadTiming.redirectEnd(); | 368 double lastRedirectEndTime = documentLoadTiming.redirectEnd(); |
| 362 double finishTime = documentLoadTiming.loadEventEnd(); | 369 double finishTime = documentLoadTiming.loadEventEnd(); |
| 363 | 370 |
| 371 SecurityOrigin* securityOrigin = getSecurityOrigin(); | |
| 372 if (!securityOrigin) | |
| 373 return; | |
| 374 | |
| 375 bool allowRedirectDetails = | |
| 376 allowsTimingRedirect(resourceTimingInfo->redirectChain(), finalResponse, | |
| 377 *securityOrigin, getExecutionContext()); | |
| 378 | |
| 364 unsigned long long transferSize = resourceTimingInfo->transferSize(); | 379 unsigned long long transferSize = resourceTimingInfo->transferSize(); |
| 365 unsigned long long encodedBodyLength = finalResponse.encodedBodyLength(); | 380 unsigned long long encodedBodyLength = finalResponse.encodedBodyLength(); |
| 366 unsigned long long decodedBodyLength = finalResponse.decodedBodyLength(); | 381 unsigned long long decodedBodyLength = finalResponse.decodedBodyLength(); |
| 367 bool didReuseConnection = finalResponse.connectionReused(); | 382 bool didReuseConnection = finalResponse.connectionReused(); |
| 368 PerformanceNavigationTiming::NavigationType type = | 383 PerformanceNavigationTiming::NavigationType type = |
| 369 getNavigationType(documentLoader->getNavigationType(), frame->document()); | 384 getNavigationType(documentLoader->getNavigationType(), frame->document()); |
| 370 | 385 |
| 371 m_navigationTiming = new PerformanceNavigationTiming( | 386 m_navigationTiming = new PerformanceNavigationTiming( |
| 372 timeOrigin(), documentLoadTiming.unloadEventStart(), | 387 timeOrigin(), documentLoadTiming.unloadEventStart(), |
| 373 documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(), | 388 documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(), |
| 374 documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(), | 389 documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(), |
| 375 documentTiming ? documentTiming->domInteractive() : 0, | 390 documentTiming ? documentTiming->domInteractive() : 0, |
| 376 documentTiming ? documentTiming->domContentLoadedEventStart() : 0, | 391 documentTiming ? documentTiming->domContentLoadedEventStart() : 0, |
| 377 documentTiming ? documentTiming->domContentLoadedEventEnd() : 0, | 392 documentTiming ? documentTiming->domContentLoadedEventEnd() : 0, |
| 378 documentTiming ? documentTiming->domComplete() : 0, type, | 393 documentTiming ? documentTiming->domComplete() : 0, type, |
| 379 documentLoadTiming.redirectStart(), documentLoadTiming.redirectEnd(), | 394 documentLoadTiming.redirectStart(), documentLoadTiming.redirectEnd(), |
| 380 documentLoadTiming.fetchStart(), documentLoadTiming.responseEnd(), | 395 documentLoadTiming.fetchStart(), documentLoadTiming.responseEnd(), |
| 381 documentLoadTiming.hasCrossOriginRedirect(), | 396 allowRedirectDetails, |
| 382 documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming, | 397 documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming, |
| 383 lastRedirectEndTime, finishTime, transferSize, encodedBodyLength, | 398 lastRedirectEndTime, finishTime, transferSize, encodedBodyLength, |
| 384 decodedBodyLength, didReuseConnection); | 399 decodedBodyLength, didReuseConnection); |
| 385 notifyObserversOfEntry(*m_navigationTiming); | 400 notifyObserversOfEntry(*m_navigationTiming); |
| 386 } | 401 } |
| 387 | 402 |
| 388 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) { | 403 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) { |
| 389 m_resourceTimingBuffer.append(&entry); | 404 m_resourceTimingBuffer.append(&entry); |
| 390 | 405 |
| 391 if (isResourceTimingBufferFull()) { | 406 if (isResourceTimingBufferFull()) { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 562 visitor->trace(m_resourceTimingBuffer); | 577 visitor->trace(m_resourceTimingBuffer); |
| 563 visitor->trace(m_navigationTiming); | 578 visitor->trace(m_navigationTiming); |
| 564 visitor->trace(m_userTiming); | 579 visitor->trace(m_userTiming); |
| 565 visitor->trace(m_observers); | 580 visitor->trace(m_observers); |
| 566 visitor->trace(m_activeObservers); | 581 visitor->trace(m_activeObservers); |
| 567 visitor->trace(m_suspendedObservers); | 582 visitor->trace(m_suspendedObservers); |
| 568 EventTargetWithInlineData::trace(visitor); | 583 EventTargetWithInlineData::trace(visitor); |
| 569 } | 584 } |
| 570 | 585 |
| 571 } // namespace blink | 586 } // namespace blink |
| OLD | NEW |