diff options
author | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-13 08:40:25 +0000 |
---|---|---|
committer | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-13 08:40:25 +0000 |
commit | 1ea7f7ce61a90140d472dd3543adab189c94fe7d (patch) | |
tree | 0f1fbe2f72120f35ad468a1ef1c30f7c3d6be7a3 /chrome/browser | |
parent | c68361d934e9a5bc12bd6aa5fe1839bba9df1ddb (diff) | |
download | chromium_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.cc | 3 | ||||
-rw-r--r-- | chrome/browser/net/chrome_network_delegate.cc | 8 |
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_); } |