tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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