summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/PerformanceTiming.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/page/PerformanceTiming.cpp')
-rw-r--r--Source/WebCore/page/PerformanceTiming.cpp117
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