2015-05-03 19:32:37 +00:00
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
2012-05-21 11:12:37 +00:00
/* 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/. */
2011-06-23 10:39:48 +00:00
# include "nsDOMNavigationTiming.h"
2016-11-10 21:00:45 +00:00
# include "GeckoProfiler.h"
2011-06-23 10:39:48 +00:00
# include "nsCOMPtr.h"
2013-07-02 18:15:39 +00:00
# include "nsContentUtils.h"
# include "nsIScriptSecurityManager.h"
2013-07-03 15:56:26 +00:00
# include "prtime.h"
2013-08-15 18:17:48 +00:00
# include "nsIURI.h"
2016-11-10 21:00:45 +00:00
# include "nsPrintfCString.h"
2016-06-09 10:44:54 +00:00
# include "mozilla/dom/PerformanceNavigation.h"
2013-08-24 06:12:51 +00:00
# include "mozilla/TimeStamp.h"
2011-06-23 10:39:48 +00:00
nsDOMNavigationTiming : : nsDOMNavigationTiming ( )
{
Clear ( ) ;
}
nsDOMNavigationTiming : : ~ nsDOMNavigationTiming ( )
{
}
void
nsDOMNavigationTiming : : Clear ( )
{
2016-06-10 14:29:46 +00:00
mNavigationType = TYPE_RESERVED ;
2013-10-16 01:35:44 +00:00
mNavigationStartHighRes = 0 ;
2011-06-23 10:39:48 +00:00
mBeforeUnloadStart = 0 ;
mUnloadStart = 0 ;
mUnloadEnd = 0 ;
mLoadEventStart = 0 ;
mLoadEventEnd = 0 ;
mDOMLoading = 0 ;
mDOMInteractive = 0 ;
mDOMContentLoadedEventStart = 0 ;
mDOMContentLoadedEventEnd = 0 ;
mDOMComplete = 0 ;
2012-08-09 03:47:04 +00:00
mLoadEventStartSet = false ;
mLoadEventEndSet = false ;
mDOMLoadingSet = false ;
mDOMInteractiveSet = false ;
mDOMContentLoadedEventStartSet = false ;
mDOMContentLoadedEventEndSet = false ;
mDOMCompleteSet = false ;
2016-11-10 19:26:54 +00:00
mDocShellHasBeenActiveSinceNavigationStart = false ;
2011-06-23 10:39:48 +00:00
}
2012-07-17 01:42:18 +00:00
DOMTimeMilliSec
2016-12-01 11:27:28 +00:00
nsDOMNavigationTiming : : TimeStampToDOM ( mozilla : : TimeStamp aStamp ) const
2011-07-04 16:44:00 +00:00
{
if ( aStamp . IsNull ( ) ) {
2012-07-17 01:42:18 +00:00
return 0 ;
2011-07-04 16:44:00 +00:00
}
2016-12-01 11:27:28 +00:00
mozilla : : TimeDuration duration = aStamp - mNavigationStartTimeStamp ;
2013-10-16 01:35:44 +00:00
return GetNavigationStart ( ) + static_cast < int64_t > ( duration . ToMilliseconds ( ) ) ;
2011-08-08 12:20:03 +00:00
}
2015-05-25 16:53:07 +00:00
DOMTimeMilliSec nsDOMNavigationTiming : : DurationFromStart ( )
{
2016-12-01 11:27:28 +00:00
return TimeStampToDOM ( mozilla : : TimeStamp : : Now ( ) ) ;
2011-06-23 10:39:48 +00:00
}
void
2016-11-10 19:26:54 +00:00
nsDOMNavigationTiming : : NotifyNavigationStart ( DocShellState aDocShellState )
2011-06-23 10:39:48 +00:00
{
2013-10-16 01:35:44 +00:00
mNavigationStartHighRes = ( double ) PR_Now ( ) / PR_USEC_PER_MSEC ;
2016-12-01 11:27:28 +00:00
mNavigationStartTimeStamp = mozilla : : TimeStamp : : Now ( ) ;
2016-11-10 19:26:54 +00:00
mDocShellHasBeenActiveSinceNavigationStart = ( aDocShellState = = DocShellState : : eActive ) ;
2011-06-23 10:39:48 +00:00
}
void
2016-06-10 14:29:46 +00:00
nsDOMNavigationTiming : : NotifyFetchStart ( nsIURI * aURI , Type aNavigationType )
2011-06-23 10:39:48 +00:00
{
mNavigationType = aNavigationType ;
// At the unload event time we don't really know the loading uri.
// Need it for later check for unload timing access.
mLoadedURI = aURI ;
}
void
nsDOMNavigationTiming : : NotifyBeforeUnload ( )
{
mBeforeUnloadStart = DurationFromStart ( ) ;
}
void
nsDOMNavigationTiming : : NotifyUnloadAccepted ( nsIURI * aOldURI )
{
mUnloadStart = mBeforeUnloadStart ;
mUnloadedURI = aOldURI ;
}
void
nsDOMNavigationTiming : : NotifyUnloadEventStart ( )
{
mUnloadStart = DurationFromStart ( ) ;
}
void
nsDOMNavigationTiming : : NotifyUnloadEventEnd ( )
{
mUnloadEnd = DurationFromStart ( ) ;
}
void
nsDOMNavigationTiming : : NotifyLoadEventStart ( )
{
2012-08-09 03:47:04 +00:00
if ( ! mLoadEventStartSet ) {
mLoadEventStart = DurationFromStart ( ) ;
mLoadEventStartSet = true ;
}
2011-06-23 10:39:48 +00:00
}
void
nsDOMNavigationTiming : : NotifyLoadEventEnd ( )
{
2012-08-09 03:47:04 +00:00
if ( ! mLoadEventEndSet ) {
mLoadEventEnd = DurationFromStart ( ) ;
mLoadEventEndSet = true ;
}
2011-06-23 10:39:48 +00:00
}
void
2016-12-01 11:27:28 +00:00
nsDOMNavigationTiming : : SetDOMLoadingTimeStamp ( nsIURI * aURI , mozilla : : TimeStamp aValue )
2011-06-23 10:39:48 +00:00
{
2012-08-09 03:47:04 +00:00
if ( ! mDOMLoadingSet ) {
mLoadedURI = aURI ;
mDOMLoading = TimeStampToDOM ( aValue ) ;
mDOMLoadingSet = true ;
}
2011-06-23 10:39:48 +00:00
}
void
nsDOMNavigationTiming : : NotifyDOMLoading ( nsIURI * aURI )
{
2012-08-09 03:47:04 +00:00
if ( ! mDOMLoadingSet ) {
mLoadedURI = aURI ;
mDOMLoading = DurationFromStart ( ) ;
mDOMLoadingSet = true ;
}
2011-06-23 10:39:48 +00:00
}
void
nsDOMNavigationTiming : : NotifyDOMInteractive ( nsIURI * aURI )
{
2012-08-09 03:47:04 +00:00
if ( ! mDOMInteractiveSet ) {
mLoadedURI = aURI ;
mDOMInteractive = DurationFromStart ( ) ;
mDOMInteractiveSet = true ;
}
2011-06-23 10:39:48 +00:00
}
void
nsDOMNavigationTiming : : NotifyDOMComplete ( nsIURI * aURI )
{
2012-08-09 03:47:04 +00:00
if ( ! mDOMCompleteSet ) {
mLoadedURI = aURI ;
mDOMComplete = DurationFromStart ( ) ;
mDOMCompleteSet = true ;
}
2011-06-23 10:39:48 +00:00
}
void
nsDOMNavigationTiming : : NotifyDOMContentLoadedStart ( nsIURI * aURI )
{
2012-08-09 03:47:04 +00:00
if ( ! mDOMContentLoadedEventStartSet ) {
mLoadedURI = aURI ;
mDOMContentLoadedEventStart = DurationFromStart ( ) ;
mDOMContentLoadedEventStartSet = true ;
}
2011-06-23 10:39:48 +00:00
}
void
nsDOMNavigationTiming : : NotifyDOMContentLoadedEnd ( nsIURI * aURI )
{
2012-08-09 03:47:04 +00:00
if ( ! mDOMContentLoadedEventEndSet ) {
mLoadedURI = aURI ;
mDOMContentLoadedEventEnd = DurationFromStart ( ) ;
mDOMContentLoadedEventEndSet = true ;
}
2011-06-23 10:39:48 +00:00
}
2016-11-10 21:00:45 +00:00
void
2016-11-10 19:26:54 +00:00
nsDOMNavigationTiming : : NotifyNonBlankPaintForRootContentDocument ( )
2016-11-10 21:00:45 +00:00
{
MOZ_ASSERT ( NS_IsMainThread ( ) ) ;
MOZ_ASSERT ( ! mNavigationStartTimeStamp . IsNull ( ) ) ;
if ( ! mNonBlankPaintTimeStamp . IsNull ( ) ) {
return ;
}
mNonBlankPaintTimeStamp = TimeStamp : : Now ( ) ;
TimeDuration elapsed = mNonBlankPaintTimeStamp - mNavigationStartTimeStamp ;
if ( profiler_is_active ( ) ) {
nsAutoCString spec ;
if ( mLoadedURI ) {
mLoadedURI - > GetSpec ( spec ) ;
}
2016-11-10 19:26:54 +00:00
nsPrintfCString marker ( " Non-blank paint after %dms for URL %s, %s " ,
int ( elapsed . ToMilliseconds ( ) ) , spec . get ( ) ,
mDocShellHasBeenActiveSinceNavigationStart ? " foreground tab " : " this tab was inactive some of the time between navigation start and first non-blank paint " ) ;
2016-11-10 21:00:45 +00:00
PROFILER_MARKER ( marker . get ( ) ) ;
}
2016-11-10 19:26:54 +00:00
if ( mDocShellHasBeenActiveSinceNavigationStart ) {
Telemetry : : AccumulateTimeDelta ( Telemetry : : TIME_TO_NON_BLANK_PAINT_MS ,
mNavigationStartTimeStamp ,
mNonBlankPaintTimeStamp ) ;
}
}
void
nsDOMNavigationTiming : : NotifyDocShellStateChanged ( DocShellState aDocShellState )
{
mDocShellHasBeenActiveSinceNavigationStart & =
( aDocShellState = = DocShellState : : eActive ) ;
2016-11-10 21:00:45 +00:00
}
2012-07-17 01:42:18 +00:00
DOMTimeMilliSec
nsDOMNavigationTiming : : GetUnloadEventStart ( )
2011-06-23 10:39:48 +00:00
{
nsIScriptSecurityManager * ssm = nsContentUtils : : GetSecurityManager ( ) ;
2011-10-17 14:59:28 +00:00
nsresult rv = ssm - > CheckSameOriginURI ( mLoadedURI , mUnloadedURI , false ) ;
2011-06-23 10:39:48 +00:00
if ( NS_SUCCEEDED ( rv ) ) {
2012-07-17 01:42:18 +00:00
return mUnloadStart ;
2011-06-23 10:39:48 +00:00
}
2012-07-17 01:42:18 +00:00
return 0 ;
2011-06-23 10:39:48 +00:00
}
2012-07-17 01:42:18 +00:00
DOMTimeMilliSec
nsDOMNavigationTiming : : GetUnloadEventEnd ( )
2011-06-23 10:39:48 +00:00
{
nsIScriptSecurityManager * ssm = nsContentUtils : : GetSecurityManager ( ) ;
2011-10-17 14:59:28 +00:00
nsresult rv = ssm - > CheckSameOriginURI ( mLoadedURI , mUnloadedURI , false ) ;
2011-06-23 10:39:48 +00:00
if ( NS_SUCCEEDED ( rv ) ) {
2012-07-17 01:42:18 +00:00
return mUnloadEnd ;
2011-06-23 10:39:48 +00:00
}
2012-07-17 01:42:18 +00:00
return 0 ;
2011-06-23 10:39:48 +00:00
}