mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-07 07:47:30 +09:00
moebius#161: The Performance Resource Timing (make timestamps be relative to startTime)
https://github.com/MoonchildProductions/moebius/pull/161
This commit is contained in:
parent
5558924d7c
commit
e8dbb561f6
20 changed files with 520 additions and 154 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue