| Index: chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
|
| ===================================================================
|
| --- chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc (revision 184957)
|
| +++ chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc (working copy)
|
| @@ -17,7 +17,6 @@
|
| #include "chrome/browser/external_protocol/external_protocol_handler.h"
|
| #include "chrome/browser/google/google_util.h"
|
| #include "chrome/browser/metrics/variations/variations_http_header_provider.h"
|
| -#include "chrome/browser/net/load_timing_observer.h"
|
| #include "chrome/browser/net/resource_prefetch_predictor_observer.h"
|
| #include "chrome/browser/prerender/prerender_manager.h"
|
| #include "chrome/browser/prerender/prerender_tracker.h"
|
| @@ -39,7 +38,9 @@
|
| #include "content/public/browser/resource_context.h"
|
| #include "content/public/browser/resource_dispatcher_host.h"
|
| #include "content/public/browser/resource_request_info.h"
|
| +#include "content/public/common/resource_response.h"
|
| #include "net/base/load_flags.h"
|
| +#include "net/base/load_timing_info.h"
|
| #include "net/base/ssl_config_service.h"
|
| #include "net/http/http_response_headers.h"
|
| #include "net/url_request/url_request.h"
|
| @@ -84,6 +85,50 @@
|
| content::NotificationService::NoDetails());
|
| }
|
|
|
| +// The network stack returns actual connect times, while the renderer process
|
| +// expects times that the request was blocked in each phase of setting up
|
| +// a connection. Due to preconnect and late binding, it is possible for a
|
| +// connection attempt to start before a request has been started, so this
|
| +// function is needed to convert times from the network stack to times the
|
| +// renderer process expects.
|
| +void FixupLoadTimingInfo(net::LoadTimingInfo* load_timing_info) {
|
| + // If there are no times, do nothing.
|
| + if (load_timing_info->request_start.is_null())
|
| + return;
|
| +
|
| + // Starting the request and resolving the proxy are the only phases of the
|
| + // request that occur before it blocks on starting a connection.
|
| + base::TimeTicks block_on_connect_start = load_timing_info->request_start;
|
| + if (!load_timing_info->proxy_resolve_end.is_null())
|
| + block_on_connect_start = load_timing_info->proxy_resolve_end;
|
| +
|
| + net::LoadTimingInfo::ConnectTiming* connect_timing =
|
| + &load_timing_info->connect_timing;
|
| + if (!connect_timing->dns_start.is_null()) {
|
| + DCHECK(!connect_timing->dns_end.is_null());
|
| + if (connect_timing->dns_start < block_on_connect_start)
|
| + connect_timing->dns_start = block_on_connect_start;
|
| + if (connect_timing->dns_end < block_on_connect_start)
|
| + connect_timing->dns_end = block_on_connect_start;
|
| + }
|
| +
|
| + if (!connect_timing->connect_start.is_null()) {
|
| + DCHECK(!connect_timing->connect_end.is_null());
|
| + if (connect_timing->connect_start < block_on_connect_start)
|
| + connect_timing->connect_start = block_on_connect_start;
|
| + if (connect_timing->connect_end < block_on_connect_start)
|
| + connect_timing->connect_end = block_on_connect_start;
|
| + }
|
| +
|
| + if (!connect_timing->ssl_start.is_null()) {
|
| + DCHECK(!connect_timing->ssl_end.is_null());
|
| + if (connect_timing->ssl_start < block_on_connect_start)
|
| + connect_timing->ssl_start = block_on_connect_start;
|
| + if (connect_timing->ssl_end < block_on_connect_start)
|
| + connect_timing->ssl_end = block_on_connect_start;
|
| + }
|
| +}
|
| +
|
| } // end namespace
|
|
|
| ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate(
|
| @@ -379,7 +424,11 @@
|
| content::ResourceContext* resource_context,
|
| content::ResourceResponse* response,
|
| IPC::Sender* sender) {
|
| - LoadTimingObserver::PopulateTimingInfo(request, response);
|
| + // TODO(mmenke): Figure out if LOAD_ENABLE_LOAD_TIMING is safe to remove.
|
| + if (request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING) {
|
| + request->GetLoadTimingInfo(&response->head.load_timing);
|
| + FixupLoadTimingInfo(&response->head.load_timing);
|
| + }
|
|
|
| const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
|
|
|
| @@ -438,7 +487,11 @@
|
| net::URLRequest* request,
|
| content::ResourceContext* resource_context,
|
| content::ResourceResponse* response) {
|
| - LoadTimingObserver::PopulateTimingInfo(request, response);
|
| + // TODO(mmenke): Figure out if LOAD_ENABLE_LOAD_TIMING is safe to remove.
|
| + if (request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING) {
|
| + request->GetLoadTimingInfo(&response->head.load_timing);
|
| + FixupLoadTimingInfo(&response->head.load_timing);
|
| + }
|
|
|
| ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
|
|
|
|
|