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: #ifndef nsDOMNavigationTiming_h___ michael@0: #define nsDOMNavigationTiming_h___ michael@0: michael@0: #include "nsCOMPtr.h" michael@0: #include "nsCOMArray.h" michael@0: #include "mozilla/TimeStamp.h" michael@0: michael@0: class nsIURI; michael@0: michael@0: typedef unsigned long long DOMTimeMilliSec; michael@0: typedef double DOMHighResTimeStamp; michael@0: typedef unsigned short nsDOMPerformanceNavigationType; michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: namespace PerformanceNavigation { michael@0: static const nsDOMPerformanceNavigationType TYPE_NAVIGATE = 0; michael@0: static const nsDOMPerformanceNavigationType TYPE_RELOAD = 1; michael@0: static const nsDOMPerformanceNavigationType TYPE_BACK_FORWARD = 2; michael@0: static const nsDOMPerformanceNavigationType TYPE_RESERVED = 255; michael@0: } michael@0: } michael@0: } michael@0: michael@0: class nsDOMNavigationTiming MOZ_FINAL michael@0: { michael@0: public: michael@0: nsDOMNavigationTiming(); michael@0: michael@0: NS_INLINE_DECL_REFCOUNTING(nsDOMNavigationTiming) michael@0: michael@0: nsDOMPerformanceNavigationType GetType() const { michael@0: return mNavigationType; michael@0: } michael@0: inline DOMHighResTimeStamp GetNavigationStartHighRes() const { michael@0: return mNavigationStartHighRes; michael@0: } michael@0: DOMTimeMilliSec GetNavigationStart() const { michael@0: return static_cast(GetNavigationStartHighRes()); michael@0: } michael@0: mozilla::TimeStamp GetNavigationStartTimeStamp() const { michael@0: return mNavigationStartTimeStamp; michael@0: } michael@0: DOMTimeMilliSec GetUnloadEventStart(); michael@0: DOMTimeMilliSec GetUnloadEventEnd(); michael@0: DOMTimeMilliSec GetDomLoading() const { michael@0: return mDOMLoading; michael@0: } michael@0: DOMTimeMilliSec GetDomInteractive() const { michael@0: return mDOMInteractive; michael@0: } michael@0: DOMTimeMilliSec GetDomContentLoadedEventStart() const { michael@0: return mDOMContentLoadedEventStart; michael@0: } michael@0: DOMTimeMilliSec GetDomContentLoadedEventEnd() const { michael@0: return mDOMContentLoadedEventEnd; michael@0: } michael@0: DOMTimeMilliSec GetDomComplete() const { michael@0: return mDOMComplete; michael@0: } michael@0: DOMTimeMilliSec GetLoadEventStart() const { michael@0: return mLoadEventStart; michael@0: } michael@0: DOMTimeMilliSec GetLoadEventEnd() const { michael@0: return mLoadEventEnd; michael@0: } michael@0: michael@0: void NotifyNavigationStart(); michael@0: void NotifyFetchStart(nsIURI* aURI, nsDOMPerformanceNavigationType aNavigationType); michael@0: void NotifyBeforeUnload(); michael@0: void NotifyUnloadAccepted(nsIURI* aOldURI); michael@0: void NotifyUnloadEventStart(); michael@0: void NotifyUnloadEventEnd(); michael@0: void NotifyLoadEventStart(); michael@0: void NotifyLoadEventEnd(); michael@0: michael@0: // Document changes state to 'loading' before connecting to timing michael@0: void SetDOMLoadingTimeStamp(nsIURI* aURI, mozilla::TimeStamp aValue); michael@0: void NotifyDOMLoading(nsIURI* aURI); michael@0: void NotifyDOMInteractive(nsIURI* aURI); michael@0: void NotifyDOMComplete(nsIURI* aURI); michael@0: void NotifyDOMContentLoadedStart(nsIURI* aURI); michael@0: void NotifyDOMContentLoadedEnd(nsIURI* aURI); michael@0: DOMTimeMilliSec TimeStampToDOM(mozilla::TimeStamp aStamp) const; michael@0: michael@0: inline DOMHighResTimeStamp TimeStampToDOMHighRes(mozilla::TimeStamp aStamp) michael@0: { michael@0: mozilla::TimeDuration duration = aStamp - mNavigationStartTimeStamp; michael@0: return duration.ToMilliseconds(); michael@0: } michael@0: michael@0: private: michael@0: nsDOMNavigationTiming(const nsDOMNavigationTiming &) MOZ_DELETE; michael@0: ~nsDOMNavigationTiming(); michael@0: michael@0: void Clear(); michael@0: michael@0: nsCOMPtr mUnloadedURI; michael@0: nsCOMPtr mLoadedURI; michael@0: michael@0: nsDOMPerformanceNavigationType mNavigationType; michael@0: DOMHighResTimeStamp mNavigationStartHighRes; michael@0: mozilla::TimeStamp mNavigationStartTimeStamp; michael@0: DOMTimeMilliSec DurationFromStart(); michael@0: michael@0: DOMTimeMilliSec mBeforeUnloadStart; michael@0: DOMTimeMilliSec mUnloadStart; michael@0: DOMTimeMilliSec mUnloadEnd; michael@0: DOMTimeMilliSec mLoadEventStart; michael@0: DOMTimeMilliSec mLoadEventEnd; michael@0: michael@0: DOMTimeMilliSec mDOMLoading; michael@0: DOMTimeMilliSec mDOMInteractive; michael@0: DOMTimeMilliSec mDOMContentLoadedEventStart; michael@0: DOMTimeMilliSec mDOMContentLoadedEventEnd; michael@0: DOMTimeMilliSec mDOMComplete; michael@0: michael@0: // Booleans to keep track of what things we've already been notified michael@0: // about. We don't update those once we've been notified about them michael@0: // once. michael@0: bool mLoadEventStartSet : 1; michael@0: bool mLoadEventEndSet : 1; michael@0: bool mDOMLoadingSet : 1; michael@0: bool mDOMInteractiveSet : 1; michael@0: bool mDOMContentLoadedEventStartSet : 1; michael@0: bool mDOMContentLoadedEventEndSet : 1; michael@0: bool mDOMCompleteSet : 1; michael@0: }; michael@0: michael@0: #endif /* nsDOMNavigationTiming_h___ */