summaryrefslogtreecommitdiffstats
path: root/dom/performance/PerformanceNavigationTiming.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/performance/PerformanceNavigationTiming.cpp')
-rw-r--r--dom/performance/PerformanceNavigationTiming.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/dom/performance/PerformanceNavigationTiming.cpp b/dom/performance/PerformanceNavigationTiming.cpp
new file mode 100644
index 0000000000..b379d8111c
--- /dev/null
+++ b/dom/performance/PerformanceNavigationTiming.cpp
@@ -0,0 +1,157 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/PerformanceNavigationTiming.h"
+#include "mozilla/dom/PerformanceNavigationTimingBinding.h"
+#include "mozilla/StaticPrefs_dom.h"
+#include "mozilla/StaticPrefs_privacy.h"
+
+using namespace mozilla::dom;
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PerformanceNavigationTiming)
+NS_INTERFACE_MAP_END_INHERITING(PerformanceResourceTiming)
+
+NS_IMPL_ADDREF_INHERITED(PerformanceNavigationTiming, PerformanceResourceTiming)
+NS_IMPL_RELEASE_INHERITED(PerformanceNavigationTiming,
+ PerformanceResourceTiming)
+
+JSObject* PerformanceNavigationTiming::WrapObject(
+ JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
+ return PerformanceNavigationTiming_Binding::Wrap(aCx, this, aGivenProto);
+}
+
+#define REDUCE_TIME_PRECISION \
+ return nsRFPService::ReduceTimePrecisionAsMSecs( \
+ rawValue, mPerformance->GetRandomTimelineSeed(), \
+ mPerformance->GetRTPCallerType())
+
+DOMHighResTimeStamp PerformanceNavigationTiming::UnloadEventStart() const {
+ DOMHighResTimeStamp rawValue = 0;
+ /*
+ * Per Navigation Timing Level 2, the value is 0 if
+ * a. there is no previous document or
+ * b. the same-origin-check fails.
+ *
+ * The same-origin-check is defined as:
+ * 1. If the previous document exists and its origin is not same
+ * origin as the current document's origin, return "fail".
+ * 2. Let request be the current document's request.
+ * 3. If request's redirect count is not zero, and all of request's
+ * HTTP redirects have the same origin as the current document,
+ * return "pass".
+ * 4. Otherwise, return "fail".
+ */
+ if (mTimingData->AllRedirectsSameOrigin()) { // same-origin-check:2/3
+ /*
+ * GetUnloadEventStartHighRes returns 0 if
+ * 1. there is no previous document (a, above) or
+ * 2. the current URI does not have the same origin as
+ * the previous document's URI. (same-origin-check:1)
+ */
+ rawValue = mPerformance->GetDOMTiming()->GetUnloadEventStartHighRes();
+ }
+
+ REDUCE_TIME_PRECISION;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::UnloadEventEnd() const {
+ DOMHighResTimeStamp rawValue = 0;
+
+ // See comments in PerformanceNavigationTiming::UnloadEventEnd().
+ if (mTimingData->AllRedirectsSameOrigin()) {
+ rawValue = mPerformance->GetDOMTiming()->GetUnloadEventEndHighRes();
+ }
+
+ REDUCE_TIME_PRECISION;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::DomInteractive() const {
+ DOMHighResTimeStamp rawValue =
+ mPerformance->GetDOMTiming()->GetDomInteractiveHighRes();
+
+ REDUCE_TIME_PRECISION;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::DomContentLoadedEventStart()
+ const {
+ DOMHighResTimeStamp rawValue =
+ mPerformance->GetDOMTiming()->GetDomContentLoadedEventStartHighRes();
+
+ REDUCE_TIME_PRECISION;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::DomContentLoadedEventEnd()
+ const {
+ DOMHighResTimeStamp rawValue =
+ mPerformance->GetDOMTiming()->GetDomContentLoadedEventEndHighRes();
+
+ REDUCE_TIME_PRECISION;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::DomComplete() const {
+ DOMHighResTimeStamp rawValue =
+ mPerformance->GetDOMTiming()->GetDomCompleteHighRes();
+
+ REDUCE_TIME_PRECISION;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::LoadEventStart() const {
+ DOMHighResTimeStamp rawValue =
+ mPerformance->GetDOMTiming()->GetLoadEventStartHighRes();
+
+ REDUCE_TIME_PRECISION;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::LoadEventEnd() const {
+ DOMHighResTimeStamp rawValue =
+ mPerformance->GetDOMTiming()->GetLoadEventEndHighRes();
+
+ REDUCE_TIME_PRECISION;
+}
+
+NavigationType PerformanceNavigationTiming::Type() const {
+ switch (mPerformance->GetDOMTiming()->GetType()) {
+ case nsDOMNavigationTiming::TYPE_NAVIGATE:
+ return NavigationType::Navigate;
+ break;
+ case nsDOMNavigationTiming::TYPE_RELOAD:
+ return NavigationType::Reload;
+ break;
+ case nsDOMNavigationTiming::TYPE_BACK_FORWARD:
+ return NavigationType::Back_forward;
+ break;
+ default:
+ // The type is TYPE_RESERVED or some other value that was later added.
+ // We fallback to the default of Navigate.
+ return NavigationType::Navigate;
+ }
+}
+
+uint16_t PerformanceNavigationTiming::RedirectCount() const {
+ return mTimingData->GetRedirectCount();
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::RedirectStart(
+ Maybe<nsIPrincipal*>& aSubjectPrincipal) const {
+ return PerformanceResourceTiming::RedirectStart(
+ aSubjectPrincipal, true /* aEnsureSameOriginAndIgnoreTAO */);
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::RedirectEnd(
+ Maybe<nsIPrincipal*>& aSubjectPrincipal) const {
+ return PerformanceResourceTiming::RedirectEnd(
+ aSubjectPrincipal, true /* aEnsureSameOriginAndIgnoreTAO */);
+}
+
+void PerformanceNavigationTiming::UpdatePropertiesFromHttpChannel(
+ nsIHttpChannel* aHttpChannel, nsITimedChannel* aChannel) {
+ mTimingData->SetPropertiesFromHttpChannel(aHttpChannel, aChannel);
+}
+
+bool PerformanceNavigationTiming::Enabled(JSContext* aCx, JSObject* aGlobal) {
+ return (StaticPrefs::dom_enable_performance_navigation_timing() &&
+ !StaticPrefs::privacy_resistFingerprinting());
+}