diff options
author | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-20 09:16:46 +0000 |
---|---|---|
committer | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-20 09:16:46 +0000 |
commit | 83475ff148f4f1500c9c6834b68d0b2970655a0f (patch) | |
tree | db160bc6dbebda7dbc4dedcfef697c13484fb842 /chrome | |
parent | 916b78c371bdc95769d001c192ab6016cc0ae6c4 (diff) | |
download | chromium_src-83475ff148f4f1500c9c6834b68d0b2970655a0f.zip chromium_src-83475ff148f4f1500c9c6834b68d0b2970655a0f.tar.gz chromium_src-83475ff148f4f1500c9c6834b68d0b2970655a0f.tar.bz2 |
DevTools: provide load timing for sync resources.
Review URL: http://codereview.chromium.org/3458004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59916 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/net/load_timing_observer.cc | 25 | ||||
-rw-r--r-- | chrome/browser/net/load_timing_observer.h | 7 | ||||
-rw-r--r-- | chrome/browser/renderer_host/async_resource_handler.cc | 27 | ||||
-rw-r--r-- | chrome/browser/renderer_host/async_resource_handler.h | 2 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_dispatcher_host.cc | 7 | ||||
-rw-r--r-- | chrome/browser/renderer_host/sync_resource_handler.cc | 23 | ||||
-rw-r--r-- | chrome/browser/renderer_host/sync_resource_handler.h | 6 | ||||
-rw-r--r-- | chrome/common/resource_dispatcher.cc | 5 |
8 files changed, 70 insertions, 32 deletions
diff --git a/chrome/browser/net/load_timing_observer.cc b/chrome/browser/net/load_timing_observer.cc index 7b292d0..433aa9b 100644 --- a/chrome/browser/net/load_timing_observer.cc +++ b/chrome/browser/net/load_timing_observer.cc @@ -6,7 +6,10 @@ #include "base/compiler_specific.h" #include "base/time.h" +#include "chrome/browser/net/chrome_net_log.h" +#include "chrome/common/resource_response.h" #include "net/base/load_flags.h" +#include "net/url_request/url_request.h" #include "net/url_request/url_request_netlog_params.h" using base::Time; @@ -77,6 +80,28 @@ void LoadTimingObserver::OnAddEntry(net::NetLog::EventType type, OnAddSocketEntry(type, time, source, phase, params); } +// static +void LoadTimingObserver::PopulateTimingInfo(URLRequest* request, + ResourceResponse* response) { + if (!(request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING)) + return; + + ChromeNetLog* chrome_net_log = static_cast<ChromeNetLog*>( + request->net_log().net_log()); + if (chrome_net_log == NULL) + return; + + 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; + } +} + void LoadTimingObserver::OnAddURLRequestEntry( net::NetLog::EventType type, const base::TimeTicks& time, diff --git a/chrome/browser/net/load_timing_observer.h b/chrome/browser/net/load_timing_observer.h index 873e224..a46d6a6 100644 --- a/chrome/browser/net/load_timing_observer.h +++ b/chrome/browser/net/load_timing_observer.h @@ -13,6 +13,9 @@ #include "net/base/net_log.h" #include "webkit/glue/resource_loader_bridge.h" +class URLRequest; +struct ResourceResponse; + // LoadTimingObserver watches the NetLog event stream and collects the network // timing information. class LoadTimingObserver : public ChromeNetLog::Observer { @@ -48,6 +51,10 @@ class LoadTimingObserver : public ChromeNetLog::Observer { const net::NetLog::Source& source, net::NetLog::EventPhase phase, net::NetLog::EventParameters* params); + + static void PopulateTimingInfo(URLRequest* request, + ResourceResponse* response); + private: FRIEND_TEST_ALL_PREFIXES(LoadTimingObserverTest, ConnectJobRecord); diff --git a/chrome/browser/renderer_host/async_resource_handler.cc b/chrome/browser/renderer_host/async_resource_handler.cc index 991a79e..5e5dfa5 100644 --- a/chrome/browser/renderer_host/async_resource_handler.cc +++ b/chrome/browser/renderer_host/async_resource_handler.cc @@ -9,7 +9,6 @@ #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/load_timing_observer.h" #include "chrome/browser/renderer_host/global_request_id.h" @@ -89,27 +88,6 @@ AsyncResourceHandler::AsyncResourceHandler( AsyncResourceHandler::~AsyncResourceHandler() { } -void AsyncResourceHandler::PopulateTimingInfo(URLRequest* request, - ResourceResponse* response) { - if (!(request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING)) - return; - - ChromeNetLog* chrome_net_log = static_cast<ChromeNetLog*>( - request->net_log().net_log()); - if (chrome_net_log == NULL) - return; - - 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; - } -} - bool AsyncResourceHandler::OnUploadProgress(int request_id, uint64 position, uint64 size) { @@ -125,7 +103,7 @@ bool AsyncResourceHandler::OnRequestRedirected(int request_id, *defer = true; URLRequest* request = rdh_->GetURLRequest( GlobalRequestID(process_id_, request_id)); - PopulateTimingInfo(request, response); + LoadTimingObserver::PopulateTimingInfo(request, response); return receiver_->Send(new ViewMsg_Resource_ReceivedRedirect( routing_id_, request_id, new_url, response->response_head)); } @@ -139,8 +117,7 @@ bool AsyncResourceHandler::OnResponseStarted(int request_id, // or of having to layout the new content twice. URLRequest* request = rdh_->GetURLRequest( GlobalRequestID(process_id_, request_id)); - - PopulateTimingInfo(request, response); + LoadTimingObserver::PopulateTimingInfo(request, response); ResourceDispatcherHostRequestInfo* info = rdh_->InfoForRequest(request); if (info->resource_type() == ResourceType::MAIN_FRAME) { diff --git a/chrome/browser/renderer_host/async_resource_handler.h b/chrome/browser/renderer_host/async_resource_handler.h index d499366..191fdb8 100644 --- a/chrome/browser/renderer_host/async_resource_handler.h +++ b/chrome/browser/renderer_host/async_resource_handler.h @@ -44,8 +44,6 @@ class AsyncResourceHandler : public ResourceHandler { private: ~AsyncResourceHandler(); - void PopulateTimingInfo(URLRequest* request, ResourceResponse* response); - scoped_refptr<SharedIOBuffer> read_buffer_; ResourceDispatcherHost::Receiver* receiver_; int process_id_; diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.cc b/chrome/browser/renderer_host/resource_dispatcher_host.cc index db59c09..dd37488 100644 --- a/chrome/browser/renderer_host/resource_dispatcher_host.cc +++ b/chrome/browser/renderer_host/resource_dispatcher_host.cc @@ -395,7 +395,6 @@ void ResourceDispatcherHost::BeginRequest( status, std::string(), // No security info needed, connection was not base::Time())); // established. - } return; } @@ -409,7 +408,11 @@ void ResourceDispatcherHost::BeginRequest( // Construct the event handler. scoped_refptr<ResourceHandler> handler; if (sync_result) { - handler = new SyncResourceHandler(receiver_, request_data.url, sync_result); + handler = new SyncResourceHandler(receiver_, + child_id, + request_data.url, + sync_result, + this); } else { handler = new AsyncResourceHandler(receiver_, child_id, diff --git a/chrome/browser/renderer_host/sync_resource_handler.cc b/chrome/browser/renderer_host/sync_resource_handler.cc index b41ec6b..6638084 100644 --- a/chrome/browser/renderer_host/sync_resource_handler.cc +++ b/chrome/browser/renderer_host/sync_resource_handler.cc @@ -5,17 +5,23 @@ #include "chrome/browser/renderer_host/sync_resource_handler.h" #include "base/logging.h" +#include "chrome/browser/net/load_timing_observer.h" +#include "chrome/browser/renderer_host/global_request_id.h" #include "chrome/common/render_messages.h" #include "net/base/io_buffer.h" #include "net/http/http_response_headers.h" SyncResourceHandler::SyncResourceHandler( ResourceDispatcherHost::Receiver* receiver, + int process_id, const GURL& url, - IPC::Message* result_message) + IPC::Message* result_message, + ResourceDispatcherHost* resource_dispatcher_host) : read_buffer_(new net::IOBuffer(kReadBufSize)), receiver_(receiver), - result_message_(result_message) { + process_id_(process_id), + result_message_(result_message), + rdh_(resource_dispatcher_host) { result_.final_url = url; } @@ -32,6 +38,10 @@ bool SyncResourceHandler::OnRequestRedirected(int request_id, const GURL& new_url, ResourceResponse* response, bool* defer) { + URLRequest* request = rdh_->GetURLRequest( + GlobalRequestID(process_id_, request_id)); + LoadTimingObserver::PopulateTimingInfo(request, response); + // TODO(darin): It would be much better if this could live in WebCore, but // doing so requires API changes at all levels. Similar code exists in // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( @@ -45,10 +55,19 @@ bool SyncResourceHandler::OnRequestRedirected(int request_id, bool SyncResourceHandler::OnResponseStarted(int request_id, ResourceResponse* response) { + URLRequest* request = rdh_->GetURLRequest( + GlobalRequestID(process_id_, request_id)); + LoadTimingObserver::PopulateTimingInfo(request, response); + // We don't care about copying the status here. result_.headers = response->response_head.headers; result_.mime_type = response->response_head.mime_type; result_.charset = response->response_head.charset; + result_.request_time = response->response_head.request_time; + result_.response_time = response->response_head.response_time; + result_.connection_id = response->response_head.connection_id; + result_.connection_reused = response->response_head.connection_reused; + result_.load_timing = response->response_head.load_timing; return true; } diff --git a/chrome/browser/renderer_host/sync_resource_handler.h b/chrome/browser/renderer_host/sync_resource_handler.h index c43fd27..6f86de7 100644 --- a/chrome/browser/renderer_host/sync_resource_handler.h +++ b/chrome/browser/renderer_host/sync_resource_handler.h @@ -21,8 +21,10 @@ class IOBuffer; class SyncResourceHandler : public ResourceHandler { public: SyncResourceHandler(ResourceDispatcherHost::Receiver* receiver, + int process_id, const GURL& url, - IPC::Message* result_message); + IPC::Message* result_message, + ResourceDispatcherHost* resource_dispatcher_host); bool OnUploadProgress(int request_id, uint64 position, uint64 size); bool OnRequestRedirected(int request_id, const GURL& new_url, @@ -46,7 +48,9 @@ class SyncResourceHandler : public ResourceHandler { SyncLoadResult result_; ResourceDispatcherHost::Receiver* receiver_; + int process_id_; IPC::Message* result_message_; + ResourceDispatcherHost* rdh_; }; #endif // CHROME_BROWSER_RENDERER_HOST_SYNC_RESOURCE_HANDLER_H_ diff --git a/chrome/common/resource_dispatcher.cc b/chrome/common/resource_dispatcher.cc index ce586c4..b274ace 100644 --- a/chrome/common/resource_dispatcher.cc +++ b/chrome/common/resource_dispatcher.cc @@ -254,6 +254,11 @@ void IPCResourceLoaderBridge::SyncLoad(SyncLoadResponse* response) { response->headers = result.headers; response->mime_type = result.mime_type; response->charset = result.charset; + response->request_time = result.request_time; + response->response_time = result.response_time; + response->connection_id = result.connection_id; + response->connection_reused = result.connection_reused; + response->load_timing = result.load_timing; response->data.swap(result.data); } |