dom/base/nsDOMNavigationTiming.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

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 }

mercurial