michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nsDOMNavigationTiming.h" michael@0: #include "nsPerformance.h" michael@0: #include "nsCOMPtr.h" michael@0: #include "nsContentUtils.h" michael@0: #include "nsIScriptSecurityManager.h" michael@0: #include "prtime.h" michael@0: #include "nsIURI.h" michael@0: #include "mozilla/TimeStamp.h" michael@0: michael@0: nsDOMNavigationTiming::nsDOMNavigationTiming() michael@0: { michael@0: Clear(); michael@0: } michael@0: michael@0: nsDOMNavigationTiming::~nsDOMNavigationTiming() michael@0: { michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::Clear() michael@0: { michael@0: mNavigationType = mozilla::dom::PerformanceNavigation::TYPE_RESERVED; michael@0: mNavigationStartHighRes = 0; michael@0: mBeforeUnloadStart = 0; michael@0: mUnloadStart = 0; michael@0: mUnloadEnd = 0; michael@0: mLoadEventStart = 0; michael@0: mLoadEventEnd = 0; michael@0: mDOMLoading = 0; michael@0: mDOMInteractive = 0; michael@0: mDOMContentLoadedEventStart = 0; michael@0: mDOMContentLoadedEventEnd = 0; michael@0: mDOMComplete = 0; michael@0: michael@0: mLoadEventStartSet = false; michael@0: mLoadEventEndSet = false; michael@0: mDOMLoadingSet = false; michael@0: mDOMInteractiveSet = false; michael@0: mDOMContentLoadedEventStartSet = false; michael@0: mDOMContentLoadedEventEndSet = false; michael@0: mDOMCompleteSet = false; michael@0: } michael@0: michael@0: DOMTimeMilliSec michael@0: nsDOMNavigationTiming::TimeStampToDOM(mozilla::TimeStamp aStamp) const michael@0: { michael@0: if (aStamp.IsNull()) { michael@0: return 0; michael@0: } michael@0: mozilla::TimeDuration duration = aStamp - mNavigationStartTimeStamp; michael@0: return GetNavigationStart() + static_cast(duration.ToMilliseconds()); michael@0: } michael@0: michael@0: DOMTimeMilliSec nsDOMNavigationTiming::DurationFromStart(){ michael@0: return TimeStampToDOM(mozilla::TimeStamp::Now()); michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyNavigationStart() michael@0: { michael@0: mNavigationStartHighRes = (double)PR_Now() / PR_USEC_PER_MSEC; michael@0: mNavigationStartTimeStamp = mozilla::TimeStamp::Now(); michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyFetchStart(nsIURI* aURI, nsDOMPerformanceNavigationType aNavigationType) michael@0: { michael@0: mNavigationType = aNavigationType; michael@0: // At the unload event time we don't really know the loading uri. michael@0: // Need it for later check for unload timing access. michael@0: mLoadedURI = aURI; michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyBeforeUnload() michael@0: { michael@0: mBeforeUnloadStart = DurationFromStart(); michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyUnloadAccepted(nsIURI* aOldURI) michael@0: { michael@0: mUnloadStart = mBeforeUnloadStart; michael@0: mUnloadedURI = aOldURI; michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyUnloadEventStart() michael@0: { michael@0: mUnloadStart = DurationFromStart(); michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyUnloadEventEnd() michael@0: { michael@0: mUnloadEnd = DurationFromStart(); michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyLoadEventStart() michael@0: { michael@0: if (!mLoadEventStartSet) { michael@0: mLoadEventStart = DurationFromStart(); michael@0: mLoadEventStartSet = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyLoadEventEnd() michael@0: { michael@0: if (!mLoadEventEndSet) { michael@0: mLoadEventEnd = DurationFromStart(); michael@0: mLoadEventEndSet = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::SetDOMLoadingTimeStamp(nsIURI* aURI, mozilla::TimeStamp aValue) michael@0: { michael@0: if (!mDOMLoadingSet) { michael@0: mLoadedURI = aURI; michael@0: mDOMLoading = TimeStampToDOM(aValue); michael@0: mDOMLoadingSet = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyDOMLoading(nsIURI* aURI) michael@0: { michael@0: if (!mDOMLoadingSet) { michael@0: mLoadedURI = aURI; michael@0: mDOMLoading = DurationFromStart(); michael@0: mDOMLoadingSet = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyDOMInteractive(nsIURI* aURI) michael@0: { michael@0: if (!mDOMInteractiveSet) { michael@0: mLoadedURI = aURI; michael@0: mDOMInteractive = DurationFromStart(); michael@0: mDOMInteractiveSet = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyDOMComplete(nsIURI* aURI) michael@0: { michael@0: if (!mDOMCompleteSet) { michael@0: mLoadedURI = aURI; michael@0: mDOMComplete = DurationFromStart(); michael@0: mDOMCompleteSet = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyDOMContentLoadedStart(nsIURI* aURI) michael@0: { michael@0: if (!mDOMContentLoadedEventStartSet) { michael@0: mLoadedURI = aURI; michael@0: mDOMContentLoadedEventStart = DurationFromStart(); michael@0: mDOMContentLoadedEventStartSet = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsDOMNavigationTiming::NotifyDOMContentLoadedEnd(nsIURI* aURI) michael@0: { michael@0: if (!mDOMContentLoadedEventEndSet) { michael@0: mLoadedURI = aURI; michael@0: mDOMContentLoadedEventEnd = DurationFromStart(); michael@0: mDOMContentLoadedEventEndSet = true; michael@0: } michael@0: } michael@0: michael@0: DOMTimeMilliSec michael@0: nsDOMNavigationTiming::GetUnloadEventStart() michael@0: { michael@0: nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager(); michael@0: nsresult rv = ssm->CheckSameOriginURI(mLoadedURI, mUnloadedURI, false); michael@0: if (NS_SUCCEEDED(rv)) { michael@0: return mUnloadStart; michael@0: } michael@0: return 0; michael@0: } michael@0: michael@0: DOMTimeMilliSec michael@0: nsDOMNavigationTiming::GetUnloadEventEnd() michael@0: { michael@0: nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager(); michael@0: nsresult rv = ssm->CheckSameOriginURI(mLoadedURI, mUnloadedURI, false); michael@0: if (NS_SUCCEEDED(rv)) { michael@0: return mUnloadEnd; michael@0: } michael@0: return 0; michael@0: } michael@0: