| 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #include "platform/weborigin/SecurityOrigin.h" | 44 #include "platform/weborigin/SecurityOrigin.h" |
| 45 #include "wtf/CurrentTime.h" | 45 #include "wtf/CurrentTime.h" |
| 46 #include <algorithm> | 46 #include <algorithm> |
| 47 | 47 |
| 48 namespace blink { | 48 namespace blink { |
| 49 | 49 |
| 50 using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>; | 50 using PerformanceObserverVector = HeapVector<Member<PerformanceObserver>>; |
| 51 | 51 |
| 52 static const size_t defaultResourceTimingBufferSize = 150; | 52 static const size_t defaultResourceTimingBufferSize = 150; |
| 53 static const size_t defaultFrameTimingBufferSize = 150; | 53 static const size_t defaultFrameTimingBufferSize = 150; |
| 54 static const size_t defaultLongTaskTimingBufferSize = 150; | |
| 55 | 54 |
| 56 PerformanceBase::PerformanceBase(double timeOrigin) | 55 PerformanceBase::PerformanceBase(double timeOrigin) |
| 57 : m_frameTimingBufferSize(defaultFrameTimingBufferSize), | 56 : m_frameTimingBufferSize(defaultFrameTimingBufferSize), |
| 58 m_resourceTimingBufferSize(defaultResourceTimingBufferSize), | 57 m_resourceTimingBufferSize(defaultResourceTimingBufferSize), |
| 59 m_longTaskTimingBufferSize(defaultLongTaskTimingBufferSize), | |
| 60 m_userTiming(nullptr), | 58 m_userTiming(nullptr), |
| 61 m_timeOrigin(timeOrigin), | 59 m_timeOrigin(timeOrigin), |
| 62 m_observerFilterOptions(PerformanceEntry::Invalid), | 60 m_observerFilterOptions(PerformanceEntry::Invalid), |
| 63 m_deliverObservationsTimer( | 61 m_deliverObservationsTimer( |
| 64 this, | 62 this, |
| 65 &PerformanceBase::deliverObservationsTimerFired) {} | 63 &PerformanceBase::deliverObservationsTimerFired) {} |
| 66 | 64 |
| 67 PerformanceBase::~PerformanceBase() {} | 65 PerformanceBase::~PerformanceBase() {} |
| 68 | 66 |
| 69 const AtomicString& PerformanceBase::interfaceName() const { | 67 const AtomicString& PerformanceBase::interfaceName() const { |
| 70 return EventTargetNames::Performance; | 68 return EventTargetNames::Performance; |
| 71 } | 69 } |
| 72 | 70 |
| 73 PerformanceTiming* PerformanceBase::timing() const { | 71 PerformanceTiming* PerformanceBase::timing() const { |
| 74 return nullptr; | 72 return nullptr; |
| 75 } | 73 } |
| 76 | 74 |
| 77 PerformanceEntryVector PerformanceBase::getEntries() const { | 75 PerformanceEntryVector PerformanceBase::getEntries() const { |
| 78 PerformanceEntryVector entries; | 76 PerformanceEntryVector entries; |
| 79 | 77 |
| 80 entries.appendVector(m_resourceTimingBuffer); | 78 entries.appendVector(m_resourceTimingBuffer); |
| 81 entries.appendVector(m_frameTimingBuffer); | 79 entries.appendVector(m_frameTimingBuffer); |
| 82 entries.appendVector(m_longTaskTimingBuffer); | |
| 83 | 80 |
| 84 if (m_userTiming) { | 81 if (m_userTiming) { |
| 85 entries.appendVector(m_userTiming->getMarks()); | 82 entries.appendVector(m_userTiming->getMarks()); |
| 86 entries.appendVector(m_userTiming->getMeasures()); | 83 entries.appendVector(m_userTiming->getMeasures()); |
| 87 } | 84 } |
| 88 | 85 |
| 89 std::sort(entries.begin(), entries.end(), | 86 std::sort(entries.begin(), entries.end(), |
| 90 PerformanceEntry::startTimeCompareLessThan); | 87 PerformanceEntry::startTimeCompareLessThan); |
| 91 return entries; | 88 return entries; |
| 92 } | 89 } |
| 93 | 90 |
| 94 PerformanceEntryVector PerformanceBase::getEntriesByType( | 91 PerformanceEntryVector PerformanceBase::getEntriesByType( |
| 95 const String& entryType) { | 92 const String& entryType) { |
| 96 PerformanceEntryVector entries; | 93 PerformanceEntryVector entries; |
| 97 PerformanceEntry::EntryType type = | 94 PerformanceEntry::EntryType type = |
| 98 PerformanceEntry::toEntryTypeEnum(entryType); | 95 PerformanceEntry::toEntryTypeEnum(entryType); |
| 99 | 96 |
| 100 switch (type) { | 97 switch (type) { |
| 101 case PerformanceEntry::Invalid: | 98 case PerformanceEntry::Invalid: |
| 102 return entries; | 99 return entries; |
| 100 case PerformanceEntry::LongTask: |
| 101 // Unsupported for LongTask. Per the spec, Long task entries can only be |
| 102 // accessed via Performance Observer. No separate buffer is maintained. |
| 103 return entries; |
| 103 case PerformanceEntry::Resource: | 104 case PerformanceEntry::Resource: |
| 104 for (const auto& resource : m_resourceTimingBuffer) | 105 for (const auto& resource : m_resourceTimingBuffer) |
| 105 entries.append(resource); | 106 entries.append(resource); |
| 106 break; | 107 break; |
| 107 case PerformanceEntry::Composite: | 108 case PerformanceEntry::Composite: |
| 108 case PerformanceEntry::Render: | 109 case PerformanceEntry::Render: |
| 109 for (const auto& frame : m_frameTimingBuffer) { | 110 for (const auto& frame : m_frameTimingBuffer) { |
| 110 if (type == frame->entryTypeEnum()) { | 111 if (type == frame->entryTypeEnum()) { |
| 111 entries.append(frame); | 112 entries.append(frame); |
| 112 } | 113 } |
| 113 } | 114 } |
| 114 break; | 115 break; |
| 115 case PerformanceEntry::Mark: | 116 case PerformanceEntry::Mark: |
| 116 if (m_userTiming) | 117 if (m_userTiming) |
| 117 entries.appendVector(m_userTiming->getMarks()); | 118 entries.appendVector(m_userTiming->getMarks()); |
| 118 break; | 119 break; |
| 119 case PerformanceEntry::Measure: | 120 case PerformanceEntry::Measure: |
| 120 if (m_userTiming) | 121 if (m_userTiming) |
| 121 entries.appendVector(m_userTiming->getMeasures()); | 122 entries.appendVector(m_userTiming->getMeasures()); |
| 122 break; | 123 break; |
| 123 case PerformanceEntry::LongTask: | |
| 124 for (const auto& longTask : m_longTaskTimingBuffer) | |
| 125 entries.append(longTask); | |
| 126 break; | |
| 127 } | 124 } |
| 128 | 125 |
| 129 std::sort(entries.begin(), entries.end(), | 126 std::sort(entries.begin(), entries.end(), |
| 130 PerformanceEntry::startTimeCompareLessThan); | 127 PerformanceEntry::startTimeCompareLessThan); |
| 131 return entries; | 128 return entries; |
| 132 } | 129 } |
| 133 | 130 |
| 134 PerformanceEntryVector PerformanceBase::getEntriesByName( | 131 PerformanceEntryVector PerformanceBase::getEntriesByName( |
| 135 const String& name, | 132 const String& name, |
| 136 const String& entryType) { | 133 const String& entryType) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 void PerformanceBase::clearFrameTimings() { | 182 void PerformanceBase::clearFrameTimings() { |
| 186 m_frameTimingBuffer.clear(); | 183 m_frameTimingBuffer.clear(); |
| 187 } | 184 } |
| 188 | 185 |
| 189 void PerformanceBase::setFrameTimingBufferSize(unsigned size) { | 186 void PerformanceBase::setFrameTimingBufferSize(unsigned size) { |
| 190 m_frameTimingBufferSize = size; | 187 m_frameTimingBufferSize = size; |
| 191 if (isFrameTimingBufferFull()) | 188 if (isFrameTimingBufferFull()) |
| 192 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); | 189 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); |
| 193 } | 190 } |
| 194 | 191 |
| 195 void PerformanceBase::clearLongTaskTimings() { | |
| 196 m_longTaskTimingBuffer.clear(); | |
| 197 } | |
| 198 | |
| 199 void PerformanceBase::setLongTaskTimingBufferSize(unsigned size) { | |
| 200 m_longTaskTimingBufferSize = size; | |
| 201 if (isLongTaskTimingBufferFull()) | |
| 202 dispatchEvent(Event::create(EventTypeNames::longtasktimingbufferfull)); | |
| 203 } | |
| 204 | |
| 205 static bool passesTimingAllowCheck( | 192 static bool passesTimingAllowCheck( |
| 206 const ResourceResponse& response, | 193 const ResourceResponse& response, |
| 207 const SecurityOrigin& initiatorSecurityOrigin, | 194 const SecurityOrigin& initiatorSecurityOrigin, |
| 208 const AtomicString& originalTimingAllowOrigin, | 195 const AtomicString& originalTimingAllowOrigin, |
| 209 ExecutionContext* context) { | 196 ExecutionContext* context) { |
| 210 RefPtr<SecurityOrigin> resourceOrigin = | 197 RefPtr<SecurityOrigin> resourceOrigin = |
| 211 SecurityOrigin::create(response.url()); | 198 SecurityOrigin::create(response.url()); |
| 212 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) | 199 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) |
| 213 return true; | 200 return true; |
| 214 | 201 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 } | 343 } |
| 357 | 344 |
| 358 bool PerformanceBase::isFrameTimingBufferFull() { | 345 bool PerformanceBase::isFrameTimingBufferFull() { |
| 359 return m_frameTimingBuffer.size() >= m_frameTimingBufferSize; | 346 return m_frameTimingBuffer.size() >= m_frameTimingBufferSize; |
| 360 } | 347 } |
| 361 | 348 |
| 362 void PerformanceBase::addLongTaskTiming(double startTime, | 349 void PerformanceBase::addLongTaskTiming(double startTime, |
| 363 double endTime, | 350 double endTime, |
| 364 const String& name, | 351 const String& name, |
| 365 DOMWindow* culpritWindow) { | 352 DOMWindow* culpritWindow) { |
| 366 if (isLongTaskTimingBufferFull() || | 353 if (!hasObserverFor(PerformanceEntry::LongTask)) |
| 367 !hasObserverFor(PerformanceEntry::LongTask)) | |
| 368 return; | 354 return; |
| 369 PerformanceEntry* entry = PerformanceLongTaskTiming::create( | 355 PerformanceEntry* entry = PerformanceLongTaskTiming::create( |
| 370 monotonicTimeToDOMHighResTimeStampInMillis(startTime), | 356 monotonicTimeToDOMHighResTimeStampInMillis(startTime), |
| 371 monotonicTimeToDOMHighResTimeStampInMillis(endTime), name, culpritWindow); | 357 monotonicTimeToDOMHighResTimeStampInMillis(endTime), name, culpritWindow); |
| 372 notifyObserversOfEntry(*entry); | 358 notifyObserversOfEntry(*entry); |
| 373 addLongTaskTimingBuffer(*entry); | |
| 374 } | |
| 375 | |
| 376 void PerformanceBase::addLongTaskTimingBuffer(PerformanceEntry& entry) { | |
| 377 m_longTaskTimingBuffer.append(&entry); | |
| 378 if (isLongTaskTimingBufferFull()) | |
| 379 dispatchEvent(Event::create(EventTypeNames::longtasktimingbufferfull)); | |
| 380 } | |
| 381 | |
| 382 bool PerformanceBase::isLongTaskTimingBufferFull() { | |
| 383 return m_longTaskTimingBuffer.size() >= m_longTaskTimingBufferSize; | |
| 384 } | 359 } |
| 385 | 360 |
| 386 void PerformanceBase::mark(const String& markName, | 361 void PerformanceBase::mark(const String& markName, |
| 387 ExceptionState& exceptionState) { | 362 ExceptionState& exceptionState) { |
| 388 if (!m_userTiming) | 363 if (!m_userTiming) |
| 389 m_userTiming = UserTiming::create(*this); | 364 m_userTiming = UserTiming::create(*this); |
| 390 if (PerformanceEntry* entry = m_userTiming->mark(markName, exceptionState)) | 365 if (PerformanceEntry* entry = m_userTiming->mark(markName, exceptionState)) |
| 391 notifyObserversOfEntry(*entry); | 366 notifyObserversOfEntry(*entry); |
| 392 } | 367 } |
| 393 | 368 |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 return monotonicTimeToDOMHighResTimeStamp(monotonicTime) * 1000; | 486 return monotonicTimeToDOMHighResTimeStamp(monotonicTime) * 1000; |
| 512 } | 487 } |
| 513 | 488 |
| 514 DOMHighResTimeStamp PerformanceBase::now() const { | 489 DOMHighResTimeStamp PerformanceBase::now() const { |
| 515 return monotonicTimeToDOMHighResTimeStamp(monotonicallyIncreasingTime()); | 490 return monotonicTimeToDOMHighResTimeStamp(monotonicallyIncreasingTime()); |
| 516 } | 491 } |
| 517 | 492 |
| 518 DEFINE_TRACE(PerformanceBase) { | 493 DEFINE_TRACE(PerformanceBase) { |
| 519 visitor->trace(m_frameTimingBuffer); | 494 visitor->trace(m_frameTimingBuffer); |
| 520 visitor->trace(m_resourceTimingBuffer); | 495 visitor->trace(m_resourceTimingBuffer); |
| 521 visitor->trace(m_longTaskTimingBuffer); | |
| 522 visitor->trace(m_userTiming); | 496 visitor->trace(m_userTiming); |
| 523 visitor->trace(m_observers); | 497 visitor->trace(m_observers); |
| 524 visitor->trace(m_activeObservers); | 498 visitor->trace(m_activeObservers); |
| 525 visitor->trace(m_suspendedObservers); | 499 visitor->trace(m_suspendedObservers); |
| 526 EventTargetWithInlineData::trace(visitor); | 500 EventTargetWithInlineData::trace(visitor); |
| 527 } | 501 } |
| 528 | 502 |
| 529 } // namespace blink | 503 } // namespace blink |
| OLD | NEW |