moebius#161: The Performance Resource Timing (make timestamps be relative to startTime)

https://github.com/MoonchildProductions/moebius/pull/161
This commit is contained in:
janekptacijarabaci 2018-04-29 14:15:18 +02:00 • committed by Roy Tam
commit e8dbb561f6
20 changed files with 520 additions and 154 deletions

View file

@ -281,6 +281,7 @@ bool nsContentUtils::sIsCutCopyAllowed = true;
bool nsContentUtils::sIsFrameTimingPrefEnabled = false;
bool nsContentUtils::sIsPerformanceTimingEnabled = false;
bool nsContentUtils::sIsResourceTimingEnabled = false;
bool nsContentUtils::sIsPerformanceNavigationTimingEnabled = false;
bool nsContentUtils::sIsUserTimingLoggingEnabled = false;
bool nsContentUtils::sIsExperimentalAutocompleteEnabled = false;
bool nsContentUtils::sEncodeDecodeURLHash = false;
@ -571,6 +572,9 @@ nsContentUtils::Init()
Preferences::AddBoolVarCache(&sIsResourceTimingEnabled,
"dom.enable_resource_timing", true);
Preferences::AddBoolVarCache(&sIsPerformanceNavigationTimingEnabled,
"dom.enable_performance_navigation_timing", true);
Preferences::AddBoolVarCache(&sIsUserTimingLoggingEnabled,
"dom.performance.enable_user_timing_logging", false);

View file

@ -2032,6 +2032,14 @@ public:
return sIsResourceTimingEnabled;
}
/*
* Returns true if the performance timing APIs are enabled.
*/
static bool IsPerformanceNavigationTimingEnabled()
{
return sIsPerformanceNavigationTimingEnabled;
}
/*
* Returns true if notification should be sent for peformance timing events.
*/
@ -2825,6 +2833,7 @@ private:
static uint32_t sHandlingInputTimeout;
static bool sIsPerformanceTimingEnabled;
static bool sIsResourceTimingEnabled;
static bool sIsPerformanceNavigationTimingEnabled;
static bool sIsUserTimingLoggingEnabled;
static bool sIsFrameTimingPrefEnabled;
static bool sIsExperimentalAutocompleteEnabled;

View file

@ -15,6 +15,7 @@
#include "nsPrintfCString.h"
#include "mozilla/dom/PerformanceNavigation.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/Telemetry.h"
using namespace mozilla;
@ -32,24 +33,17 @@ nsDOMNavigationTiming::Clear()
{
mNavigationType = TYPE_RESERVED;
mNavigationStartHighRes = 0;
mBeforeUnloadStart = 0;
mUnloadStart = 0;
mUnloadEnd = 0;
mLoadEventStart = 0;
mLoadEventEnd = 0;
mDOMLoading = 0;
mDOMInteractive = 0;
mDOMContentLoadedEventStart = 0;
mDOMContentLoadedEventEnd = 0;
mDOMComplete = 0;
mBeforeUnloadStart = TimeStamp();
mUnloadStart = TimeStamp();
mUnloadEnd = TimeStamp();
mLoadEventStart = TimeStamp();
mLoadEventEnd = TimeStamp();
mDOMLoading = TimeStamp();
mDOMInteractive = TimeStamp();
mDOMContentLoadedEventStart = TimeStamp();
mDOMContentLoadedEventEnd = TimeStamp();
mDOMComplete = TimeStamp();
mLoadEventStartSet = false;
mLoadEventEndSet = false;
mDOMLoadingSet = false;
mDOMInteractiveSet = false;
mDOMContentLoadedEventStartSet = false;
mDOMContentLoadedEventEndSet = false;
mDOMCompleteSet = false;
mDocShellHasBeenActiveSinceNavigationStart = false;
}
@ -60,20 +54,15 @@ nsDOMNavigationTiming::TimeStampToDOM(TimeStamp aStamp) const
return 0;
}
TimeDuration duration = aStamp - mNavigationStartTimeStamp;
TimeDuration duration = aStamp - mNavigationStart;
return GetNavigationStart() + static_cast<int64_t>(duration.ToMilliseconds());
}
DOMTimeMilliSec nsDOMNavigationTiming::DurationFromStart()
{
return TimeStampToDOM(TimeStamp::Now());
}
void
nsDOMNavigationTiming::NotifyNavigationStart(DocShellState aDocShellState)
{
mNavigationStartHighRes = (double)PR_Now() / PR_USEC_PER_MSEC;
mNavigationStartTimeStamp = TimeStamp::Now();
mNavigationStart = TimeStamp::Now();
mDocShellHasBeenActiveSinceNavigationStart = (aDocShellState == DocShellState::eActive);
}
@ -89,7 +78,7 @@ nsDOMNavigationTiming::NotifyFetchStart(nsIURI* aURI, Type aNavigationType)
void
nsDOMNavigationTiming::NotifyBeforeUnload()
{
mBeforeUnloadStart = DurationFromStart();
mBeforeUnloadStart = TimeStamp::Now();
}
void
@ -102,105 +91,107 @@ nsDOMNavigationTiming::NotifyUnloadAccepted(nsIURI* aOldURI)
void
nsDOMNavigationTiming::NotifyUnloadEventStart()
{
mUnloadStart = DurationFromStart();
mUnloadStart = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyUnloadEventEnd()
{
mUnloadEnd = DurationFromStart();
mUnloadEnd = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyLoadEventStart()
{
if (!mLoadEventStartSet) {
mLoadEventStart = DurationFromStart();
mLoadEventStartSet = true;
if (!mLoadEventStart.IsNull()) {
return;
}
mLoadEventStart = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyLoadEventEnd()
{
if (!mLoadEventEndSet) {
mLoadEventEnd = DurationFromStart();
mLoadEventEndSet = true;
if (!mLoadEventEnd.IsNull()) {
return;
}
mLoadEventEnd = TimeStamp::Now();
}
void
nsDOMNavigationTiming::SetDOMLoadingTimeStamp(nsIURI* aURI, TimeStamp aValue)
{
if (!mDOMLoadingSet) {
mLoadedURI = aURI;
mDOMLoading = TimeStampToDOM(aValue);
mDOMLoadingSet = true;
if (!mDOMLoading.IsNull()) {
return;
}
mLoadedURI = aURI;
mDOMLoading = aValue;
}
void
nsDOMNavigationTiming::NotifyDOMLoading(nsIURI* aURI)
{
if (!mDOMLoadingSet) {
mLoadedURI = aURI;
mDOMLoading = DurationFromStart();
mDOMLoadingSet = true;
if (!mDOMLoading.IsNull()) {
return;
}
mLoadedURI = aURI;
mDOMLoading = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyDOMInteractive(nsIURI* aURI)
{
if (!mDOMInteractiveSet) {
mLoadedURI = aURI;
mDOMInteractive = DurationFromStart();
mDOMInteractiveSet = true;
if (!mDOMInteractive.IsNull()) {
return;
}
mLoadedURI = aURI;
mDOMInteractive = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyDOMComplete(nsIURI* aURI)
{
if (!mDOMCompleteSet) {
mLoadedURI = aURI;
mDOMComplete = DurationFromStart();
mDOMCompleteSet = true;
if (!mDOMComplete.IsNull()) {
return;
}
mLoadedURI = aURI;
mDOMComplete = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyDOMContentLoadedStart(nsIURI* aURI)
{
if (!mDOMContentLoadedEventStartSet) {
mLoadedURI = aURI;
mDOMContentLoadedEventStart = DurationFromStart();
mDOMContentLoadedEventStartSet = true;
if (!mDOMContentLoadedEventStart.IsNull()) {
return;
}
mLoadedURI = aURI;
mDOMContentLoadedEventStart = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyDOMContentLoadedEnd(nsIURI* aURI)
{
if (!mDOMContentLoadedEventEndSet) {
mLoadedURI = aURI;
mDOMContentLoadedEventEnd = DurationFromStart();
mDOMContentLoadedEventEndSet = true;
if (!mDOMContentLoadedEventEnd.IsNull()) {
return;
}
mLoadedURI = aURI;
mDOMContentLoadedEventEnd = TimeStamp::Now();
}
void
nsDOMNavigationTiming::NotifyNonBlankPaintForRootContentDocument()
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(!mNavigationStartTimeStamp.IsNull());
MOZ_ASSERT(!mNavigationStart.IsNull());
if (!mNonBlankPaintTimeStamp.IsNull()) {
if (!mNonBlankPaint.IsNull()) {
return;
}
mNonBlankPaintTimeStamp = TimeStamp::Now();
TimeDuration elapsed = mNonBlankPaintTimeStamp - mNavigationStartTimeStamp;
mNonBlankPaint = TimeStamp::Now();
TimeDuration elapsed = mNonBlankPaint - mNavigationStart;
if (profiler_is_active()) {
nsAutoCString spec;
@ -215,8 +206,8 @@ nsDOMNavigationTiming::NotifyNonBlankPaintForRootContentDocument()
if (mDocShellHasBeenActiveSinceNavigationStart) {
Telemetry::AccumulateTimeDelta(Telemetry::TIME_TO_NON_BLANK_PAINT_MS,
mNavigationStartTimeStamp,
mNonBlankPaintTimeStamp);
mNavigationStart,
mNonBlankPaint);
}
}
@ -227,24 +218,24 @@ nsDOMNavigationTiming::NotifyDocShellStateChanged(DocShellState aDocShellState)
(aDocShellState == DocShellState::eActive);
}
DOMTimeMilliSec
nsDOMNavigationTiming::GetUnloadEventStart()
mozilla::TimeStamp
nsDOMNavigationTiming::GetUnloadEventStartTimeStamp() const
{
nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
nsresult rv = ssm->CheckSameOriginURI(mLoadedURI, mUnloadedURI, false);
if (NS_SUCCEEDED(rv)) {
return mUnloadStart;
}
return 0;
return mozilla::TimeStamp();
}
DOMTimeMilliSec
nsDOMNavigationTiming::GetUnloadEventEnd()
mozilla::TimeStamp
nsDOMNavigationTiming::GetUnloadEventEndTimeStamp() const
{
nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
nsresult rv = ssm->CheckSameOriginURI(mLoadedURI, mUnloadedURI, false);
if (NS_SUCCEEDED(rv)) {
return mUnloadEnd;
}
return 0;
return mozilla::TimeStamp();
}

View file

@ -47,38 +47,91 @@ public:
mozilla::TimeStamp GetNavigationStartTimeStamp() const
{
return mNavigationStartTimeStamp;
return mNavigationStart;
}
DOMTimeMilliSec GetUnloadEventStart()
{
return TimeStampToDOM(GetUnloadEventStartTimeStamp());
}
DOMTimeMilliSec GetUnloadEventEnd()
{
return TimeStampToDOM(GetUnloadEventEndTimeStamp());
}
DOMTimeMilliSec GetUnloadEventStart();
DOMTimeMilliSec GetUnloadEventEnd();
DOMTimeMilliSec GetDomLoading() const
{
return mDOMLoading;
return TimeStampToDOM(mDOMLoading);
}
DOMTimeMilliSec GetDomInteractive() const
{
return mDOMInteractive;
return TimeStampToDOM(mDOMInteractive);
}
DOMTimeMilliSec GetDomContentLoadedEventStart() const
{
return mDOMContentLoadedEventStart;
return TimeStampToDOM(mDOMContentLoadedEventStart);
}
DOMTimeMilliSec GetDomContentLoadedEventEnd() const
{
return mDOMContentLoadedEventEnd;
return TimeStampToDOM(mDOMContentLoadedEventEnd);
}
DOMTimeMilliSec GetDomComplete() const
{
return mDOMComplete;
return TimeStampToDOM(mDOMComplete);
}
DOMTimeMilliSec GetLoadEventStart() const
{
return mLoadEventStart;
return TimeStampToDOM(mLoadEventStart);
}
DOMTimeMilliSec GetLoadEventEnd() const
{
return mLoadEventEnd;
return TimeStampToDOM(mLoadEventEnd);
}
DOMTimeMilliSec GetTimeToNonBlankPaint() const
{
return TimeStampToDOM(mNonBlankPaint);
}
DOMHighResTimeStamp GetUnloadEventStartHighRes()
{
mozilla::TimeStamp stamp = GetUnloadEventStartTimeStamp();
if (stamp.IsNull()) {
return 0;
}
return TimeStampToDOMHighRes(stamp);
}
DOMHighResTimeStamp GetUnloadEventEndHighRes()
{
mozilla::TimeStamp stamp = GetUnloadEventEndTimeStamp();
if (stamp.IsNull()) {
return 0;
}
return TimeStampToDOMHighRes(stamp);
}
DOMHighResTimeStamp GetDomInteractiveHighRes() const
{
return TimeStampToDOMHighRes(mDOMInteractive);
}
DOMHighResTimeStamp GetDomContentLoadedEventStartHighRes() const
{
return TimeStampToDOMHighRes(mDOMContentLoadedEventStart);
}
DOMHighResTimeStamp GetDomContentLoadedEventEndHighRes() const
{
return TimeStampToDOMHighRes(mDOMContentLoadedEventEnd);
}
DOMHighResTimeStamp GetDomCompleteHighRes() const
{
return TimeStampToDOMHighRes(mDOMComplete);
}
DOMHighResTimeStamp GetLoadEventStartHighRes() const
{
return TimeStampToDOMHighRes(mLoadEventStart);
}
DOMHighResTimeStamp GetLoadEventEndHighRes() const
{
return TimeStampToDOMHighRes(mLoadEventEnd);
}
enum class DocShellState : uint8_t {
@ -108,9 +161,13 @@ public:
DOMTimeMilliSec TimeStampToDOM(mozilla::TimeStamp aStamp) const;
inline DOMHighResTimeStamp TimeStampToDOMHighRes(mozilla::TimeStamp aStamp)
inline DOMHighResTimeStamp TimeStampToDOMHighRes(mozilla::TimeStamp aStamp) const
{
mozilla::TimeDuration duration = aStamp - mNavigationStartTimeStamp;
MOZ_ASSERT(!aStamp.IsNull(), "The timestamp should not be null");
if (aStamp.IsNull()) {
return 0;
}
mozilla::TimeDuration duration = aStamp - mNavigationStart;
return duration.ToMilliseconds();
}
@ -120,37 +177,29 @@ private:
void Clear();
mozilla::TimeStamp GetUnloadEventStartTimeStamp() const;
mozilla::TimeStamp GetUnloadEventEndTimeStamp() const;
nsCOMPtr<nsIURI> mUnloadedURI;
nsCOMPtr<nsIURI> mLoadedURI;
Type mNavigationType;
DOMHighResTimeStamp mNavigationStartHighRes;
mozilla::TimeStamp mNavigationStartTimeStamp;
mozilla::TimeStamp mNonBlankPaintTimeStamp;
DOMTimeMilliSec DurationFromStart();
mozilla::TimeStamp mNavigationStart;
mozilla::TimeStamp mNonBlankPaint;
DOMTimeMilliSec mBeforeUnloadStart;
DOMTimeMilliSec mUnloadStart;
DOMTimeMilliSec mUnloadEnd;
DOMTimeMilliSec mLoadEventStart;
DOMTimeMilliSec mLoadEventEnd;
mozilla::TimeStamp mBeforeUnloadStart;
mozilla::TimeStamp mUnloadStart;
mozilla::TimeStamp mUnloadEnd;
mozilla::TimeStamp mLoadEventStart;
mozilla::TimeStamp mLoadEventEnd;
DOMTimeMilliSec mDOMLoading;
DOMTimeMilliSec mDOMInteractive;
DOMTimeMilliSec mDOMContentLoadedEventStart;
DOMTimeMilliSec mDOMContentLoadedEventEnd;
DOMTimeMilliSec mDOMComplete;
mozilla::TimeStamp mDOMLoading;
mozilla::TimeStamp mDOMInteractive;
mozilla::TimeStamp mDOMContentLoadedEventStart;
mozilla::TimeStamp mDOMContentLoadedEventEnd;
mozilla::TimeStamp mDOMComplete;
// Booleans to keep track of what things we've already been notified
// about. We don't update those once we've been notified about them
// once.
bool mLoadEventStartSet : 1;
bool mLoadEventEndSet : 1;
bool mDOMLoadingSet : 1;
bool mDOMInteractiveSet : 1;
bool mDOMContentLoadedEventStartSet : 1;
bool mDOMContentLoadedEventEndSet : 1;
bool mDOMCompleteSet : 1;
bool mDocShellHasBeenActiveSinceNavigationStart : 1;
};