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 17 matching lines...) Expand all Loading... | |
| 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/frame/UseCounter.h" |
| 37 #include "core/timing/PerformanceCompositeTiming.h" | 37 #include "core/timing/PerformanceCompositeTiming.h" |
| 38 #include "core/timing/PerformanceLongTaskTiming.h" | |
| 38 #include "core/timing/PerformanceObserver.h" | 39 #include "core/timing/PerformanceObserver.h" |
| 39 #include "core/timing/PerformanceRenderTiming.h" | 40 #include "core/timing/PerformanceRenderTiming.h" |
| 40 #include "core/timing/PerformanceResourceTiming.h" | 41 #include "core/timing/PerformanceResourceTiming.h" |
| 41 #include "core/timing/PerformanceUserTiming.h" | 42 #include "core/timing/PerformanceUserTiming.h" |
| 42 #include "platform/network/ResourceTimingInfo.h" | 43 #include "platform/network/ResourceTimingInfo.h" |
| 43 #include "platform/weborigin/SecurityOrigin.h" | 44 #include "platform/weborigin/SecurityOrigin.h" |
| 44 #include "wtf/CurrentTime.h" | 45 #include "wtf/CurrentTime.h" |
| 45 #include <algorithm> | 46 #include <algorithm> |
| 46 | 47 |
| 47 namespace blink { | 48 namespace blink { |
| 48 | 49 |
| 49 using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>; | 50 using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>; |
| 50 | 51 |
| 51 static const size_t defaultResourceTimingBufferSize = 150; | 52 static const size_t defaultResourceTimingBufferSize = 150; |
| 52 static const size_t defaultFrameTimingBufferSize = 150; | 53 static const size_t defaultFrameTimingBufferSize = 150; |
| 54 static const size_t defaultLongTaskTimingBufferSize = 150; | |
| 53 | 55 |
| 54 PerformanceBase::PerformanceBase(double timeOrigin) | 56 PerformanceBase::PerformanceBase(double timeOrigin) |
| 55 : m_frameTimingBufferSize(defaultFrameTimingBufferSize) | 57 : m_frameTimingBufferSize(defaultFrameTimingBufferSize) |
| 56 , m_resourceTimingBufferSize(defaultResourceTimingBufferSize) | 58 , m_resourceTimingBufferSize(defaultResourceTimingBufferSize) |
| 59 , m_longTaskTimingBufferSize(defaultLongTaskTimingBufferSize) | |
| 60 , m_userTiming(nullptr) | |
| 57 , m_timeOrigin(timeOrigin) | 61 , m_timeOrigin(timeOrigin) |
| 58 , m_userTiming(nullptr) | |
| 59 , m_observerFilterOptions(PerformanceEntry::Invalid) | 62 , m_observerFilterOptions(PerformanceEntry::Invalid) |
| 60 , m_deliverObservationsTimer(this, &PerformanceBase::deliverObservationsTime rFired) | 63 , m_deliverObservationsTimer(this, &PerformanceBase::deliverObservationsTime rFired) |
| 61 { | 64 { |
| 62 } | 65 } |
| 63 | 66 |
| 64 PerformanceBase::~PerformanceBase() | 67 PerformanceBase::~PerformanceBase() |
| 65 { | 68 { |
| 66 } | 69 } |
| 67 | 70 |
| 68 const AtomicString& PerformanceBase::interfaceName() const | 71 const AtomicString& PerformanceBase::interfaceName() const |
| 69 { | 72 { |
| 70 return EventTargetNames::Performance; | 73 return EventTargetNames::Performance; |
| 71 } | 74 } |
| 72 | 75 |
| 73 PerformanceTiming* PerformanceBase::timing() const | 76 PerformanceTiming* PerformanceBase::timing() const |
| 74 { | 77 { |
| 75 return nullptr; | 78 return nullptr; |
| 76 } | 79 } |
| 77 | 80 |
| 78 PerformanceEntryVector PerformanceBase::getEntries() const | 81 PerformanceEntryVector PerformanceBase::getEntries() const |
| 79 { | 82 { |
| 80 PerformanceEntryVector entries; | 83 PerformanceEntryVector entries; |
| 81 | 84 |
| 82 entries.appendVector(m_resourceTimingBuffer); | 85 entries.appendVector(m_resourceTimingBuffer); |
| 83 entries.appendVector(m_frameTimingBuffer); | 86 entries.appendVector(m_frameTimingBuffer); |
| 87 entries.appendVector(m_longTaskTimingBuffer); | |
| 84 | 88 |
| 85 if (m_userTiming) { | 89 if (m_userTiming) { |
| 86 entries.appendVector(m_userTiming->getMarks()); | 90 entries.appendVector(m_userTiming->getMarks()); |
| 87 entries.appendVector(m_userTiming->getMeasures()); | 91 entries.appendVector(m_userTiming->getMeasures()); |
| 88 } | 92 } |
| 89 | 93 |
| 90 std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompare LessThan); | 94 std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompare LessThan); |
| 91 return entries; | 95 return entries; |
| 92 } | 96 } |
| 93 | 97 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 112 } | 116 } |
| 113 break; | 117 break; |
| 114 case PerformanceEntry::Mark: | 118 case PerformanceEntry::Mark: |
| 115 if (m_userTiming) | 119 if (m_userTiming) |
| 116 entries.appendVector(m_userTiming->getMarks()); | 120 entries.appendVector(m_userTiming->getMarks()); |
| 117 break; | 121 break; |
| 118 case PerformanceEntry::Measure: | 122 case PerformanceEntry::Measure: |
| 119 if (m_userTiming) | 123 if (m_userTiming) |
| 120 entries.appendVector(m_userTiming->getMeasures()); | 124 entries.appendVector(m_userTiming->getMeasures()); |
| 121 break; | 125 break; |
| 126 case PerformanceEntry::LongTask: | |
| 127 for (const auto& longTask : m_longTaskTimingBuffer) | |
| 128 entries.append(longTask); | |
| 129 break; | |
| 122 } | 130 } |
| 123 | 131 |
| 124 std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompare LessThan); | 132 std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompare LessThan); |
| 125 return entries; | 133 return entries; |
| 126 } | 134 } |
| 127 | 135 |
| 128 PerformanceEntryVector PerformanceBase::getEntriesByName(const String& name, con st String& entryType) | 136 PerformanceEntryVector PerformanceBase::getEntriesByName(const String& name, con st String& entryType) |
| 129 { | 137 { |
| 130 PerformanceEntryVector entries; | 138 PerformanceEntryVector entries; |
| 131 PerformanceEntry::EntryType type = PerformanceEntry::toEntryTypeEnum(entryTy pe); | 139 PerformanceEntry::EntryType type = PerformanceEntry::toEntryTypeEnum(entryTy pe); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 m_frameTimingBuffer.clear(); | 187 m_frameTimingBuffer.clear(); |
| 180 } | 188 } |
| 181 | 189 |
| 182 void PerformanceBase::setFrameTimingBufferSize(unsigned size) | 190 void PerformanceBase::setFrameTimingBufferSize(unsigned size) |
| 183 { | 191 { |
| 184 m_frameTimingBufferSize = size; | 192 m_frameTimingBufferSize = size; |
| 185 if (isFrameTimingBufferFull()) | 193 if (isFrameTimingBufferFull()) |
| 186 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); | 194 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); |
| 187 } | 195 } |
| 188 | 196 |
| 197 void PerformanceBase::clearLongTaskTimings() | |
| 198 { | |
| 199 m_longTaskTimingBuffer.clear(); | |
| 200 } | |
| 201 | |
| 202 void PerformanceBase::setLongTaskTimingBufferSize(unsigned size) | |
| 203 { | |
| 204 m_longTaskTimingBufferSize = size; | |
| 205 if (isLongTaskTimingBufferFull()) | |
| 206 dispatchEvent(Event::create(EventTypeNames::longtasktimingbufferfull)); | |
| 207 } | |
| 208 | |
| 189 static bool passesTimingAllowCheck(const ResourceResponse& response, const Secur ityOrigin& initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigi n, ExecutionContext* context) | 209 static bool passesTimingAllowCheck(const ResourceResponse& response, const Secur ityOrigin& initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigi n, ExecutionContext* context) |
| 190 { | 210 { |
| 191 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url( )); | 211 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url( )); |
| 192 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) | 212 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) |
| 193 return true; | 213 return true; |
| 194 | 214 |
| 195 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm pty() ? response.httpHeaderField(HTTPNames::Timing_Allow_Origin) : originalTimin gAllowOrigin; | 215 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm pty() ? response.httpHeaderField(HTTPNames::Timing_Allow_Origin) : originalTimin gAllowOrigin; |
| 196 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin String, "null")) | 216 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin String, "null")) |
| 197 return false; | 217 return false; |
| 198 | 218 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 315 | 335 |
| 316 if (isFrameTimingBufferFull()) | 336 if (isFrameTimingBufferFull()) |
| 317 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); | 337 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); |
| 318 } | 338 } |
| 319 | 339 |
| 320 bool PerformanceBase::isFrameTimingBufferFull() | 340 bool PerformanceBase::isFrameTimingBufferFull() |
| 321 { | 341 { |
| 322 return m_frameTimingBuffer.size() >= m_frameTimingBufferSize; | 342 return m_frameTimingBuffer.size() >= m_frameTimingBufferSize; |
| 323 } | 343 } |
| 324 | 344 |
| 345 void PerformanceBase::addLongTaskTiming(double startTime, double endTime, const String& frameContextUrl) | |
| 346 { | |
| 347 if (isLongTaskTimingBufferFull() || !hasObserverFor(PerformanceEntry::LongTa sk)) | |
|
haraken
2016/08/17 01:15:48
Don't we need to dispatch a longtasktimingbufferfu
panicker
2016/08/17 19:00:09
This is happening at line 362 below.
Basically aft
| |
| 348 return; | |
| 349 PerformanceEntry* entry = PerformanceLongTaskTiming::create( | |
| 350 monotonicTimeToDOMHighResTimeStampInMillis(startTime), | |
| 351 monotonicTimeToDOMHighResTimeStampInMillis(endTime), | |
| 352 frameContextUrl); | |
| 353 notifyObserversOfEntry(*entry); | |
| 354 if (!isLongTaskTimingBufferFull()) | |
|
haraken
2016/08/17 01:15:48
This check won't be needed since you've already ch
panicker
2016/08/17 19:00:09
Done.
| |
| 355 addLongTaskTimingBuffer(*entry); | |
| 356 } | |
| 357 | |
| 358 void PerformanceBase::addLongTaskTimingBuffer(PerformanceEntry& entry) | |
| 359 { | |
| 360 m_longTaskTimingBuffer.append(&entry); | |
| 361 if (isLongTaskTimingBufferFull()) | |
| 362 dispatchEvent(Event::create(EventTypeNames::longtasktimingbufferfull)); | |
| 363 } | |
| 364 | |
| 365 bool PerformanceBase::isLongTaskTimingBufferFull() | |
| 366 { | |
| 367 return m_longTaskTimingBuffer.size() >= m_longTaskTimingBufferSize; | |
| 368 } | |
| 369 | |
| 325 void PerformanceBase::mark(const String& markName, ExceptionState& exceptionStat e) | 370 void PerformanceBase::mark(const String& markName, ExceptionState& exceptionStat e) |
| 326 { | 371 { |
| 327 if (!m_userTiming) | 372 if (!m_userTiming) |
| 328 m_userTiming = UserTiming::create(*this); | 373 m_userTiming = UserTiming::create(*this); |
| 329 if (PerformanceEntry* entry = m_userTiming->mark(markName, exceptionState)) | 374 if (PerformanceEntry* entry = m_userTiming->mark(markName, exceptionState)) |
| 330 notifyObserversOfEntry(*entry); | 375 notifyObserversOfEntry(*entry); |
| 331 } | 376 } |
| 332 | 377 |
| 333 void PerformanceBase::clearMarks(const String& markName) | 378 void PerformanceBase::clearMarks(const String& markName) |
| 334 { | 379 { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 DOMHighResTimeStamp PerformanceBase::monotonicTimeToDOMHighResTimeStamp(double m onotonicTime) const | 483 DOMHighResTimeStamp PerformanceBase::monotonicTimeToDOMHighResTimeStamp(double m onotonicTime) const |
| 439 { | 484 { |
| 440 // Avoid exposing raw platform timestamps. | 485 // Avoid exposing raw platform timestamps. |
| 441 if (m_timeOrigin == 0.0) | 486 if (m_timeOrigin == 0.0) |
| 442 return 0.0; | 487 return 0.0; |
| 443 | 488 |
| 444 double timeInSeconds = monotonicTime - m_timeOrigin; | 489 double timeInSeconds = monotonicTime - m_timeOrigin; |
| 445 return convertSecondsToDOMHighResTimeStamp(clampTimeResolution(timeInSeconds )); | 490 return convertSecondsToDOMHighResTimeStamp(clampTimeResolution(timeInSeconds )); |
| 446 } | 491 } |
| 447 | 492 |
| 493 double PerformanceBase::monotonicTimeToDOMHighResTimeStampInMillis( | |
| 494 DOMHighResTimeStamp monotonicTime) const | |
| 495 { | |
| 496 return monotonicTimeToDOMHighResTimeStamp(monotonicTime) * 1000; | |
| 497 } | |
| 498 | |
| 448 DOMHighResTimeStamp PerformanceBase::now() const | 499 DOMHighResTimeStamp PerformanceBase::now() const |
| 449 { | 500 { |
| 450 return monotonicTimeToDOMHighResTimeStamp(monotonicallyIncreasingTime()); | 501 return monotonicTimeToDOMHighResTimeStamp(monotonicallyIncreasingTime()); |
| 451 } | 502 } |
| 452 | 503 |
| 453 DEFINE_TRACE(PerformanceBase) | 504 DEFINE_TRACE(PerformanceBase) |
| 454 { | 505 { |
| 455 visitor->trace(m_frameTimingBuffer); | 506 visitor->trace(m_frameTimingBuffer); |
| 456 visitor->trace(m_resourceTimingBuffer); | 507 visitor->trace(m_resourceTimingBuffer); |
| 508 visitor->trace(m_longTaskTimingBuffer); | |
| 457 visitor->trace(m_userTiming); | 509 visitor->trace(m_userTiming); |
| 458 visitor->trace(m_observers); | 510 visitor->trace(m_observers); |
| 459 visitor->trace(m_activeObservers); | 511 visitor->trace(m_activeObservers); |
| 460 visitor->trace(m_suspendedObservers); | 512 visitor->trace(m_suspendedObservers); |
| 461 EventTargetWithInlineData::trace(visitor); | 513 EventTargetWithInlineData::trace(visitor); |
| 462 } | 514 } |
| 463 | 515 |
| 464 } // namespace blink | 516 } // namespace blink |
| OLD | NEW |