Performance.h (9548B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_Performance_h 8 #define mozilla_dom_Performance_h 9 10 #include "mozilla/Attributes.h" 11 #include "mozilla/DOMEventTargetHelper.h" 12 #include "nsCOMPtr.h" 13 #include "nsContentUtils.h" 14 #include "nsDOMNavigationTiming.h" 15 #include "nsTObserverArray.h" 16 17 class nsITimedChannel; 18 19 namespace mozilla { 20 21 class ErrorResult; 22 23 namespace dom { 24 25 class OwningStringOrDouble; 26 class StringOrPerformanceMeasureOptions; 27 class PerformanceEntry; 28 class PerformanceMark; 29 struct PerformanceMarkOptions; 30 struct PerformanceMeasureOptions; 31 class PerformanceMeasure; 32 class PerformanceNavigation; 33 class PerformancePaintTiming; 34 class PerformanceObserver; 35 class PerformanceService; 36 class PerformanceStorage; 37 class PerformanceTiming; 38 class PerformanceEventTiming; 39 class PerformanceInteractionMetrics; 40 class WorkerGlobalScope; 41 class EventCounts; 42 43 // Base class for main-thread and worker Performance API 44 class Performance : public DOMEventTargetHelper { 45 public: 46 NS_DECL_ISUPPORTS_INHERITED 47 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Performance, DOMEventTargetHelper) 48 49 static bool IsObserverEnabled(JSContext* aCx, JSObject* aGlobal); 50 51 static already_AddRefed<Performance> CreateForMainThread( 52 nsPIDOMWindowInner* aWindow, nsIPrincipal* aPrincipal, 53 nsDOMNavigationTiming* aDOMTiming, nsITimedChannel* aChannel); 54 55 static already_AddRefed<Performance> CreateForWorker( 56 WorkerGlobalScope* aGlobalScope); 57 58 // This will return nullptr if called outside of a Window or Worker. 59 static already_AddRefed<Performance> Get(JSContext* aCx, 60 nsIGlobalObject* aGlobal); 61 62 JSObject* WrapObject(JSContext* cx, 63 JS::Handle<JSObject*> aGivenProto) override; 64 65 virtual void GetEntries(nsTArray<RefPtr<PerformanceEntry>>& aRetval); 66 67 virtual void GetEntriesByType(const nsAString& aEntryType, 68 nsTArray<RefPtr<PerformanceEntry>>& aRetval); 69 70 virtual void GetEntriesByTypeForObserver( 71 const nsAString& aEntryType, nsTArray<RefPtr<PerformanceEntry>>& aRetval); 72 73 virtual void GetEntriesByName(const nsAString& aName, 74 const Optional<nsAString>& aEntryType, 75 nsTArray<RefPtr<PerformanceEntry>>& aRetval); 76 77 virtual PerformanceStorage* AsPerformanceStorage() = 0; 78 79 void ClearResourceTimings(); 80 81 DOMHighResTimeStamp Now(); 82 83 DOMHighResTimeStamp NowUnclamped() const; 84 85 DOMHighResTimeStamp TimeOrigin(); 86 87 already_AddRefed<PerformanceMark> Mark( 88 JSContext* aCx, const nsAString& aName, 89 const PerformanceMarkOptions& aMarkOptions, ErrorResult& aRv); 90 91 void ClearMarks(const Optional<nsAString>& aName); 92 93 already_AddRefed<PerformanceMeasure> Measure( 94 JSContext* aCx, const nsAString& aName, 95 const StringOrPerformanceMeasureOptions& aStartOrMeasureOptions, 96 const Optional<nsAString>& aEndMark, ErrorResult& aRv); 97 98 void ClearMeasures(const Optional<nsAString>& aName); 99 100 void SetResourceTimingBufferSize(uint64_t aMaxSize); 101 102 void AddObserver(PerformanceObserver* aObserver); 103 void RemoveObserver(PerformanceObserver* aObserver); 104 MOZ_CAN_RUN_SCRIPT void NotifyObservers(); 105 void CancelNotificationObservers(); 106 107 virtual PerformanceTiming* Timing() = 0; 108 109 virtual PerformanceNavigation* Navigation() = 0; 110 111 virtual void SetFCPTimingEntry(PerformancePaintTiming* aEntry) = 0; 112 113 IMPL_EVENT_HANDLER(resourcetimingbufferfull) 114 115 virtual void GetMozMemory(JSContext* aCx, 116 JS::MutableHandle<JSObject*> aObj) = 0; 117 118 virtual nsDOMNavigationTiming* GetDOMTiming() const = 0; 119 120 virtual nsITimedChannel* GetChannel() const = 0; 121 122 virtual TimeStamp CreationTimeStamp() const = 0; 123 124 RTPCallerType GetRTPCallerType() const { return mRTPCallerType; } 125 126 bool CrossOriginIsolated() const { return mCrossOriginIsolated; } 127 bool ShouldResistFingerprinting() const { 128 return mShouldResistFingerprinting; 129 } 130 131 DOMHighResTimeStamp TimeStampToDOMHighResForRendering(TimeStamp) const; 132 133 virtual uint64_t GetRandomTimelineSeed() = 0; 134 135 void MemoryPressure(); 136 137 size_t SizeOfUserEntries(mozilla::MallocSizeOf aMallocSizeOf) const; 138 size_t SizeOfResourceEntries(mozilla::MallocSizeOf aMallocSizeOf) const; 139 virtual size_t SizeOfEventEntries(mozilla::MallocSizeOf aMallocSizeOf) const { 140 return 0; 141 } 142 143 void InsertResourceEntry(PerformanceEntry* aEntry); 144 145 virtual void InsertEventTimingEntry(PerformanceEventTiming* aEntry) = 0; 146 147 virtual void BufferEventTimingEntryIfNeeded( 148 PerformanceEventTiming* aEntry) = 0; 149 150 virtual class EventCounts* EventCounts() = 0; 151 152 virtual uint64_t InteractionCount() = 0; 153 154 virtual void QueueNavigationTimingEntry() = 0; 155 156 virtual void UpdateNavigationTimingEntry() = 0; 157 158 virtual void DispatchPendingEventTimingEntries() = 0; 159 160 virtual PerformanceInteractionMetrics& GetPerformanceInteractionMetrics() = 0; 161 162 virtual void SetInteractionId(PerformanceEventTiming* aEventTiming, 163 const WidgetEvent* aEvent) = 0; 164 165 void QueueNotificationObserversTask(); 166 167 bool IsPerformanceTimingAttribute(const nsAString& aName) const; 168 169 virtual bool IsGlobalObjectWindow() const { return false; }; 170 171 protected: 172 Performance(nsIGlobalObject* aGlobal); 173 Performance(nsPIDOMWindowInner* aWindow); 174 175 virtual ~Performance(); 176 177 virtual void InsertUserEntry(PerformanceEntry* aEntry); 178 179 void ClearUserEntries(const Optional<nsAString>& aEntryName, 180 const nsAString& aEntryType); 181 182 virtual void DispatchResourceTimingBufferFullEvent() = 0; 183 184 virtual DOMHighResTimeStamp CreationTime() const = 0; 185 186 virtual DOMHighResTimeStamp GetPerformanceTimingFromString( 187 const nsAString& aTimingName) { 188 return 0; 189 } 190 191 void LogEntry(PerformanceEntry* aEntry, const nsACString& aOwner) const; 192 void TimingNotification(PerformanceEntry* aEntry, const nsACString& aOwner, 193 const double aEpoch); 194 195 void RunNotificationObserversTask(); 196 void QueueEntry(PerformanceEntry* aEntry); 197 198 nsTObserverArray<RefPtr<PerformanceObserver>> mObservers; 199 200 protected: 201 static const uint64_t kDefaultResourceTimingBufferSize = 250; 202 203 // When kDefaultResourceTimingBufferSize is increased or removed, these should 204 // be changed to use SegmentedVector 205 AutoTArray<RefPtr<PerformanceEntry>, kDefaultResourceTimingBufferSize> 206 mUserEntries; 207 AutoTArray<RefPtr<PerformanceEntry>, kDefaultResourceTimingBufferSize> 208 mResourceEntries; 209 AutoTArray<RefPtr<PerformanceEntry>, kDefaultResourceTimingBufferSize> 210 mSecondaryResourceEntries; 211 212 uint64_t mResourceTimingBufferSize; 213 bool mPendingNotificationObserversTask; 214 215 bool mPendingResourceTimingBufferFullEvent; 216 217 RefPtr<PerformanceService> mPerformanceService; 218 219 const RTPCallerType mRTPCallerType; 220 const bool mCrossOriginIsolated; 221 const bool mShouldResistFingerprinting; 222 223 private: 224 MOZ_ALWAYS_INLINE bool CanAddResourceTimingEntry(); 225 void ResourceTimingBufferFullEvent(); 226 void MaybeEmitExternalProfilerMarker( 227 const nsAString& aName, Maybe<const PerformanceMeasureOptions&> aOptions, 228 Maybe<const nsAString&> aStartMark, const Optional<nsAString>& aEndMark); 229 void MaybeAddProfileMarker( 230 const nsAString& aName, 231 const Maybe<const PerformanceMeasureOptions&>& options, 232 const Maybe<const nsAString&>& startMark, 233 const Optional<nsAString>& aEndMark); 234 void AddProfileMarker(const nsAString& aName, 235 const Maybe<const PerformanceMeasureOptions&>& options, 236 const Maybe<const nsAString&>& startMark, 237 const Optional<nsAString>& aEndMark); 238 239 // The attributes of a PerformanceMeasureOptions that we call 240 // ResolveTimestamp* on. 241 enum class ResolveTimestampAttribute; 242 243 DOMHighResTimeStamp ConvertMarkToTimestampWithString(const nsAString& aName, 244 ErrorResult& aRv, 245 bool aReturnUnclamped); 246 DOMHighResTimeStamp ConvertMarkToTimestampWithDOMHighResTimeStamp( 247 const ResolveTimestampAttribute aAttribute, const double aTimestamp, 248 ErrorResult& aRv); 249 DOMHighResTimeStamp ConvertMarkToTimestamp( 250 const ResolveTimestampAttribute aAttribute, 251 const OwningStringOrDouble& aMarkNameOrTimestamp, ErrorResult& aRv, 252 bool aReturnUnclamped); 253 254 DOMHighResTimeStamp ConvertNameToTimestamp(const nsAString& aName, 255 ErrorResult& aRv); 256 257 DOMHighResTimeStamp ResolveEndTimeForMeasure( 258 const Optional<nsAString>& aEndMark, 259 const Maybe<const PerformanceMeasureOptions&>& aOptions, ErrorResult& aRv, 260 bool aReturnUnclamped); 261 DOMHighResTimeStamp ResolveStartTimeForMeasure( 262 const Maybe<const nsAString&>& aStartMark, 263 const Maybe<const PerformanceMeasureOptions&>& aOptions, ErrorResult& aRv, 264 bool aReturnUnclamped); 265 266 Maybe<std::pair<TimeStamp, TimeStamp>> GetTimeStampsForMarker( 267 const Maybe<const nsAString&>& aStartMark, 268 const Optional<nsAString>& aEndMark, 269 const Maybe<const PerformanceMeasureOptions&>& aOptions); 270 }; 271 272 } // namespace dom 273 } // namespace mozilla 274 275 #endif // mozilla_dom_Performance_h