Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: third_party/WebKit/Source/core/timing/PerformanceBase.cpp

Issue 2244813002: LongTaskTiming: add idl, Experiment flag, PerformanceEntry and basic implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix merge issue in flags Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/timing/PerformanceBase.h ('k') | third_party/WebKit/Source/core/timing/PerformanceBaseTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698