Index: chrome/browser/translate/translate_manager.cc |
=================================================================== |
--- chrome/browser/translate/translate_manager.cc (revision 90030) |
+++ chrome/browser/translate/translate_manager.cc (working copy) |
@@ -349,27 +349,19 @@ |
int response_code, |
const net::ResponseCookies& cookies, |
const std::string& data) { |
- scoped_ptr<const URLFetcher> delete_ptr(source); |
- DCHECK(translate_script_request_pending_ || language_list_request_pending_); |
- // We quickly recognize that we are handling a translate script request |
- // if we don't have a language_list_request_pending_. Otherwise we do the |
- // more expensive check of confirming we got the kTranslateScriptURL in the |
- // rare case where we would have both requests pending at the same time. |
- bool translate_script_request = !language_list_request_pending_ || |
- url == GURL(kTranslateScriptURL); |
- // Here we make sure that if we didn't get the translate_script_request, |
- // we actually got a language_list_request. |
- DCHECK(translate_script_request || url == GURL(kLanguageListFetchURL)); |
- if (translate_script_request) |
- translate_script_request_pending_ = false; |
- else |
- language_list_request_pending_ = false; |
+ if (translate_script_request_pending_.get() != source && |
+ language_list_request_pending_.get() != source) { |
+ // Looks like crash on Mac is possibly caused with callback entering here |
cbentzel
2011/06/24 19:56:08
Should you add a CHECK here so we can see failures
|
+ // with unknown fetcher when network is refreshed. |
+ scoped_ptr<const URLFetcher> delete_ptr(source); |
+ return; |
+ } |
- bool error = |
- (status.status() != net::URLRequestStatus::SUCCESS || |
- response_code != 200); |
- |
- if (translate_script_request) { |
+ bool error = (status.status() != net::URLRequestStatus::SUCCESS || |
+ response_code != 200); |
+ if (translate_script_request_pending_.get() == source) { |
+ scoped_ptr<const URLFetcher> delete_ptr( |
+ translate_script_request_pending_.release()); |
if (!error) { |
base::StringPiece str = ResourceBundle::GetSharedInstance(). |
GetRawDataResource(IDR_TRANSLATE_JS); |
@@ -412,7 +404,9 @@ |
} |
} |
pending_requests_.clear(); |
- } else { // if (translate_script_request) |
+ } else { // if (translate_script_request_pending_.get() == source) |
+ scoped_ptr<const URLFetcher> delete_ptr( |
+ language_list_request_pending_.release()); |
if (!error) |
SetSupportedLanguages(data); |
else |
@@ -427,9 +421,7 @@ |
TranslateManager::TranslateManager() |
: ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), |
- translate_script_expiration_delay_(kTranslateScriptExpirationDelayMS), |
- translate_script_request_pending_(false), |
- language_list_request_pending_(false) { |
+ translate_script_expiration_delay_(kTranslateScriptExpirationDelayMS) { |
notification_registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, |
NotificationService::AllSources()); |
notification_registrar_.Add(this, NotificationType::TAB_LANGUAGE_DETERMINED, |
@@ -705,7 +697,7 @@ |
void TranslateManager::FetchLanguageListFromTranslateServer( |
PrefService* prefs) { |
- if (language_list_request_pending_) |
+ if (language_list_request_pending_.get() != NULL) |
return; |
// We don't want to do this when translate is disabled. |
@@ -716,24 +708,30 @@ |
return; |
} |
- language_list_request_pending_ = true; |
- URLFetcher* fetcher = URLFetcher::Create(1, GURL(kLanguageListFetchURL), |
- URLFetcher::GET, this); |
- fetcher->set_request_context(Profile::GetDefaultRequestContext()); |
- fetcher->set_max_retries(kMaxRetryLanguageListFetch); |
- fetcher->Start(); |
+ language_list_request_pending_.reset(URLFetcher::Create( |
+ 1, GURL(kLanguageListFetchURL), URLFetcher::GET, this)); |
+ language_list_request_pending_->set_request_context( |
+ Profile::GetDefaultRequestContext()); |
+ language_list_request_pending_->set_max_retries(kMaxRetryLanguageListFetch); |
+ language_list_request_pending_->Start(); |
} |
+void TranslateManager::CleanupPendingUlrFetcher() { |
+ language_list_request_pending_.reset(); |
+ translate_script_request_pending_.reset(); |
+} |
+ |
void TranslateManager::RequestTranslateScript() { |
- if (translate_script_request_pending_) |
+ if (translate_script_request_pending_.get() != NULL) |
return; |
- translate_script_request_pending_ = true; |
- URLFetcher* fetcher = URLFetcher::Create(0, GURL(kTranslateScriptURL), |
- URLFetcher::GET, this); |
- fetcher->set_request_context(Profile::GetDefaultRequestContext()); |
- fetcher->set_extra_request_headers(kTranslateScriptHeader); |
- fetcher->Start(); |
+ translate_script_request_pending_.reset(URLFetcher::Create( |
+ 0, GURL(kTranslateScriptURL), URLFetcher::GET, this)); |
+ translate_script_request_pending_->set_request_context( |
+ Profile::GetDefaultRequestContext()); |
+ translate_script_request_pending_->set_extra_request_headers( |
+ kTranslateScriptHeader); |
+ translate_script_request_pending_->Start(); |
} |
void TranslateManager::ShowInfoBar(TabContents* tab, |