diff options
Diffstat (limited to 'Source/WebCore/page/PerformanceTiming.cpp')
| -rw-r--r-- | Source/WebCore/page/PerformanceTiming.cpp | 117 |
1 files changed, 68 insertions, 49 deletions
diff --git a/Source/WebCore/page/PerformanceTiming.cpp b/Source/WebCore/page/PerformanceTiming.cpp index 7d571b5f3..c14080ffb 100644 --- a/Source/WebCore/page/PerformanceTiming.cpp +++ b/Source/WebCore/page/PerformanceTiming.cpp @@ -124,34 +124,32 @@ unsigned long long PerformanceTiming::fetchStart() const unsigned long long PerformanceTiming::domainLookupStart() const { - DocumentLoader* loader = documentLoader(); - if (!loader) + ResourceLoadTiming* timing = resourceLoadTiming(); + if (!timing) return fetchStart(); - - const ResourceLoadTiming& timing = loader->response().resourceLoadTiming(); - + // 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. - if (timing.domainLookupStart < 0) + int dnsStart = timing->dnsStart; + if (dnsStart < 0) return fetchStart(); - return resourceLoadTimeRelativeToFetchStart(timing.domainLookupStart); + return resourceLoadTimeRelativeToAbsolute(dnsStart); } unsigned long long PerformanceTiming::domainLookupEnd() const { - DocumentLoader* loader = documentLoader(); - if (!loader) + ResourceLoadTiming* timing = resourceLoadTiming(); + if (!timing) return domainLookupStart(); - - const ResourceLoadTiming& timing = loader->response().resourceLoadTiming(); - + // 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. - if (timing.domainLookupEnd < 0) + int dnsEnd = timing->dnsEnd; + if (dnsEnd < 0) return domainLookupStart(); - return resourceLoadTimeRelativeToFetchStart(timing.domainLookupEnd); + return resourceLoadTimeRelativeToAbsolute(dnsEnd); } unsigned long long PerformanceTiming::connectStart() const @@ -160,20 +158,22 @@ unsigned long long PerformanceTiming::connectStart() const if (!loader) return domainLookupEnd(); - const ResourceLoadTiming& timing = loader->response().resourceLoadTiming(); - + ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); + if (!timing) + return domainLookupEnd(); + // 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) + int connectStart = timing->connectStart; + if (connectStart < 0 || loader->response().connectionReused()) return domainLookupEnd(); // ResourceLoadTiming'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.domainLookupEnd >= 0 && timing.domainLookupEnd > connectStart) - connectStart = timing.domainLookupEnd; + if (timing->dnsEnd >= 0 && timing->dnsEnd > connectStart) + connectStart = timing->dnsEnd; - return resourceLoadTimeRelativeToFetchStart(connectStart); + return resourceLoadTimeRelativeToAbsolute(connectStart); } unsigned long long PerformanceTiming::connectEnd() const @@ -182,14 +182,17 @@ unsigned long long PerformanceTiming::connectEnd() const if (!loader) return connectStart(); - const ResourceLoadTiming& timing = loader->response().resourceLoadTiming(); - + ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); + if (!timing) + return connectStart(); + // 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. - if (timing.connectEnd < 0) + int connectEnd = timing->connectEnd; + if (connectEnd < 0 || loader->response().connectionReused()) return connectStart(); - return resourceLoadTimeRelativeToFetchStart(timing.connectEnd); + return resourceLoadTimeRelativeToAbsolute(connectEnd); } unsigned long long PerformanceTiming::secureConnectionStart() const @@ -198,36 +201,41 @@ unsigned long long PerformanceTiming::secureConnectionStart() const if (!loader) return 0; - const ResourceLoadTiming& timing = loader->response().resourceLoadTiming(); - - if (timing.secureConnectionStart < 0) + ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); + if (!timing) return 0; - return resourceLoadTimeRelativeToFetchStart(timing.secureConnectionStart); + int sslStart = timing->sslStart; + if (sslStart < 0) + return 0; + + return resourceLoadTimeRelativeToAbsolute(sslStart); } unsigned long long PerformanceTiming::requestStart() const { - DocumentLoader* loader = documentLoader(); - if (!loader) + ResourceLoadTiming* timing = resourceLoadTiming(); + if (!timing) return connectEnd(); - - const ResourceLoadTiming& timing = loader->response().resourceLoadTiming(); - - ASSERT(timing.requestStart >= 0); - return resourceLoadTimeRelativeToFetchStart(timing.requestStart); + + ASSERT(timing->sendStart >= 0); + return resourceLoadTimeRelativeToAbsolute(timing->sendStart); } unsigned long long PerformanceTiming::responseStart() const { - DocumentLoader* loader = documentLoader(); - if (!loader) + ResourceLoadTiming* timing = resourceLoadTiming(); + if (!timing) return requestStart(); - const ResourceLoadTiming& timing = loader->response().resourceLoadTiming(); - - ASSERT(timing.responseStart >= 0); - return resourceLoadTimeRelativeToFetchStart(timing.responseStart); + // 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); } unsigned long long PerformanceTiming::responseEnd() const @@ -319,7 +327,7 @@ const DocumentTiming* PerformanceTiming::documentTiming() const if (!document) return 0; - return &document->timing(); + return document->timing(); } DocumentLoadTiming* PerformanceTiming::documentLoadTiming() const @@ -328,21 +336,32 @@ DocumentLoadTiming* PerformanceTiming::documentLoadTiming() const if (!loader) return 0; - return &loader->timing(); + return loader->timing(); +} + +ResourceLoadTiming* PerformanceTiming::resourceLoadTiming() const +{ + DocumentLoader* loader = documentLoader(); + if (!loader) + return 0; + + return loader->response().resourceLoadTiming(); } -unsigned long long PerformanceTiming::resourceLoadTimeRelativeToFetchStart(int relativeMilliseconds) const +unsigned long long PerformanceTiming::resourceLoadTimeRelativeToAbsolute(int relativeMilliseconds) const { ASSERT(relativeMilliseconds >= 0); - return fetchStart() + relativeMilliseconds; + ResourceLoadTiming* resourceTiming = resourceLoadTiming(); + ASSERT(resourceTiming); + return monotonicTimeToIntegerMilliseconds(resourceTiming->convertResourceLoadTimeToMonotonicTime(relativeMilliseconds)); } unsigned long long PerformanceTiming::monotonicTimeToIntegerMilliseconds(double monotonicSeconds) const { ASSERT(monotonicSeconds >= 0); - if (const DocumentLoadTiming* timing = documentLoadTiming()) - return toIntegerMilliseconds(timing->monotonicTimeToPseudoWallTime(monotonicSeconds)); - return 0; + const DocumentLoadTiming* timing = documentLoadTiming(); + ASSERT(timing); + return toIntegerMilliseconds(timing->monotonicTimeToPseudoWallTime(monotonicSeconds)); } } // namespace WebCore |
