summaryrefslogtreecommitdiffstats
path: root/webkit/glue
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-27 16:45:07 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-27 16:45:07 +0000
commitec29880c710c0b4b545b1e4d20fee16f12527afd (patch)
treecaefb25d864db1c660716a9165eca1cbcdeef2f5 /webkit/glue
parentce6c471d5ba0842e70d53f57fd7bc1053b981807 (diff)
downloadchromium_src-ec29880c710c0b4b545b1e4d20fee16f12527afd.zip
chromium_src-ec29880c710c0b4b545b1e4d20fee16f12527afd.tar.gz
chromium_src-ec29880c710c0b4b545b1e4d20fee16f12527afd.tar.bz2
LoadTiming in net part 7: Hooking it all up
Use the new load timing implementation in net/ to replace LoadTimingObserver. This should fix reported times when using a SPDY proxy, and results in more heavily tested and (hopefully) less regression-prone code. BUG=77446 Review URL: https://chromiumcodereview.appspot.com/12094085 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@190955 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue')
-rw-r--r--webkit/glue/resource_loader_bridge.cc19
-rw-r--r--webkit/glue/resource_loader_bridge.h73
-rw-r--r--webkit/glue/weburlloader_impl.cc79
3 files changed, 61 insertions, 110 deletions
diff --git a/webkit/glue/resource_loader_bridge.cc b/webkit/glue/resource_loader_bridge.cc
index c099f68..395d88d 100644
--- a/webkit/glue/resource_loader_bridge.cc
+++ b/webkit/glue/resource_loader_bridge.cc
@@ -9,23 +9,6 @@
namespace webkit_glue {
-ResourceLoadTimingInfo::ResourceLoadTimingInfo()
- : proxy_start(-1),
- proxy_end(-1),
- dns_start(-1),
- dns_end(-1),
- connect_start(-1),
- connect_end(-1),
- ssl_start(-1),
- ssl_end(-1),
- send_start(0),
- send_end(0),
- receive_headers_start(0),
- receive_headers_end(0) {
-}
-
-ResourceLoadTimingInfo::~ResourceLoadTimingInfo() {}
-
ResourceDevToolsInfo::ResourceDevToolsInfo()
: http_status_code(0) {
}
@@ -36,8 +19,6 @@ ResourceResponseInfo::ResourceResponseInfo()
: content_length(-1),
encoded_data_length(-1),
appcache_id(appcache::kNoCacheId),
- connection_id(0),
- connection_reused(false),
was_fetched_via_spdy(false),
was_npn_negotiated(false),
was_alternate_protocol_available(false),
diff --git a/webkit/glue/resource_loader_bridge.h b/webkit/glue/resource_loader_bridge.h
index 4f3d6c3..f914bec 100644
--- a/webkit/glue/resource_loader_bridge.h
+++ b/webkit/glue/resource_loader_bridge.h
@@ -30,6 +30,7 @@
#include "base/values.h"
#include "googleurl/src/gurl.h"
#include "net/base/host_port_pair.h"
+#include "net/base/load_timing_info.h"
#include "net/base/request_priority.h"
#include "net/url_request/url_request_status.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebReferrerPolicy.h"
@@ -44,67 +45,6 @@ class HttpResponseHeaders;
namespace webkit_glue {
class ResourceRequestBody;
-// Structure containing timing information for the request. It addresses
-// http://groups.google.com/group/http-archive-specification/web/har-1-1-spec
-// and http://dev.w3.org/2006/webapi/WebTiming/ needs.
-//
-// All the values for starts and ends are given in milliseconds and are
-// offsets with respect to the given base time.
-struct ResourceLoadTimingInfo {
- WEBKIT_GLUE_EXPORT ResourceLoadTimingInfo();
- WEBKIT_GLUE_EXPORT ~ResourceLoadTimingInfo();
-
- // All the values in this struct are given as offsets in ticks wrt
- // this base tick count.
- base::TimeTicks base_ticks;
-
- // The value of Time::Now() when base_ticks was set.
- base::Time base_time;
-
- // The time that proxy processing started. For requests with no proxy phase,
- // this time is -1.
- int32 proxy_start;
-
- // The time that proxy processing ended. For reused sockets this time
- // is -1.
- int32 proxy_end;
-
- // The time that DNS lookup started. For reused sockets this time is -1.
- int32 dns_start;
-
- // The time that DNS lookup ended. For reused sockets this time is -1.
- int32 dns_end;
-
- // The time that establishing connection started. Connect time includes
- // DNS, blocking, TCP, TCP retries and SSL time.
- int32 connect_start;
-
- // The time that establishing connection ended. Connect time includes
- // DNS, blocking, TCP, TCP retries and SSL time.
- int32 connect_end;
-
- // The time at which SSL handshake started. For non-HTTPS requests this
- // is 0.
- int32 ssl_start;
-
- // The time at which SSL handshake ended. For non-HTTPS requests this is 0.
- int32 ssl_end;
-
- // The time that HTTP request started. For non-HTTP requests this is 0.
- int32 send_start;
-
- // The time that HTTP request ended. For non-HTTP requests this is 0.
- int32 send_end;
-
- // The time at which receiving HTTP headers started. For non-HTTP requests
- // this is 0.
- int32 receive_headers_start;
-
- // The time at which receiving HTTP headers ended. For non-HTTP requests
- // this is 0.
- int32 receive_headers_end;
-};
-
struct ResourceDevToolsInfo : base::RefCounted<ResourceDevToolsInfo> {
typedef std::vector<std::pair<std::string, std::string> >
HeadersVector;
@@ -163,16 +103,9 @@ struct ResourceResponseInfo {
// Note: this value is only populated for main resource requests.
GURL appcache_manifest_url;
- // Connection identifier from the underlying network stack. In case there
- // is no associated connection, contains 0.
- uint32 connection_id;
-
- // Determines whether physical connection reused.
- bool connection_reused;
-
// Detailed timing information used by the WebTiming, HAR and Developer
- // Tools.
- ResourceLoadTimingInfo load_timing;
+ // Tools. Includes socket ID and socket reuse information.
+ net::LoadTimingInfo load_timing;
// Actual request and response headers, as obtained from the network stack.
// Only present if request had LOAD_REPORT_RAW_HEADERS in load_flags, and
diff --git a/webkit/glue/weburlloader_impl.cc b/webkit/glue/weburlloader_impl.cc
index 7b955ba..87483d1 100644
--- a/webkit/glue/weburlloader_impl.cc
+++ b/webkit/glue/weburlloader_impl.cc
@@ -130,8 +130,8 @@ bool GetInfoFromDataURL(const GURL& url,
*error_code = net::OK;
// Assure same time for all time fields of data: URLs.
Time now = Time::Now();
- info->load_timing.base_time = now;
- info->load_timing.base_ticks = TimeTicks::Now();
+ info->load_timing.request_start = TimeTicks::Now();
+ info->load_timing.request_start_time = now;
info->request_time = now;
info->response_time = now;
info->headers = NULL;
@@ -150,6 +150,53 @@ bool GetInfoFromDataURL(const GURL& url,
typedef ResourceDevToolsInfo::HeadersVector HeadersVector;
+// Given a base time and a second time, returns the time from the base time to
+// the second time, in milliseconds. If the second time is null, returns -1.
+// The base time must not be null.
+int TimeTicksToOffset(base::TimeTicks base_time, base::TimeTicks time) {
+ if (time.is_null())
+ return -1;
+ DCHECK(!base_time.is_null());
+ return static_cast<int>((time - base_time).InMillisecondsRoundedUp());
+}
+
+// Converts timing data from |load_timing| to the format used by WebKit.
+void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing,
+ WebURLLoadTiming* url_timing) {
+ DCHECK(!load_timing.request_start.is_null());
+
+ url_timing->initialize();
+ url_timing->setRequestTime(
+ (load_timing.request_start - TimeTicks()).InSecondsF());
+ url_timing->setProxyStart(TimeTicksToOffset(load_timing.request_start,
+ load_timing.proxy_resolve_start));
+ url_timing->setProxyEnd(TimeTicksToOffset(load_timing.request_start,
+ load_timing.proxy_resolve_end));
+ url_timing->setDNSStart(TimeTicksToOffset(
+ load_timing.request_start,
+ load_timing.connect_timing.dns_start));
+ url_timing->setDNSEnd(TimeTicksToOffset(load_timing.request_start,
+ load_timing.connect_timing.dns_end));
+ url_timing->setConnectStart(
+ TimeTicksToOffset(load_timing.request_start,
+ load_timing.connect_timing.connect_start));
+ url_timing->setConnectEnd(
+ TimeTicksToOffset(load_timing.request_start,
+ load_timing.connect_timing.connect_end));
+ url_timing->setSSLStart(
+ TimeTicksToOffset(load_timing.request_start,
+ load_timing.connect_timing.ssl_start));
+ url_timing->setSSLEnd(TimeTicksToOffset(load_timing.request_start,
+ load_timing.connect_timing.ssl_end));
+ url_timing->setSendStart(TimeTicksToOffset(load_timing.request_start,
+ load_timing.send_start));
+ url_timing->setSendEnd(TimeTicksToOffset(load_timing.request_start,
+ load_timing.send_end));
+ url_timing->setReceiveHeadersEnd(
+ TimeTicksToOffset(load_timing.request_start,
+ load_timing.receive_headers_end));
+}
+
void PopulateURLResponse(
const GURL& url,
const ResourceResponseInfo& info,
@@ -162,13 +209,13 @@ void PopulateURLResponse(
response->setSecurityInfo(info.security_info);
response->setAppCacheID(info.appcache_id);
response->setAppCacheManifestURL(info.appcache_manifest_url);
- response->setWasCached(!info.load_timing.base_time.is_null() &&
- info.response_time < info.load_timing.base_time);
+ response->setWasCached(!info.load_timing.request_start_time.is_null() &&
+ info.response_time < info.load_timing.request_start_time);
response->setRemoteIPAddress(
WebString::fromUTF8(info.socket_address.host()));
response->setRemotePort(info.socket_address.port());
- response->setConnectionID(info.connection_id);
- response->setConnectionReused(info.connection_reused);
+ response->setConnectionID(info.load_timing.socket_log_id);
+ response->setConnectionReused(info.load_timing.socket_reused);
response->setDownloadFilePath(
webkit_base::FilePathToWebString(info.download_file_path));
WebURLResponseExtraDataImpl* extra_data =
@@ -180,22 +227,12 @@ void PopulateURLResponse(
info.was_alternate_protocol_available);
extra_data->set_was_fetched_via_proxy(info.was_fetched_via_proxy);
- const ResourceLoadTimingInfo& timing_info = info.load_timing;
- if (!timing_info.base_time.is_null()) {
+ // If there's no received headers end time, don't set load timing. This is
+ // the case for non-HTTP requests, requests that don't go over the wire, and
+ // certain error cases.
+ if (!info.load_timing.receive_headers_end.is_null()) {
WebURLLoadTiming timing;
- timing.initialize();
- timing.setRequestTime((timing_info.base_ticks - TimeTicks()).InSecondsF());
- timing.setProxyStart(timing_info.proxy_start);
- timing.setProxyEnd(timing_info.proxy_end);
- timing.setDNSStart(timing_info.dns_start);
- timing.setDNSEnd(timing_info.dns_end);
- timing.setConnectStart(timing_info.connect_start);
- timing.setConnectEnd(timing_info.connect_end);
- timing.setSSLStart(timing_info.ssl_start);
- timing.setSSLEnd(timing_info.ssl_end);
- timing.setSendStart(timing_info.send_start);
- timing.setSendEnd(timing_info.send_end);
- timing.setReceiveHeadersEnd(timing_info.receive_headers_end);
+ PopulateURLLoadTiming(info.load_timing, &timing);
response->setLoadTiming(timing);
}