diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-27 16:45:07 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-27 16:45:07 +0000 |
commit | ec29880c710c0b4b545b1e4d20fee16f12527afd (patch) | |
tree | caefb25d864db1c660716a9165eca1cbcdeef2f5 /webkit/glue | |
parent | ce6c471d5ba0842e70d53f57fd7bc1053b981807 (diff) | |
download | chromium_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.cc | 19 | ||||
-rw-r--r-- | webkit/glue/resource_loader_bridge.h | 73 | ||||
-rw-r--r-- | webkit/glue/weburlloader_impl.cc | 79 |
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); } |