diff options
author | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-13 10:41:01 +0000 |
---|---|---|
committer | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-13 10:41:01 +0000 |
commit | a83dd330dfcc8914c2f1a348d619f0c39b8da50e (patch) | |
tree | 8b292fe9f4a8293ce9faad34ccff25a2dabd9336 /chrome/browser/net/chrome_network_delegate.cc | |
parent | b5523b350fa5eee2eaf1aa4fb9bc63f14815539a (diff) | |
download | chromium_src-a83dd330dfcc8914c2f1a348d619f0c39b8da50e.zip chromium_src-a83dd330dfcc8914c2f1a348d619f0c39b8da50e.tar.gz chromium_src-a83dd330dfcc8914c2f1a348d619f0c39b8da50e.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
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=92331
Review URL: http://codereview.chromium.org/7190007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92349 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/net/chrome_network_delegate.cc')
-rw-r--r-- | chrome/browser/net/chrome_network_delegate.cc | 8 |
1 files changed, 6 insertions, 2 deletions
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_); } |