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)) |
| 348 return; |
| 349 PerformanceEntry* entry = PerformanceLongTaskTiming::create( |
| 350 monotonicTimeToDOMHighResTimeStampInMillis(startTime), |
| 351 monotonicTimeToDOMHighResTimeStampInMillis(endTime), |
| 352 frameContextUrl); |
| 353 notifyObserversOfEntry(*entry); |
| 354 addLongTaskTimingBuffer(*entry); |
| 355 } |
| 356 |
| 357 void PerformanceBase::addLongTaskTimingBuffer(PerformanceEntry& entry) |
| 358 { |
| 359 m_longTaskTimingBuffer.append(&entry); |
| 360 if (isLongTaskTimingBufferFull()) |
| 361 dispatchEvent(Event::create(EventTypeNames::longtasktimingbufferfull)); |
| 362 } |
| 363 |
| 364 bool PerformanceBase::isLongTaskTimingBufferFull() |
| 365 { |
| 366 return m_longTaskTimingBuffer.size() >= m_longTaskTimingBufferSize; |
| 367 } |
| 368 |
325 void PerformanceBase::mark(const String& markName, ExceptionState& exceptionStat
e) | 369 void PerformanceBase::mark(const String& markName, ExceptionState& exceptionStat
e) |
326 { | 370 { |
327 if (!m_userTiming) | 371 if (!m_userTiming) |
328 m_userTiming = UserTiming::create(*this); | 372 m_userTiming = UserTiming::create(*this); |
329 if (PerformanceEntry* entry = m_userTiming->mark(markName, exceptionState)) | 373 if (PerformanceEntry* entry = m_userTiming->mark(markName, exceptionState)) |
330 notifyObserversOfEntry(*entry); | 374 notifyObserversOfEntry(*entry); |
331 } | 375 } |
332 | 376 |
333 void PerformanceBase::clearMarks(const String& markName) | 377 void PerformanceBase::clearMarks(const String& markName) |
334 { | 378 { |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 DOMHighResTimeStamp PerformanceBase::monotonicTimeToDOMHighResTimeStamp(double m
onotonicTime) const | 482 DOMHighResTimeStamp PerformanceBase::monotonicTimeToDOMHighResTimeStamp(double m
onotonicTime) const |
439 { | 483 { |
440 // Avoid exposing raw platform timestamps. | 484 // Avoid exposing raw platform timestamps. |
441 if (m_timeOrigin == 0.0) | 485 if (m_timeOrigin == 0.0) |
442 return 0.0; | 486 return 0.0; |
443 | 487 |
444 double timeInSeconds = monotonicTime - m_timeOrigin; | 488 double timeInSeconds = monotonicTime - m_timeOrigin; |
445 return convertSecondsToDOMHighResTimeStamp(clampTimeResolution(timeInSeconds
)); | 489 return convertSecondsToDOMHighResTimeStamp(clampTimeResolution(timeInSeconds
)); |
446 } | 490 } |
447 | 491 |
| 492 double PerformanceBase::monotonicTimeToDOMHighResTimeStampInMillis( |
| 493 DOMHighResTimeStamp monotonicTime) const |
| 494 { |
| 495 return monotonicTimeToDOMHighResTimeStamp(monotonicTime) * 1000; |
| 496 } |
| 497 |
448 DOMHighResTimeStamp PerformanceBase::now() const | 498 DOMHighResTimeStamp PerformanceBase::now() const |
449 { | 499 { |
450 return monotonicTimeToDOMHighResTimeStamp(monotonicallyIncreasingTime()); | 500 return monotonicTimeToDOMHighResTimeStamp(monotonicallyIncreasingTime()); |
451 } | 501 } |
452 | 502 |
453 DEFINE_TRACE(PerformanceBase) | 503 DEFINE_TRACE(PerformanceBase) |
454 { | 504 { |
455 visitor->trace(m_frameTimingBuffer); | 505 visitor->trace(m_frameTimingBuffer); |
456 visitor->trace(m_resourceTimingBuffer); | 506 visitor->trace(m_resourceTimingBuffer); |
| 507 visitor->trace(m_longTaskTimingBuffer); |
457 visitor->trace(m_userTiming); | 508 visitor->trace(m_userTiming); |
458 visitor->trace(m_observers); | 509 visitor->trace(m_observers); |
459 visitor->trace(m_activeObservers); | 510 visitor->trace(m_activeObservers); |
460 visitor->trace(m_suspendedObservers); | 511 visitor->trace(m_suspendedObservers); |
461 EventTargetWithInlineData::trace(visitor); | 512 EventTargetWithInlineData::trace(visitor); |
462 } | 513 } |
463 | 514 |
464 } // namespace blink | 515 } // namespace blink |
OLD | NEW |