diff options
author | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-20 16:28:16 +0000 |
---|---|---|
committer | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-20 16:28:16 +0000 |
commit | 82b42300d2c9e02161d92dab3aea5cb3dc7dd236 (patch) | |
tree | 8d7404ccbbd1ea1013d0b99bf0be6a2f99180f1e /chrome/browser | |
parent | bb3be70c22f021a052c5ced2f4ce229ddf66f705 (diff) | |
download | chromium_src-82b42300d2c9e02161d92dab3aea5cb3dc7dd236.zip chromium_src-82b42300d2c9e02161d92dab3aea5cb3dc7dd236.tar.gz chromium_src-82b42300d2c9e02161d92dab3aea5cb3dc7dd236.tar.bz2 |
Implementation of chrome.experimental.webRequest.onRequestSent
BUG=60101
TEST=browser_tests --gtest_filter='ExtensionWebRequestApiTest.WebRequestEvents'
Review URL: http://codereview.chromium.org/6853014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82308 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
4 files changed, 63 insertions, 10 deletions
diff --git a/chrome/browser/extensions/extension_webrequest_api.cc b/chrome/browser/extensions/extension_webrequest_api.cc index 22102b4..3220402 100644 --- a/chrome/browser/extensions/extension_webrequest_api.cc +++ b/chrome/browser/extensions/extension_webrequest_api.cc @@ -298,6 +298,16 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest( if (profile_id == Profile::kInvalidProfileId) return net::OK; + // If this is an HTTP request, keep track of it. HTTP-specific events only + // have the request ID, so we'll need to look up the URLRequest from that. + // We need to do this even if no extension subscribes to OnBeforeRequest to + // guarantee that |http_requests_| is populated if an extension subscribes + // to OnBeforeSendHeaders or OnRequestSent. + if (request->url().SchemeIs(chrome::kHttpScheme) || + request->url().SchemeIs(chrome::kHttpsScheme)) { + http_requests_[request->identifier()] = request; + } + int tab_id = -1; int window_id = -1; ResourceType::Type resource_type = ResourceType::LAST_TYPE; @@ -309,13 +319,6 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest( if (listeners.empty()) return net::OK; - // If this is an HTTP request, keep track of it. HTTP-specific events only - // have the request ID, so we'll need to look up the URLRequest from that. - if (request->url().SchemeIs(chrome::kHttpScheme) || - request->url().SchemeIs(chrome::kHttpsScheme)) { - http_requests_[request->identifier()] = request; - } - ListValue args; DictionaryValue* dict = new DictionaryValue(); dict->SetString(keys::kRequestIdKey, @@ -351,7 +354,6 @@ int ExtensionWebRequestEventRouter::OnBeforeSendHeaders( return net::OK; net::URLRequest* request = iter->second; - http_requests_.erase(iter); std::vector<const EventListener*> listeners = GetMatchingListeners(profile_id, keys::kOnBeforeSendHeaders, request); @@ -363,8 +365,7 @@ int ExtensionWebRequestEventRouter::OnBeforeSendHeaders( dict->SetString(keys::kRequestIdKey, base::Uint64ToString(request->identifier())); dict->SetString(keys::kUrlKey, request->url().spec()); - dict->SetDouble(keys::kTimeStampKey, - request->request_time().ToDoubleT() * 1000); + dict->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); // TODO(mpcomplete): request headers. args.Append(dict); @@ -374,6 +375,40 @@ int ExtensionWebRequestEventRouter::OnBeforeSendHeaders( return net::OK; } +void ExtensionWebRequestEventRouter::OnRequestSent( + ProfileId profile_id, + ExtensionEventRouterForwarder* event_router, + uint64 request_id, + const net::HostPortPair& socket_address) { + if (profile_id == Profile::kInvalidProfileId) + return; + base::Time time(base::Time::Now()); + + HttpRequestMap::iterator iter = http_requests_.find(request_id); + if (iter == http_requests_.end()) + return; + + net::URLRequest* request = iter->second; + http_requests_.erase(iter); + + std::vector<const EventListener*> listeners = + GetMatchingListeners(profile_id, keys::kOnRequestSent, request); + if (listeners.empty()) + return; + + ListValue args; + DictionaryValue* dict = new DictionaryValue(); + dict->SetString(keys::kRequestIdKey, + base::Uint64ToString(request->identifier())); + dict->SetString(keys::kUrlKey, request->url().spec()); + dict->SetString(keys::kIpKey, socket_address.host()); + dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); + // TODO(battre): request line and request headers. + args.Append(dict); + + DispatchEvent(profile_id, event_router, request, NULL, listeners, args); +} + void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( ProfileId profile_id, net::URLRequest* request) { http_requests_.erase(request->identifier()); diff --git a/chrome/browser/extensions/extension_webrequest_api.h b/chrome/browser/extensions/extension_webrequest_api.h index 1300900..c15f73d 100644 --- a/chrome/browser/extensions/extension_webrequest_api.h +++ b/chrome/browser/extensions/extension_webrequest_api.h @@ -22,6 +22,7 @@ class ExtensionEventRouterForwarder; class GURL; namespace net { +class HostPortPair; class HttpRequestHeaders; class URLRequest; } @@ -55,6 +56,13 @@ class ExtensionWebRequestEventRouter { net::CompletionCallback* callback, net::HttpRequestHeaders* headers); + // Dispatches the onRequestSent event. This is fired for HTTP(s) requests + // only. + void OnRequestSent(ProfileId profile_id, + ExtensionEventRouterForwarder* event_router, + uint64 request_id, + const net::HostPortPair& socket_address); + void OnURLRequestDestroyed(ProfileId profile_id, net::URLRequest* request); // Called when an event listener handles a blocking event and responds. diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc index 6cb0321..3380bde 100644 --- a/chrome/browser/net/chrome_network_delegate.cc +++ b/chrome/browser/net/chrome_network_delegate.cc @@ -12,6 +12,7 @@ #include "chrome/browser/prefs/pref_member.h" #include "chrome/common/pref_names.h" #include "content/browser/browser_thread.h" +#include "net/base/host_port_pair.h" #include "net/base/net_errors.h" #include "net/http/http_request_headers.h" #include "net/url_request/url_request.h" @@ -78,6 +79,13 @@ int ChromeNetworkDelegate::OnBeforeSendHeaders( profile_id_, event_router_.get(), request_id, callback, headers); } +void ChromeNetworkDelegate::OnRequestSent( + uint64 request_id, + const net::HostPortPair& socket_address) { + ExtensionWebRequestEventRouter::GetInstance()->OnRequestSent( + profile_id_, event_router_.get(), request_id, socket_address); +} + void ChromeNetworkDelegate::OnResponseStarted(net::URLRequest* request) { ForwardProxyErrors(request, event_router_.get(), profile_id_); } diff --git a/chrome/browser/net/chrome_network_delegate.h b/chrome/browser/net/chrome_network_delegate.h index 3e414f4..36f1b74 100644 --- a/chrome/browser/net/chrome_network_delegate.h +++ b/chrome/browser/net/chrome_network_delegate.h @@ -45,6 +45,8 @@ class ChromeNetworkDelegate : public net::NetworkDelegate { virtual int OnBeforeSendHeaders(uint64 request_id, net::CompletionCallback* callback, net::HttpRequestHeaders* headers); + virtual void OnRequestSent(uint64 request_id, + const net::HostPortPair& socket_address); virtual void OnResponseStarted(net::URLRequest* request); virtual void OnReadCompleted(net::URLRequest* request, int bytes_read); virtual void OnURLRequestDestroyed(net::URLRequest* request); |