Bug 1852740: add tests for the `fetchpriority` attribute in Link headers. r=necko...
[gecko.git] / dom / base / nsDOMNavigationTiming.h
blobaea10f9af8b6b231e2ec09311abce175b7feba57
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/. */
7 #ifndef nsDOMNavigationTiming_h___
8 #define nsDOMNavigationTiming_h___
10 #include "nsCOMPtr.h"
11 #include "nsCOMArray.h"
12 #include "mozilla/WeakPtr.h"
13 #include "mozilla/RelativeTimeline.h"
14 #include "mozilla/TimeStamp.h"
15 #include "nsITimer.h"
17 class nsDocShell;
18 class nsIURI;
20 using DOMTimeMilliSec = unsigned long long;
21 using DOMHighResTimeStamp = double;
23 class PickleIterator;
24 namespace IPC {
25 class Message;
26 class MessageReader;
27 class MessageWriter;
28 } // namespace IPC
29 namespace mozilla::ipc {
30 class IProtocol;
31 template <typename>
32 struct IPDLParamTraits;
33 } // namespace mozilla::ipc
35 class nsDOMNavigationTiming final : public mozilla::RelativeTimeline {
36 public:
37 enum Type {
38 TYPE_NAVIGATE = 0,
39 TYPE_RELOAD = 1,
40 TYPE_BACK_FORWARD = 2,
41 TYPE_RESERVED = 255,
44 explicit nsDOMNavigationTiming(nsDocShell* aDocShell);
46 NS_INLINE_DECL_REFCOUNTING(nsDOMNavigationTiming)
48 Type GetType() const { return mNavigationType; }
50 inline DOMHighResTimeStamp GetNavigationStartHighRes() const {
51 return mNavigationStartHighRes;
54 DOMTimeMilliSec GetNavigationStart() const {
55 return static_cast<int64_t>(GetNavigationStartHighRes());
58 mozilla::TimeStamp GetNavigationStartTimeStamp() const {
59 return mNavigationStart;
62 mozilla::TimeStamp GetLoadEventStartTimeStamp() const {
63 return mLoadEventStart;
66 mozilla::TimeStamp GetDOMContentLoadedEventStartTimeStamp() const {
67 return mDOMContentLoadedEventStart;
70 mozilla::TimeStamp GetFirstContentfulCompositeTimeStamp() const {
71 return mContentfulComposite;
74 DOMTimeMilliSec GetUnloadEventStart() {
75 return TimeStampToDOM(GetUnloadEventStartTimeStamp());
78 DOMTimeMilliSec GetUnloadEventEnd() {
79 return TimeStampToDOM(GetUnloadEventEndTimeStamp());
82 DOMTimeMilliSec GetDomLoading() const { return TimeStampToDOM(mDOMLoading); }
83 DOMTimeMilliSec GetDomInteractive() const {
84 return TimeStampToDOM(mDOMInteractive);
86 DOMTimeMilliSec GetDomContentLoadedEventStart() const {
87 return TimeStampToDOM(mDOMContentLoadedEventStart);
89 DOMTimeMilliSec GetDomContentLoadedEventEnd() const {
90 return TimeStampToDOM(mDOMContentLoadedEventEnd);
92 DOMTimeMilliSec GetDomComplete() const {
93 return TimeStampToDOM(mDOMComplete);
95 DOMTimeMilliSec GetLoadEventStart() const {
96 return TimeStampToDOM(mLoadEventStart);
98 DOMTimeMilliSec GetLoadEventEnd() const {
99 return TimeStampToDOM(mLoadEventEnd);
101 DOMTimeMilliSec GetTimeToNonBlankPaint() const {
102 return TimeStampToDOM(mNonBlankPaint);
104 DOMTimeMilliSec GetTimeToContentfulComposite() const {
105 return TimeStampToDOM(mContentfulComposite);
107 DOMTimeMilliSec GetTimeToTTFI() const { return TimeStampToDOM(mTTFI); }
108 DOMTimeMilliSec GetTimeToDOMContentFlushed() const {
109 return TimeStampToDOM(mDOMContentFlushed);
112 DOMHighResTimeStamp GetUnloadEventStartHighRes() {
113 mozilla::TimeStamp stamp = GetUnloadEventStartTimeStamp();
114 if (stamp.IsNull()) {
115 return 0;
117 return TimeStampToDOMHighRes(stamp);
119 DOMHighResTimeStamp GetUnloadEventEndHighRes() {
120 mozilla::TimeStamp stamp = GetUnloadEventEndTimeStamp();
121 if (stamp.IsNull()) {
122 return 0;
124 return TimeStampToDOMHighRes(stamp);
126 DOMHighResTimeStamp GetDomInteractiveHighRes() const {
127 return TimeStampToDOMHighRes(mDOMInteractive);
129 DOMHighResTimeStamp GetDomContentLoadedEventStartHighRes() const {
130 return TimeStampToDOMHighRes(mDOMContentLoadedEventStart);
132 DOMHighResTimeStamp GetDomContentLoadedEventEndHighRes() const {
133 return TimeStampToDOMHighRes(mDOMContentLoadedEventEnd);
135 DOMHighResTimeStamp GetDomCompleteHighRes() const {
136 return TimeStampToDOMHighRes(mDOMComplete);
138 DOMHighResTimeStamp GetLoadEventStartHighRes() const {
139 return TimeStampToDOMHighRes(mLoadEventStart);
141 DOMHighResTimeStamp GetLoadEventEndHighRes() const {
142 return TimeStampToDOMHighRes(mLoadEventEnd);
145 enum class DocShellState : uint8_t { eActive, eInactive };
147 void NotifyNavigationStart(DocShellState aDocShellState);
148 void NotifyFetchStart(nsIURI* aURI, Type aNavigationType);
149 // A restoration occurs when the document is loaded from the
150 // bfcache. This method sets the appropriate parameters of the
151 // navigation timing object in this case.
152 void NotifyRestoreStart();
153 void NotifyBeforeUnload();
154 void NotifyUnloadAccepted(nsIURI* aOldURI);
155 void NotifyUnloadEventStart();
156 void NotifyUnloadEventEnd();
157 void NotifyLoadEventStart();
158 void NotifyLoadEventEnd();
160 // Document changes state to 'loading' before connecting to timing
161 void SetDOMLoadingTimeStamp(nsIURI* aURI, mozilla::TimeStamp aValue);
162 void NotifyDOMLoading(nsIURI* aURI);
163 void NotifyDOMInteractive(nsIURI* aURI);
164 void NotifyDOMComplete(nsIURI* aURI);
165 void NotifyDOMContentLoadedStart(nsIURI* aURI);
166 void NotifyDOMContentLoadedEnd(nsIURI* aURI);
168 static void TTITimeoutCallback(nsITimer* aTimer, void* aClosure);
169 void TTITimeout(nsITimer* aTimer);
171 void NotifyLongTask(mozilla::TimeStamp aWhen);
172 void NotifyNonBlankPaintForRootContentDocument();
173 void NotifyContentfulCompositeForRootContentDocument(
174 const mozilla::TimeStamp& aCompositeEndTime);
175 void NotifyDOMContentFlushedForRootContentDocument();
176 void NotifyDocShellStateChanged(DocShellState aDocShellState);
178 DOMTimeMilliSec TimeStampToDOM(mozilla::TimeStamp aStamp) const;
180 inline DOMHighResTimeStamp TimeStampToDOMHighRes(
181 mozilla::TimeStamp aStamp) const {
182 if (aStamp.IsNull()) {
183 return 0;
185 mozilla::TimeDuration duration = aStamp - mNavigationStart;
186 return duration.ToMilliseconds();
189 // Called by the DocumentLoadListener before sending the timing information
190 // to the new content process.
191 void Anonymize(nsIURI* aFinalURI);
193 inline already_AddRefed<nsDOMNavigationTiming> CloneNavigationTime(
194 nsDocShell* aDocShell) const {
195 RefPtr<nsDOMNavigationTiming> timing = new nsDOMNavigationTiming(aDocShell);
196 timing->mNavigationStartHighRes = mNavigationStartHighRes;
197 timing->mNavigationStart = mNavigationStart;
198 return timing.forget();
201 bool DocShellHasBeenActiveSinceNavigationStart() {
202 return mDocShellHasBeenActiveSinceNavigationStart;
205 mozilla::TimeStamp LoadEventEnd() { return mLoadEventEnd; }
207 private:
208 friend class nsDocShell;
209 nsDOMNavigationTiming(nsDocShell* aDocShell, nsDOMNavigationTiming* aOther);
210 nsDOMNavigationTiming(const nsDOMNavigationTiming&) = delete;
211 ~nsDOMNavigationTiming();
213 void Clear();
215 mozilla::TimeStamp GetUnloadEventStartTimeStamp() const;
216 mozilla::TimeStamp GetUnloadEventEndTimeStamp() const;
218 bool IsTopLevelContentDocumentInContentProcess() const;
220 // Should those be amended, the IPC serializer should be updated
221 // accordingly.
222 mozilla::WeakPtr<nsDocShell> mDocShell;
224 nsCOMPtr<nsIURI> mUnloadedURI;
225 nsCOMPtr<nsIURI> mLoadedURI;
226 nsCOMPtr<nsITimer> mTTITimer;
228 Type mNavigationType;
229 DOMHighResTimeStamp mNavigationStartHighRes;
230 mozilla::TimeStamp mNavigationStart;
231 mozilla::TimeStamp mNonBlankPaint;
232 mozilla::TimeStamp mContentfulComposite;
233 mozilla::TimeStamp mDOMContentFlushed;
235 mozilla::TimeStamp mBeforeUnloadStart;
236 mozilla::TimeStamp mUnloadStart;
237 mozilla::TimeStamp mUnloadEnd;
238 mozilla::TimeStamp mLoadEventStart;
239 mozilla::TimeStamp mLoadEventEnd;
241 mozilla::TimeStamp mDOMLoading;
242 mozilla::TimeStamp mDOMInteractive;
243 mozilla::TimeStamp mDOMContentLoadedEventStart;
244 mozilla::TimeStamp mDOMContentLoadedEventEnd;
245 mozilla::TimeStamp mDOMComplete;
247 mozilla::TimeStamp mTTFI;
249 bool mDocShellHasBeenActiveSinceNavigationStart;
251 friend struct mozilla::ipc::IPDLParamTraits<nsDOMNavigationTiming*>;
254 // IPDL serializer. Please be aware of the caveats in sending across
255 // the information and the potential resulting data leakage.
256 // For now, this serializer is to only be used under a very narrowed scope
257 // so that only the starting times are ever set.
258 namespace mozilla::ipc {
259 template <>
260 struct IPDLParamTraits<nsDOMNavigationTiming*> {
261 static void Write(IPC::MessageWriter* aWriter, IProtocol* aActor,
262 nsDOMNavigationTiming* aParam);
263 static bool Read(IPC::MessageReader* aReader, IProtocol* aActor,
264 RefPtr<nsDOMNavigationTiming>* aResult);
267 } // namespace mozilla::ipc
269 #endif /* nsDOMNavigationTiming_h___ */