summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-13 08:40:25 +0000
committerbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-13 08:40:25 +0000
commit1ea7f7ce61a90140d472dd3543adab189c94fe7d (patch)
tree0f1fbe2f72120f35ad468a1ef1c30f7c3d6be7a3 /chrome/browser
parentc68361d934e9a5bc12bd6aa5fe1839bba9df1ddb (diff)
downloadchromium_src-1ea7f7ce61a90140d472dd3543adab189c94fe7d.zip
chromium_src-1ea7f7ce61a90140d472dd3543adab189c94fe7d.tar.gz
chromium_src-1ea7f7ce61a90140d472dd3543adab189c94fe7d.tar.bz2
Fix leaking request IDs in webRequest API
The current webRequest API did not guarantee that either onCompleted or onErrorOccurred is called for each request. If an extension fills a REQUEST_ID -> URL hashmap for all requests at the onBeforeRequest event, and tried to delete the entries on onCompleted and onErrorOccurred, some entries remained in the hashmap. BUG=86139 TEST=execute example extension attached to bug Review URL: http://codereview.chromium.org/7190007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92331 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/extensions/extension_webrequest_api.cc3
-rw-r--r--chrome/browser/net/chrome_network_delegate.cc8
2 files changed, 8 insertions, 3 deletions
diff --git a/chrome/browser/extensions/extension_webrequest_api.cc b/chrome/browser/extensions/extension_webrequest_api.cc
index df3a9ee..35413ff 100644
--- a/chrome/browser/extensions/extension_webrequest_api.cc
+++ b/chrome/browser/extensions/extension_webrequest_api.cc
@@ -637,7 +637,8 @@ void ExtensionWebRequestEventRouter::OnErrorOccurred(
if (!HasWebRequestScheme(request->url()))
return;
- DCHECK(request->status().status() == net::URLRequestStatus::FAILED);
+ DCHECK(request->status().status() == net::URLRequestStatus::FAILED ||
+ request->status().status() == net::URLRequestStatus::CANCELED);
DCHECK(!GetAndSetSignaled(request->identifier(), kOnErrorOccurred));
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index 48350a8..1a182bc 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -110,7 +110,8 @@ void ChromeNetworkDelegate::OnRawBytesRead(const net::URLRequest& request,
}
void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request) {
- if (request->status().status() == net::URLRequestStatus::SUCCESS) {
+ if (request->status().status() == net::URLRequestStatus::SUCCESS ||
+ request->status().status() == net::URLRequestStatus::HANDLED_EXTERNALLY) {
bool is_redirect = request->response_headers() &&
net::HttpResponseHeaders::IsRedirectResponseCode(
request->response_headers()->response_code());
@@ -118,9 +119,12 @@ void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request) {
ExtensionWebRequestEventRouter::GetInstance()->OnCompleted(
profile_id_, extension_info_map_.get(), request);
}
- } else if (request->status().status() == net::URLRequestStatus::FAILED) {
+ } else if (request->status().status() == net::URLRequestStatus::FAILED ||
+ request->status().status() == net::URLRequestStatus::CANCELED) {
ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred(
profile_id_, extension_info_map_.get(), request);
+ } else {
+ NOTREACHED();
}
ForwardProxyErrors(request, event_router_.get(), profile_id_);
}