Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/base/nsDOMNavigationTiming.h
Line
Count
Source (jump to first uncovered line)
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 nsDOMNavigationTiming_h___
8
#define nsDOMNavigationTiming_h___
9
10
#include "nsCOMPtr.h"
11
#include "nsCOMArray.h"
12
#include "mozilla/WeakPtr.h"
13
#include "mozilla/RelativeTimeline.h"
14
#include "mozilla/TimeStamp.h"
15
16
class nsDocShell;
17
class nsIURI;
18
19
typedef unsigned long long DOMTimeMilliSec;
20
typedef double DOMHighResTimeStamp;
21
22
class nsDOMNavigationTiming final
23
  : public mozilla::RelativeTimeline
24
{
25
public:
26
  enum Type {
27
    TYPE_NAVIGATE = 0,
28
    TYPE_RELOAD = 1,
29
    TYPE_BACK_FORWARD = 2,
30
    TYPE_RESERVED = 255,
31
  };
32
33
  explicit nsDOMNavigationTiming(nsDocShell* aDocShell);
34
35
  NS_INLINE_DECL_REFCOUNTING(nsDOMNavigationTiming)
36
37
  Type GetType() const
38
0
  {
39
0
    return mNavigationType;
40
0
  }
41
42
  inline DOMHighResTimeStamp GetNavigationStartHighRes() const
43
0
  {
44
0
    return mNavigationStartHighRes;
45
0
  }
46
47
  DOMTimeMilliSec GetNavigationStart() const
48
0
  {
49
0
    return static_cast<int64_t>(GetNavigationStartHighRes());
50
0
  }
51
52
  mozilla::TimeStamp GetNavigationStartTimeStamp() const
53
0
  {
54
0
    return mNavigationStart;
55
0
  }
56
57
  DOMTimeMilliSec GetUnloadEventStart()
58
0
  {
59
0
    return TimeStampToDOM(GetUnloadEventStartTimeStamp());
60
0
  }
61
62
  DOMTimeMilliSec GetUnloadEventEnd()
63
0
  {
64
0
    return TimeStampToDOM(GetUnloadEventEndTimeStamp());
65
0
  }
66
67
  DOMTimeMilliSec GetDomLoading() const
68
0
  {
69
0
    return TimeStampToDOM(mDOMLoading);
70
0
  }
71
  DOMTimeMilliSec GetDomInteractive() const
72
0
  {
73
0
    return TimeStampToDOM(mDOMInteractive);
74
0
  }
75
  DOMTimeMilliSec GetDomContentLoadedEventStart() const
76
0
  {
77
0
    return TimeStampToDOM(mDOMContentLoadedEventStart);
78
0
  }
79
  DOMTimeMilliSec GetDomContentLoadedEventEnd() const
80
0
  {
81
0
    return TimeStampToDOM(mDOMContentLoadedEventEnd);
82
0
  }
83
  DOMTimeMilliSec GetDomComplete() const
84
0
  {
85
0
    return TimeStampToDOM(mDOMComplete);
86
0
  }
87
  DOMTimeMilliSec GetLoadEventStart() const
88
0
  {
89
0
    return TimeStampToDOM(mLoadEventStart);
90
0
  }
91
  DOMTimeMilliSec GetLoadEventEnd() const
92
0
  {
93
0
    return TimeStampToDOM(mLoadEventEnd);
94
0
  }
95
  DOMTimeMilliSec GetTimeToNonBlankPaint() const
96
0
  {
97
0
    return TimeStampToDOM(mNonBlankPaint);
98
0
  }
99
  DOMTimeMilliSec GetTimeToDOMContentFlushed() const
100
0
  {
101
0
    return TimeStampToDOM(mDOMContentFlushed);
102
0
  }
103
104
  DOMHighResTimeStamp GetUnloadEventStartHighRes()
105
  {
106
    mozilla::TimeStamp stamp = GetUnloadEventStartTimeStamp();
107
    if (stamp.IsNull()) {
108
      return 0;
109
    }
110
    return TimeStampToDOMHighRes(stamp);
111
  }
112
  DOMHighResTimeStamp GetUnloadEventEndHighRes()
113
  {
114
    mozilla::TimeStamp stamp = GetUnloadEventEndTimeStamp();
115
    if (stamp.IsNull()) {
116
      return 0;
117
    }
118
    return TimeStampToDOMHighRes(stamp);
119
  }
120
  DOMHighResTimeStamp GetDomInteractiveHighRes() const
121
  {
122
    return TimeStampToDOMHighRes(mDOMInteractive);
123
  }
124
  DOMHighResTimeStamp GetDomContentLoadedEventStartHighRes() const
125
  {
126
    return TimeStampToDOMHighRes(mDOMContentLoadedEventStart);
127
  }
128
  DOMHighResTimeStamp GetDomContentLoadedEventEndHighRes() const
129
  {
130
    return TimeStampToDOMHighRes(mDOMContentLoadedEventEnd);
131
  }
132
  DOMHighResTimeStamp GetDomCompleteHighRes() const
133
  {
134
    return TimeStampToDOMHighRes(mDOMComplete);
135
  }
136
  DOMHighResTimeStamp GetLoadEventStartHighRes() const
137
  {
138
    return TimeStampToDOMHighRes(mLoadEventStart);
139
  }
140
  DOMHighResTimeStamp GetLoadEventEndHighRes() const
141
  {
142
    return TimeStampToDOMHighRes(mLoadEventEnd);
143
  }
144
145
  enum class DocShellState : uint8_t {
146
    eActive,
147
    eInactive
148
  };
149
150
  void NotifyNavigationStart(DocShellState aDocShellState);
151
  void NotifyFetchStart(nsIURI* aURI, Type aNavigationType);
152
  void NotifyBeforeUnload();
153
  void NotifyUnloadAccepted(nsIURI* aOldURI);
154
  void NotifyUnloadEventStart();
155
  void NotifyUnloadEventEnd();
156
  void NotifyLoadEventStart();
157
  void NotifyLoadEventEnd();
158
159
  // Document changes state to 'loading' before connecting to timing
160
  void SetDOMLoadingTimeStamp(nsIURI* aURI, mozilla::TimeStamp aValue);
161
  void NotifyDOMLoading(nsIURI* aURI);
162
  void NotifyDOMInteractive(nsIURI* aURI);
163
  void NotifyDOMComplete(nsIURI* aURI);
164
  void NotifyDOMContentLoadedStart(nsIURI* aURI);
165
  void NotifyDOMContentLoadedEnd(nsIURI* aURI);
166
167
  void NotifyNonBlankPaintForRootContentDocument();
168
  void NotifyDOMContentFlushedForRootContentDocument();
169
  void NotifyDocShellStateChanged(DocShellState aDocShellState);
170
171
  DOMTimeMilliSec TimeStampToDOM(mozilla::TimeStamp aStamp) const;
172
173
  inline DOMHighResTimeStamp TimeStampToDOMHighRes(mozilla::TimeStamp aStamp) const
174
0
  {
175
0
    if (aStamp.IsNull()) {
176
0
      return 0;
177
0
    }
178
0
    mozilla::TimeDuration duration = aStamp - mNavigationStart;
179
0
    return duration.ToMilliseconds();
180
0
  }
181
182
private:
183
  nsDOMNavigationTiming(const nsDOMNavigationTiming &) = delete;
184
  ~nsDOMNavigationTiming();
185
186
  void Clear();
187
188
  mozilla::TimeStamp GetUnloadEventStartTimeStamp() const;
189
  mozilla::TimeStamp GetUnloadEventEndTimeStamp() const;
190
191
  bool IsTopLevelContentDocumentInContentProcess() const;
192
193
  mozilla::WeakPtr<nsDocShell> mDocShell;
194
195
  nsCOMPtr<nsIURI> mUnloadedURI;
196
  nsCOMPtr<nsIURI> mLoadedURI;
197
198
  Type mNavigationType;
199
  DOMHighResTimeStamp mNavigationStartHighRes;
200
  mozilla::TimeStamp mNavigationStart;
201
  mozilla::TimeStamp mNonBlankPaint;
202
  mozilla::TimeStamp mDOMContentFlushed;
203
204
  mozilla::TimeStamp mBeforeUnloadStart;
205
  mozilla::TimeStamp mUnloadStart;
206
  mozilla::TimeStamp mUnloadEnd;
207
  mozilla::TimeStamp mLoadEventStart;
208
  mozilla::TimeStamp mLoadEventEnd;
209
210
  mozilla::TimeStamp mDOMLoading;
211
  mozilla::TimeStamp mDOMInteractive;
212
  mozilla::TimeStamp mDOMContentLoadedEventStart;
213
  mozilla::TimeStamp mDOMContentLoadedEventEnd;
214
  mozilla::TimeStamp mDOMComplete;
215
216
  bool mDocShellHasBeenActiveSinceNavigationStart : 1;
217
};
218
219
#endif /* nsDOMNavigationTiming_h___ */