diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/PerformanceTiming.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/page/PerformanceTiming.cpp')
-rw-r--r-- | Source/WebCore/page/PerformanceTiming.cpp | 173 |
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 |