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 |