summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-20 16:28:16 +0000
committerbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-20 16:28:16 +0000
commit82b42300d2c9e02161d92dab3aea5cb3dc7dd236 (patch)
tree8d7404ccbbd1ea1013d0b99bf0be6a2f99180f1e /chrome/browser
parentbb3be70c22f021a052c5ced2f4ce229ddf66f705 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/extensions/extension_webrequest_api.cc55
-rw-r--r--chrome/browser/extensions/extension_webrequest_api.h8
-rw-r--r--chrome/browser/net/chrome_network_delegate.cc8
-rw-r--r--chrome/browser/net/chrome_network_delegate.h2
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);