Index: chrome/browser/renderer_host/async_resource_handler.cc |
diff --git a/chrome/browser/renderer_host/async_resource_handler.cc b/chrome/browser/renderer_host/async_resource_handler.cc |
index 3ab36a27f639d7ac288c88a6e40676b1be061804..bbcb89e4081dfd00a99173b35eee19188ac18453 100644 |
--- a/chrome/browser/renderer_host/async_resource_handler.cc |
+++ b/chrome/browser/renderer_host/async_resource_handler.cc |
@@ -4,13 +4,14 @@ |
#include "chrome/browser/renderer_host/async_resource_handler.h" |
+#include "base/hash_tables.h" |
#include "base/logging.h" |
#include "base/process.h" |
#include "base/shared_memory.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/net/chrome_net_log.h" |
#include "chrome/browser/net/chrome_url_request_context.h" |
-#include "chrome/browser/net/passive_log_collector.h" |
+#include "chrome/browser/net/load_timing_observer.h" |
#include "chrome/browser/renderer_host/global_request_id.h" |
#include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h" |
#include "chrome/common/render_messages.h" |
@@ -35,22 +36,6 @@ const int kInitialReadBufSize = 32768; |
// The maximum size of the shared memory buffer. (512 kilobytes). |
const int kMaxReadBufSize = 524288; |
-// We know that this conversion is not solid and suffers from world clock |
-// changes, but it should be good enough for the load timing info. |
-static Time TimeTicksToTime(const TimeTicks& time_ticks) { |
- static int64 tick_to_time_offset; |
- static bool tick_to_time_offset_available = false; |
- if (!tick_to_time_offset_available) { |
- int64 cur_time = (Time::Now() - Time()).InMicroseconds(); |
- int64 cur_time_ticks = (TimeTicks::Now() - TimeTicks()).InMicroseconds(); |
- // If we add this number to a time tick value, it gives the timestamp. |
- tick_to_time_offset = cur_time - cur_time_ticks; |
- tick_to_time_offset_available = true; |
- } |
- return Time::FromInternalValue(time_ticks.ToInternalValue() + |
- tick_to_time_offset); |
-} |
- |
} // namespace |
// Our version of IOBuffer that uses shared memory. |
@@ -108,135 +93,22 @@ AsyncResourceHandler::~AsyncResourceHandler() { |
void AsyncResourceHandler::PopulateTimingInfo(URLRequest* request, |
ResourceResponse* response) { |
- uint32 source_id = request->net_log().source().id; |
- ChromeNetLog* chrome_net_log = static_cast<ChromeNetLog*>( |
- request->net_log().net_log()); |
- |
- PassiveLogCollector* collector = chrome_net_log->passive_collector(); |
- PassiveLogCollector::SourceTracker* url_tracker = |
- static_cast<PassiveLogCollector::SourceTracker*>(collector-> |
- GetTrackerForSourceType(net::NetLog::SOURCE_URL_REQUEST)); |
- |
- PassiveLogCollector::SourceInfo* url_request = |
- url_tracker->GetSourceInfo(source_id); |
- |
- if (!url_request) |
+ if (!(request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING)) |
return; |
- ResourceResponseHead& response_head = response->response_head; |
- webkit_glue::ResourceLoaderBridge::LoadTimingInfo& timing = |
- response_head.load_timing; |
- |
- uint32 connect_job_id = net::NetLog::Source::kInvalidId; |
- |
- base::TimeTicks base_time; |
- |
- for (PassiveLogCollector::EntryList::const_iterator it = |
- url_request->entries.begin(); |
- it != url_request->entries.end(); ++it) { |
- const PassiveLogCollector::Entry& entry = *it; |
- |
- bool is_begin = entry.phase == net::NetLog::PHASE_BEGIN; |
- bool is_end = entry.phase == net::NetLog::PHASE_END; |
- |
- switch (entry.type) { |
- case net::NetLog::TYPE_URL_REQUEST_START_JOB: |
- if (is_begin) { |
- // Reset state so that we captured last redirect only. |
- timing.base_time = TimeTicksToTime(entry.time); |
- base_time = entry.time; |
- connect_job_id = net::NetLog::Source::kInvalidId; |
- } |
- break; |
- case net::NetLog::TYPE_PROXY_SERVICE: |
- if (is_begin) { |
- timing.proxy_start = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } else if (is_end) { |
- timing.proxy_end = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } |
- break; |
- case net::NetLog::TYPE_SOCKET_POOL: |
- if (is_begin) { |
- timing.connect_start = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } else if (is_end && |
- connect_job_id != net::NetLog::Source::kInvalidId) { |
- timing.connect_end = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } |
- break; |
- case net::NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB: |
- connect_job_id = static_cast<net::NetLogSourceParameter*>( |
- entry.params.get())->value().id; |
- break; |
- case net::NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET: |
- { |
- uint32 log_id = static_cast<net::NetLogSourceParameter*>( |
- entry.params.get())->value().id; |
- response->response_head.connection_id = |
- log_id != net::NetLog::Source::kInvalidId ? log_id : 0; |
- } |
- break; |
- case net::NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST: |
- case net::NetLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST: |
- if (is_begin) { |
- timing.send_start = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } else if (is_end) { |
- timing.send_end = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } |
- break; |
- case net::NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS: |
- case net::NetLog::TYPE_SPDY_TRANSACTION_READ_HEADERS: |
- if (is_begin) { |
- timing.receive_headers_start = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } else if (is_end) { |
- timing.receive_headers_end = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } |
- break; |
- default: |
- break; |
- } |
- } |
- |
- // For DNS time, get the ID of the "connect job" from the |
- // BOUND_TO_CONNECT_JOB entry, in its source info look at the |
- // HOST_RESOLVER_IMPL times. |
- if (connect_job_id == net::NetLog::Source::kInvalidId) { |
- // Clean up connection time to match contract. |
- timing.connect_start = -1; |
- timing.connect_end = -1; |
- return; |
- } |
- |
- PassiveLogCollector::SourceTracker* connect_job_tracker = |
- static_cast<PassiveLogCollector::SourceTracker*>( |
- collector->GetTrackerForSourceType(net::NetLog::SOURCE_CONNECT_JOB)); |
- PassiveLogCollector::SourceInfo* connect_job = |
- connect_job_tracker->GetSourceInfo(connect_job_id); |
- if (!connect_job) |
+ ChromeNetLog* chrome_net_log = static_cast<ChromeNetLog*>( |
+ request->net_log().net_log()); |
+ if (chrome_net_log == NULL) |
return; |
- for (PassiveLogCollector::EntryList::const_iterator it = |
- connect_job->entries.begin(); |
- it != connect_job->entries.end(); ++it) { |
- const PassiveLogCollector::Entry& entry = *it; |
- if (entry.phase == net::NetLog::PHASE_BEGIN && |
- entry.type == net::NetLog::TYPE_HOST_RESOLVER_IMPL) { |
- timing.dns_start = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- } else if (entry.phase == net::NetLog::PHASE_END && |
- entry.type == net::NetLog::TYPE_HOST_RESOLVER_IMPL) { |
- timing.dns_end = static_cast<int32>( |
- (entry.time - base_time).InMillisecondsRoundedUp()); |
- // Connect time already includes dns time, subtract it here. |
- break; |
- } |
+ uint32 source_id = request->net_log().source().id; |
+ LoadTimingObserver* observer = chrome_net_log->load_timing_observer(); |
+ LoadTimingObserver::URLRequestRecord* record = |
+ observer->GetURLRequestRecord(source_id); |
+ if (record) { |
+ response->response_head.connection_id = record->socket_log_id; |
+ response->response_head.connection_reused = record->socket_reused; |
+ response->response_head.load_timing = record->timing; |
} |
} |
@@ -255,9 +127,7 @@ bool AsyncResourceHandler::OnRequestRedirected(int request_id, |
*defer = true; |
URLRequest* request = rdh_->GetURLRequest( |
GlobalRequestID(process_id_, request_id)); |
- // TODO(pfeldman): enable once migrated to LoadTimingObserver. |
- if (false && request && (request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING)) |
- PopulateTimingInfo(request, response); |
+ PopulateTimingInfo(request, response); |
return receiver_->Send(new ViewMsg_Resource_ReceivedRedirect( |
routing_id_, request_id, new_url, response->response_head)); |
} |
@@ -272,9 +142,7 @@ bool AsyncResourceHandler::OnResponseStarted(int request_id, |
URLRequest* request = rdh_->GetURLRequest( |
GlobalRequestID(process_id_, request_id)); |
- // TODO(pfeldman): enable once migrated to LoadTimingObserver. |
- if (false && request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING) |
- PopulateTimingInfo(request, response); |
+ PopulateTimingInfo(request, response); |
ResourceDispatcherHostRequestInfo* info = rdh_->InfoForRequest(request); |
if (info->resource_type() == ResourceType::MAIN_FRAME) { |