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_PerformanceMainThread_h
8 #define mozilla_dom_PerformanceMainThread_h
9 
10 #include "Performance.h"
11 #include "PerformanceStorage.h"
12 
13 namespace mozilla {
14 namespace dom {
15 
16 class PerformanceNavigationTiming;
17 class PerformanceEventTiming;
18 
19 class PerformanceMainThread final : public Performance,
20                                     public PerformanceStorage {
21  public:
22   PerformanceMainThread(nsPIDOMWindowInner* aWindow,
23                         nsDOMNavigationTiming* aDOMTiming,
24                         nsITimedChannel* aChannel, bool aPrincipal);
25 
26   NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(PerformanceMainThread,Performance)27   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(PerformanceMainThread,
28                                                          Performance)
29 
30   PerformanceStorage* AsPerformanceStorage() override { return this; }
31 
32   virtual PerformanceTiming* Timing() override;
33 
34   virtual PerformanceNavigation* Navigation() override;
35 
36   virtual void AddEntry(nsIHttpChannel* channel,
37                         nsITimedChannel* timedChannel) override;
38 
39   // aData must be non-null.
40   virtual void AddEntry(const nsString& entryName,
41                         const nsString& initiatorType,
42                         UniquePtr<PerformanceTimingData>&& aData) override;
43 
44   // aPerformanceTimingData must be non-null.
45   void AddRawEntry(UniquePtr<PerformanceTimingData> aPerformanceTimingData,
46                    const nsAString& aInitiatorType,
47                    const nsAString& aEntryName);
48   virtual void SetFCPTimingEntry(PerformancePaintTiming* aEntry) override;
49 
50   void InsertEventTimingEntry(PerformanceEventTiming*) override;
51   void BufferEventTimingEntryIfNeeded(PerformanceEventTiming*) override;
52   void DispatchPendingEventTimingEntries() override;
53 
54   TimeStamp CreationTimeStamp() const override;
55 
56   DOMHighResTimeStamp CreationTime() const override;
57 
58   virtual void GetMozMemory(JSContext* aCx,
59                             JS::MutableHandle<JSObject*> aObj) override;
60 
GetDOMTiming()61   virtual nsDOMNavigationTiming* GetDOMTiming() const override {
62     return mDOMTiming;
63   }
64 
GetRandomTimelineSeed()65   virtual uint64_t GetRandomTimelineSeed() override {
66     return GetDOMTiming()->GetRandomTimelineSeed();
67   }
68 
GetChannel()69   virtual nsITimedChannel* GetChannel() const override { return mChannel; }
70 
71   // The GetEntries* methods need to be overriden in order to add the
72   // the document entry of type navigation.
73   virtual void GetEntries(nsTArray<RefPtr<PerformanceEntry>>& aRetval) override;
74 
75   // Return entries which qualify availableFromTimeline boolean check
76   virtual void GetEntriesByType(
77       const nsAString& aEntryType,
78       nsTArray<RefPtr<PerformanceEntry>>& aRetval) override;
79 
80   // There are entries that we don't want expose via performance, however
81   // we do want PerformanceObserver to get them
82   void GetEntriesByTypeForObserver(
83       const nsAString& aEntryType,
84       nsTArray<RefPtr<PerformanceEntry>>& aRetval) override;
85   virtual void GetEntriesByName(
86       const nsAString& aName, const Optional<nsAString>& aEntryType,
87       nsTArray<RefPtr<PerformanceEntry>>& aRetval) override;
88 
89   void UpdateNavigationTimingEntry() override;
90   void QueueNavigationTimingEntry() override;
91 
92   bool CrossOriginIsolated() const override;
93 
94   size_t SizeOfEventEntries(mozilla::MallocSizeOf aMallocSizeOf) const override;
95 
96   static constexpr uint32_t kDefaultEventTimingBufferSize = 150;
97   static constexpr uint32_t kDefaultEventTimingDurationThreshold = 104;
98   static constexpr double kDefaultEventTimingMinDuration = 16.0;
99 
100   class EventCounts* EventCounts() override;
101 
102  protected:
103   ~PerformanceMainThread();
104 
105   void CreateNavigationTimingEntry();
106 
107   void InsertUserEntry(PerformanceEntry* aEntry) override;
108 
109   bool IsPerformanceTimingAttribute(const nsAString& aName) override;
110 
111   DOMHighResTimeStamp GetPerformanceTimingFromString(
112       const nsAString& aTimingName) override;
113 
114   void DispatchBufferFullEvent() override;
115 
116   RefPtr<PerformanceNavigationTiming> mDocEntry;
117   RefPtr<nsDOMNavigationTiming> mDOMTiming;
118   nsCOMPtr<nsITimedChannel> mChannel;
119   RefPtr<PerformanceTiming> mTiming;
120   RefPtr<PerformanceNavigation> mNavigation;
121   RefPtr<PerformancePaintTiming> mFCPTiming;
122   JS::Heap<JSObject*> mMozMemory;
123 
124   const bool mCrossOriginIsolated;
125 
126   nsTArray<RefPtr<PerformanceEventTiming>> mEventTimingEntries;
127 
128   AutoCleanLinkedList<RefPtr<PerformanceEventTiming>>
129       mPendingEventTimingEntries;
130   bool mHasDispatchedInputEvent = false;
131 
132   RefPtr<PerformanceEventTiming> mFirstInputEvent;
133   RefPtr<PerformanceEventTiming> mPendingPointerDown;
134 
135  private:
136   bool mHasQueuedRefreshdriverObserver = false;
137 
138   RefPtr<class EventCounts> mEventCounts;
139   void IncEventCount(const nsAtom* aType);
140 
141   PresShell* GetPresShell();
142 };
143 
144 }  // namespace dom
145 }  // namespace mozilla
146 
147 #endif  // mozilla_dom_PerformanceMainThread_h
148