Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "nsDOMNavigationTiming.h"
7 #include "nsPerformance.h"
8 #include "nsCOMPtr.h"
9 #include "nsContentUtils.h"
10 #include "nsIScriptSecurityManager.h"
11 #include "prtime.h"
12 #include "nsIURI.h"
13 #include "mozilla/TimeStamp.h"
15 nsDOMNavigationTiming::nsDOMNavigationTiming()
16 {
17 Clear();
18 }
20 nsDOMNavigationTiming::~nsDOMNavigationTiming()
21 {
22 }
24 void
25 nsDOMNavigationTiming::Clear()
26 {
27 mNavigationType = mozilla::dom::PerformanceNavigation::TYPE_RESERVED;
28 mNavigationStartHighRes = 0;
29 mBeforeUnloadStart = 0;
30 mUnloadStart = 0;
31 mUnloadEnd = 0;
32 mLoadEventStart = 0;
33 mLoadEventEnd = 0;
34 mDOMLoading = 0;
35 mDOMInteractive = 0;
36 mDOMContentLoadedEventStart = 0;
37 mDOMContentLoadedEventEnd = 0;
38 mDOMComplete = 0;
40 mLoadEventStartSet = false;
41 mLoadEventEndSet = false;
42 mDOMLoadingSet = false;
43 mDOMInteractiveSet = false;
44 mDOMContentLoadedEventStartSet = false;
45 mDOMContentLoadedEventEndSet = false;
46 mDOMCompleteSet = false;
47 }
49 DOMTimeMilliSec
50 nsDOMNavigationTiming::TimeStampToDOM(mozilla::TimeStamp aStamp) const
51 {
52 if (aStamp.IsNull()) {
53 return 0;
54 }
55 mozilla::TimeDuration duration = aStamp - mNavigationStartTimeStamp;
56 return GetNavigationStart() + static_cast<int64_t>(duration.ToMilliseconds());
57 }
59 DOMTimeMilliSec nsDOMNavigationTiming::DurationFromStart(){
60 return TimeStampToDOM(mozilla::TimeStamp::Now());
61 }
63 void
64 nsDOMNavigationTiming::NotifyNavigationStart()
65 {
66 mNavigationStartHighRes = (double)PR_Now() / PR_USEC_PER_MSEC;
67 mNavigationStartTimeStamp = mozilla::TimeStamp::Now();
68 }
70 void
71 nsDOMNavigationTiming::NotifyFetchStart(nsIURI* aURI, nsDOMPerformanceNavigationType aNavigationType)
72 {
73 mNavigationType = aNavigationType;
74 // At the unload event time we don't really know the loading uri.
75 // Need it for later check for unload timing access.
76 mLoadedURI = aURI;
77 }
79 void
80 nsDOMNavigationTiming::NotifyBeforeUnload()
81 {
82 mBeforeUnloadStart = DurationFromStart();
83 }
85 void
86 nsDOMNavigationTiming::NotifyUnloadAccepted(nsIURI* aOldURI)
87 {
88 mUnloadStart = mBeforeUnloadStart;
89 mUnloadedURI = aOldURI;
90 }
92 void
93 nsDOMNavigationTiming::NotifyUnloadEventStart()
94 {
95 mUnloadStart = DurationFromStart();
96 }
98 void
99 nsDOMNavigationTiming::NotifyUnloadEventEnd()
100 {
101 mUnloadEnd = DurationFromStart();
102 }
104 void
105 nsDOMNavigationTiming::NotifyLoadEventStart()
106 {
107 if (!mLoadEventStartSet) {
108 mLoadEventStart = DurationFromStart();
109 mLoadEventStartSet = true;
110 }
111 }
113 void
114 nsDOMNavigationTiming::NotifyLoadEventEnd()
115 {
116 if (!mLoadEventEndSet) {
117 mLoadEventEnd = DurationFromStart();
118 mLoadEventEndSet = true;
119 }
120 }
122 void
123 nsDOMNavigationTiming::SetDOMLoadingTimeStamp(nsIURI* aURI, mozilla::TimeStamp aValue)
124 {
125 if (!mDOMLoadingSet) {
126 mLoadedURI = aURI;
127 mDOMLoading = TimeStampToDOM(aValue);
128 mDOMLoadingSet = true;
129 }
130 }
132 void
133 nsDOMNavigationTiming::NotifyDOMLoading(nsIURI* aURI)
134 {
135 if (!mDOMLoadingSet) {
136 mLoadedURI = aURI;
137 mDOMLoading = DurationFromStart();
138 mDOMLoadingSet = true;
139 }
140 }
142 void
143 nsDOMNavigationTiming::NotifyDOMInteractive(nsIURI* aURI)
144 {
145 if (!mDOMInteractiveSet) {
146 mLoadedURI = aURI;
147 mDOMInteractive = DurationFromStart();
148 mDOMInteractiveSet = true;
149 }
150 }
152 void
153 nsDOMNavigationTiming::NotifyDOMComplete(nsIURI* aURI)
154 {
155 if (!mDOMCompleteSet) {
156 mLoadedURI = aURI;
157 mDOMComplete = DurationFromStart();
158 mDOMCompleteSet = true;
159 }
160 }
162 void
163 nsDOMNavigationTiming::NotifyDOMContentLoadedStart(nsIURI* aURI)
164 {
165 if (!mDOMContentLoadedEventStartSet) {
166 mLoadedURI = aURI;
167 mDOMContentLoadedEventStart = DurationFromStart();
168 mDOMContentLoadedEventStartSet = true;
169 }
170 }
172 void
173 nsDOMNavigationTiming::NotifyDOMContentLoadedEnd(nsIURI* aURI)
174 {
175 if (!mDOMContentLoadedEventEndSet) {
176 mLoadedURI = aURI;
177 mDOMContentLoadedEventEnd = DurationFromStart();
178 mDOMContentLoadedEventEndSet = true;
179 }
180 }
182 DOMTimeMilliSec
183 nsDOMNavigationTiming::GetUnloadEventStart()
184 {
185 nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
186 nsresult rv = ssm->CheckSameOriginURI(mLoadedURI, mUnloadedURI, false);
187 if (NS_SUCCEEDED(rv)) {
188 return mUnloadStart;
189 }
190 return 0;
191 }
193 DOMTimeMilliSec
194 nsDOMNavigationTiming::GetUnloadEventEnd()
195 {
196 nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
197 nsresult rv = ssm->CheckSameOriginURI(mLoadedURI, mUnloadedURI, false);
198 if (NS_SUCCEEDED(rv)) {
199 return mUnloadEnd;
200 }
201 return 0;
202 }