Index: chrome/browser/net/sdch_dictionary_fetcher.cc |
diff --git a/chrome/browser/net/sdch_dictionary_fetcher.cc b/chrome/browser/net/sdch_dictionary_fetcher.cc |
index 1130fe336242b5b5c666a2ae433771e1b98d3bd4..0a838bd37fa9adb86be501707f81888b9f30e66b 100644 |
--- a/chrome/browser/net/sdch_dictionary_fetcher.cc |
+++ b/chrome/browser/net/sdch_dictionary_fetcher.cc |
@@ -49,6 +49,16 @@ void SdchDictionaryFetcher::Schedule(const GURL& dictionary_url) { |
ScheduleDelayedRun(); |
} |
+void SdchDictionaryFetcher::Cancel() { |
+ DCHECK(CalledOnValidThread()); |
+ |
+ while (!fetch_queue_.empty()) |
+ fetch_queue_.pop(); |
+ attempted_load_.clear(); |
+ weak_factory_.InvalidateWeakPtrs(); |
+ current_fetch_.reset(NULL); |
+} |
+ |
void SdchDictionaryFetcher::ScheduleDelayedRun() { |
if (fetch_queue_.empty() || current_fetch_.get() || task_is_pending_) |
return; |
@@ -64,6 +74,10 @@ void SdchDictionaryFetcher::StartFetching() { |
DCHECK(task_is_pending_); |
task_is_pending_ = false; |
+ // Handle losing the race against Cancel(). |
+ if (fetch_queue_.empty()) |
+ return; |
+ |
DCHECK(context_.get()); |
current_fetch_.reset(net::URLFetcher::Create( |
fetch_queue_.front(), net::URLFetcher::GET, this)); |