summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/PerformanceTiming.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/PerformanceTiming.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/page/PerformanceTiming.cpp')
-rw-r--r--Source/WebCore/page/PerformanceTiming.cpp173
1 files changed, 81 insertions, 92 deletions
diff --git a/Source/WebCore/page/PerformanceTiming.cpp b/Source/WebCore/page/PerformanceTiming.cpp
index c14080ffb..2fb5ead71 100644
--- a/Source/WebCore/page/PerformanceTiming.cpp
+++ b/Source/WebCore/page/PerformanceTiming.cpp
@@ -34,23 +34,18 @@
#if ENABLE(WEB_TIMING)
#include "Document.h"
-#include "DocumentLoadTiming.h"
#include "DocumentLoader.h"
#include "DocumentTiming.h"
#include "Frame.h"
#include "FrameLoader.h"
-#include "ResourceLoadTiming.h"
+#include "LoadTiming.h"
+#include "NetworkLoadTiming.h"
+#include "Performance.h"
#include "ResourceResponse.h"
#include <wtf/CurrentTime.h>
namespace WebCore {
-static unsigned long long toIntegerMilliseconds(double seconds)
-{
- ASSERT(seconds >= 0);
- return static_cast<unsigned long long>(seconds * 1000.0);
-}
-
PerformanceTiming::PerformanceTiming(Frame* frame)
: DOMWindowProperty(frame)
{
@@ -58,16 +53,16 @@ PerformanceTiming::PerformanceTiming(Frame* frame)
unsigned long long PerformanceTiming::navigationStart() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
- return monotonicTimeToIntegerMilliseconds(timing->navigationStart());
+ return monotonicTimeToIntegerMilliseconds(timing->startTime());
}
unsigned long long PerformanceTiming::unloadEventStart() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -79,7 +74,7 @@ unsigned long long PerformanceTiming::unloadEventStart() const
unsigned long long PerformanceTiming::unloadEventEnd() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -91,7 +86,7 @@ unsigned long long PerformanceTiming::unloadEventEnd() const
unsigned long long PerformanceTiming::redirectStart() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -103,7 +98,7 @@ unsigned long long PerformanceTiming::redirectStart() const
unsigned long long PerformanceTiming::redirectEnd() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -115,7 +110,7 @@ unsigned long long PerformanceTiming::redirectEnd() const
unsigned long long PerformanceTiming::fetchStart() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -124,32 +119,34 @@ unsigned long long PerformanceTiming::fetchStart() const
unsigned long long PerformanceTiming::domainLookupStart() const
{
- ResourceLoadTiming* timing = resourceLoadTiming();
- if (!timing)
+ DocumentLoader* loader = documentLoader();
+ if (!loader)
return fetchStart();
-
+
+ const NetworkLoadTiming& timing = loader->response().networkLoadTiming();
+
// This will be -1 when a DNS request is not performed.
// Rather than exposing a special value that indicates no DNS, we "backfill" with fetchStart.
- int dnsStart = timing->dnsStart;
- if (dnsStart < 0)
+ if (timing.domainLookupStart < 0)
return fetchStart();
- return resourceLoadTimeRelativeToAbsolute(dnsStart);
+ return resourceLoadTimeRelativeToFetchStart(timing.domainLookupStart);
}
unsigned long long PerformanceTiming::domainLookupEnd() const
{
- ResourceLoadTiming* timing = resourceLoadTiming();
- if (!timing)
+ DocumentLoader* loader = documentLoader();
+ if (!loader)
return domainLookupStart();
-
+
+ const NetworkLoadTiming& timing = loader->response().networkLoadTiming();
+
// This will be -1 when a DNS request is not performed.
// Rather than exposing a special value that indicates no DNS, we "backfill" with domainLookupStart.
- int dnsEnd = timing->dnsEnd;
- if (dnsEnd < 0)
+ if (timing.domainLookupEnd < 0)
return domainLookupStart();
- return resourceLoadTimeRelativeToAbsolute(dnsEnd);
+ return resourceLoadTimeRelativeToFetchStart(timing.domainLookupEnd);
}
unsigned long long PerformanceTiming::connectStart() const
@@ -158,22 +155,20 @@ unsigned long long PerformanceTiming::connectStart() const
if (!loader)
return domainLookupEnd();
- ResourceLoadTiming* timing = loader->response().resourceLoadTiming();
- if (!timing)
- return domainLookupEnd();
-
+ const NetworkLoadTiming& timing = loader->response().networkLoadTiming();
+
// connectStart will be -1 when a network request is not made.
// Rather than exposing a special value that indicates no new connection, we "backfill" with domainLookupEnd.
- int connectStart = timing->connectStart;
- if (connectStart < 0 || loader->response().connectionReused())
+ double connectStart = timing.connectStart;
+ if (connectStart < 0)
return domainLookupEnd();
- // ResourceLoadTiming's connect phase includes DNS, however Navigation Timing's
+ // NetworkLoadTiming's connect phase includes DNS, however Navigation Timing's
// connect phase should not. So if there is DNS time, trim it from the start.
- if (timing->dnsEnd >= 0 && timing->dnsEnd > connectStart)
- connectStart = timing->dnsEnd;
+ if (timing.domainLookupEnd >= 0 && timing.domainLookupEnd > connectStart)
+ connectStart = timing.domainLookupEnd;
- return resourceLoadTimeRelativeToAbsolute(connectStart);
+ return resourceLoadTimeRelativeToFetchStart(connectStart);
}
unsigned long long PerformanceTiming::connectEnd() const
@@ -182,17 +177,14 @@ unsigned long long PerformanceTiming::connectEnd() const
if (!loader)
return connectStart();
- ResourceLoadTiming* timing = loader->response().resourceLoadTiming();
- if (!timing)
- return connectStart();
-
+ const NetworkLoadTiming& timing = loader->response().networkLoadTiming();
+
// connectEnd will be -1 when a network request is not made.
// Rather than exposing a special value that indicates no new connection, we "backfill" with connectStart.
- int connectEnd = timing->connectEnd;
- if (connectEnd < 0 || loader->response().connectionReused())
+ if (timing.connectEnd < 0)
return connectStart();
- return resourceLoadTimeRelativeToAbsolute(connectEnd);
+ return resourceLoadTimeRelativeToFetchStart(timing.connectEnd);
}
unsigned long long PerformanceTiming::secureConnectionStart() const
@@ -201,46 +193,41 @@ unsigned long long PerformanceTiming::secureConnectionStart() const
if (!loader)
return 0;
- ResourceLoadTiming* timing = loader->response().resourceLoadTiming();
- if (!timing)
+ const NetworkLoadTiming& timing = loader->response().networkLoadTiming();
+
+ if (timing.secureConnectionStart < 0)
return 0;
- int sslStart = timing->sslStart;
- if (sslStart < 0)
- return 0;
-
- return resourceLoadTimeRelativeToAbsolute(sslStart);
+ return resourceLoadTimeRelativeToFetchStart(timing.secureConnectionStart);
}
unsigned long long PerformanceTiming::requestStart() const
{
- ResourceLoadTiming* timing = resourceLoadTiming();
- if (!timing)
+ DocumentLoader* loader = documentLoader();
+ if (!loader)
return connectEnd();
-
- ASSERT(timing->sendStart >= 0);
- return resourceLoadTimeRelativeToAbsolute(timing->sendStart);
+
+ const NetworkLoadTiming& timing = loader->response().networkLoadTiming();
+
+ ASSERT(timing.requestStart >= 0);
+ return resourceLoadTimeRelativeToFetchStart(timing.requestStart);
}
unsigned long long PerformanceTiming::responseStart() const
{
- ResourceLoadTiming* timing = resourceLoadTiming();
- if (!timing)
+ DocumentLoader* loader = documentLoader();
+ if (!loader)
return requestStart();
- // FIXME: Response start needs to be the time of the first received byte.
- // However, the ResourceLoadTiming API currently only supports the time
- // the last header byte was received. For many responses with reasonable
- // sized cookies, the HTTP headers fit into a single packet so this time
- // is basically equivalent. But for some responses, particularly those with
- // headers larger than a single packet, this time will be too late.
- ASSERT(timing->receiveHeadersEnd >= 0);
- return resourceLoadTimeRelativeToAbsolute(timing->receiveHeadersEnd);
+ const NetworkLoadTiming& timing = loader->response().networkLoadTiming();
+
+ ASSERT(timing.responseStart >= 0);
+ return resourceLoadTimeRelativeToFetchStart(timing.responseStart);
}
unsigned long long PerformanceTiming::responseEnd() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -294,7 +281,7 @@ unsigned long long PerformanceTiming::domComplete() const
unsigned long long PerformanceTiming::loadEventStart() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -303,7 +290,7 @@ unsigned long long PerformanceTiming::loadEventStart() const
unsigned long long PerformanceTiming::loadEventEnd() const
{
- DocumentLoadTiming* timing = documentLoadTiming();
+ LoadTiming* timing = loadTiming();
if (!timing)
return 0;
@@ -313,7 +300,7 @@ unsigned long long PerformanceTiming::loadEventEnd() const
DocumentLoader* PerformanceTiming::documentLoader() const
{
if (!m_frame)
- return 0;
+ return nullptr;
return m_frame->loader().documentLoader();
}
@@ -321,47 +308,49 @@ DocumentLoader* PerformanceTiming::documentLoader() const
const DocumentTiming* PerformanceTiming::documentTiming() const
{
if (!m_frame)
- return 0;
+ return nullptr;
Document* document = m_frame->document();
if (!document)
- return 0;
+ return nullptr;
- return document->timing();
+ return &document->timing();
}
-DocumentLoadTiming* PerformanceTiming::documentLoadTiming() const
+LoadTiming* PerformanceTiming::loadTiming() const
{
DocumentLoader* loader = documentLoader();
if (!loader)
- return 0;
+ return nullptr;
- return loader->timing();
+ return &loader->timing();
}
-ResourceLoadTiming* PerformanceTiming::resourceLoadTiming() const
+unsigned long long PerformanceTiming::resourceLoadTimeRelativeToFetchStart(double relativeMilliseconds) const
{
- DocumentLoader* loader = documentLoader();
- if (!loader)
+ ASSERT(relativeMilliseconds >= 0);
+
+ LoadTiming* timing = loadTiming();
+ if (!timing)
return 0;
- return loader->response().resourceLoadTiming();
+ WallTime fetchStart = timing->monotonicTimeToPseudoWallTime(timing->fetchStart());
+ WallTime combined = fetchStart + Seconds::fromMilliseconds(relativeMilliseconds);
+ Seconds reduced = Performance::reduceTimeResolution(combined.secondsSinceEpoch());
+ return static_cast<unsigned long long>(reduced.milliseconds());
}
-unsigned long long PerformanceTiming::resourceLoadTimeRelativeToAbsolute(int relativeMilliseconds) const
+unsigned long long PerformanceTiming::monotonicTimeToIntegerMilliseconds(MonotonicTime timeStamp) const
{
- ASSERT(relativeMilliseconds >= 0);
- ResourceLoadTiming* resourceTiming = resourceLoadTiming();
- ASSERT(resourceTiming);
- return monotonicTimeToIntegerMilliseconds(resourceTiming->convertResourceLoadTimeToMonotonicTime(relativeMilliseconds));
-}
+ ASSERT(timeStamp.secondsSinceEpoch().seconds() >= 0);
-unsigned long long PerformanceTiming::monotonicTimeToIntegerMilliseconds(double monotonicSeconds) const
-{
- ASSERT(monotonicSeconds >= 0);
- const DocumentLoadTiming* timing = documentLoadTiming();
- ASSERT(timing);
- return toIntegerMilliseconds(timing->monotonicTimeToPseudoWallTime(monotonicSeconds));
+ LoadTiming* timing = loadTiming();
+ if (!timing)
+ return 0;
+
+ WallTime wallTime = timing->monotonicTimeToPseudoWallTime(timeStamp);
+ Seconds reduced = Performance::reduceTimeResolution(wallTime.secondsSinceEpoch());
+ return static_cast<unsigned long long>(reduced.milliseconds());
}
} // namespace WebCore