| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/translate/translate_manager.h" | 5 #include "chrome/browser/translate/translate_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
| 11 #include "base/message_loop.h" | |
| 12 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 13 #include "base/prefs/pref_service.h" | 12 #include "base/prefs/pref_service.h" |
| 14 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
| 15 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 16 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 17 #include "base/time.h" | 16 #include "base/time.h" |
| 18 #include "base/values.h" | 17 #include "base/values.h" |
| 19 #include "chrome/browser/browser_process.h" | 18 #include "chrome/browser/browser_process.h" |
| 20 #include "chrome/browser/infobars/infobar_service.h" | 19 #include "chrome/browser/infobars/infobar_service.h" |
| 21 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
| 22 #include "chrome/browser/tab_contents/language_state.h" | 21 #include "chrome/browser/tab_contents/language_state.h" |
| 23 #include "chrome/browser/tab_contents/tab_util.h" | 22 #include "chrome/browser/tab_contents/tab_util.h" |
| 24 #include "chrome/browser/translate/page_translated_details.h" | 23 #include "chrome/browser/translate/page_translated_details.h" |
| 25 #include "chrome/browser/translate/translate_accept_languages.h" | 24 #include "chrome/browser/translate/translate_accept_languages.h" |
| 26 #include "chrome/browser/translate/translate_browser_metrics.h" | 25 #include "chrome/browser/translate/translate_browser_metrics.h" |
| 27 #include "chrome/browser/translate/translate_error_details.h" | 26 #include "chrome/browser/translate/translate_error_details.h" |
| 28 #include "chrome/browser/translate/translate_event_details.h" | 27 #include "chrome/browser/translate/translate_event_details.h" |
| 29 #include "chrome/browser/translate/translate_infobar_delegate.h" | 28 #include "chrome/browser/translate/translate_infobar_delegate.h" |
| 30 #include "chrome/browser/translate/translate_language_list.h" | 29 #include "chrome/browser/translate/translate_language_list.h" |
| 31 #include "chrome/browser/translate/translate_prefs.h" | 30 #include "chrome/browser/translate/translate_prefs.h" |
| 31 #include "chrome/browser/translate/translate_script.h" |
| 32 #include "chrome/browser/translate/translate_tab_helper.h" | 32 #include "chrome/browser/translate/translate_tab_helper.h" |
| 33 #include "chrome/browser/translate/translate_url_util.h" | 33 #include "chrome/browser/translate/translate_url_util.h" |
| 34 #include "chrome/browser/ui/browser.h" | 34 #include "chrome/browser/ui/browser.h" |
| 35 #include "chrome/browser/ui/browser_finder.h" | 35 #include "chrome/browser/ui/browser_finder.h" |
| 36 #include "chrome/browser/ui/browser_tabstrip.h" | 36 #include "chrome/browser/ui/browser_tabstrip.h" |
| 37 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 37 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 38 #include "chrome/common/chrome_constants.h" | 38 #include "chrome/common/chrome_constants.h" |
| 39 #include "chrome/common/chrome_notification_types.h" | 39 #include "chrome/common/chrome_notification_types.h" |
| 40 #include "chrome/common/chrome_switches.h" | 40 #include "chrome/common/chrome_switches.h" |
| 41 #include "chrome/common/pref_names.h" | 41 #include "chrome/common/pref_names.h" |
| 42 #include "chrome/common/render_messages.h" | 42 #include "chrome/common/render_messages.h" |
| 43 #include "chrome/common/translate/language_detection_details.h" | 43 #include "chrome/common/translate/language_detection_details.h" |
| 44 #include "chrome/common/url_constants.h" | 44 #include "chrome/common/url_constants.h" |
| 45 #include "content/public/browser/navigation_controller.h" | 45 #include "content/public/browser/navigation_controller.h" |
| 46 #include "content/public/browser/navigation_details.h" | 46 #include "content/public/browser/navigation_details.h" |
| 47 #include "content/public/browser/navigation_entry.h" | 47 #include "content/public/browser/navigation_entry.h" |
| 48 #include "content/public/browser/notification_details.h" | 48 #include "content/public/browser/notification_details.h" |
| 49 #include "content/public/browser/notification_service.h" | 49 #include "content/public/browser/notification_service.h" |
| 50 #include "content/public/browser/notification_source.h" | 50 #include "content/public/browser/notification_source.h" |
| 51 #include "content/public/browser/notification_types.h" | 51 #include "content/public/browser/notification_types.h" |
| 52 #include "content/public/browser/render_process_host.h" | 52 #include "content/public/browser/render_process_host.h" |
| 53 #include "content/public/browser/render_view_host.h" | 53 #include "content/public/browser/render_view_host.h" |
| 54 #include "content/public/browser/web_contents.h" | 54 #include "content/public/browser/web_contents.h" |
| 55 #include "google_apis/google_api_keys.h" | |
| 56 #include "grit/browser_resources.h" | |
| 57 #include "net/base/escape.h" | |
| 58 #include "net/base/load_flags.h" | 55 #include "net/base/load_flags.h" |
| 59 #include "net/base/url_util.h" | 56 #include "net/base/url_util.h" |
| 60 #include "net/http/http_status_code.h" | 57 #include "net/http/http_status_code.h" |
| 61 #include "net/url_request/url_fetcher.h" | |
| 62 #include "net/url_request/url_request_status.h" | |
| 63 #include "ui/base/l10n/l10n_util.h" | 58 #include "ui/base/l10n/l10n_util.h" |
| 64 #include "ui/base/resource/resource_bundle.h" | |
| 65 | 59 |
| 66 #ifdef FILE_MANAGER_EXTENSION | 60 #ifdef FILE_MANAGER_EXTENSION |
| 67 #include "chrome/browser/chromeos/extensions/file_manager/file_manager_util.h" | 61 #include "chrome/browser/chromeos/extensions/file_manager/file_manager_util.h" |
| 68 #include "extensions/common/constants.h" | 62 #include "extensions/common/constants.h" |
| 69 #endif | 63 #endif |
| 70 | 64 |
| 71 using content::NavigationController; | 65 using content::NavigationController; |
| 72 using content::NavigationEntry; | 66 using content::NavigationEntry; |
| 73 using content::WebContents; | 67 using content::WebContents; |
| 74 | 68 |
| 75 namespace { | 69 namespace { |
| 76 | 70 |
| 77 const char kTranslateScriptURL[] = | |
| 78 "https://translate.google.com/translate_a/element.js"; | |
| 79 const char kTranslateScriptHeader[] = "Google-Translate-Element-Mode: library"; | |
| 80 const char kReportLanguageDetectionErrorURL[] = | 71 const char kReportLanguageDetectionErrorURL[] = |
| 81 "https://translate.google.com/translate_error?client=cr&action=langidc"; | 72 "https://translate.google.com/translate_error?client=cr&action=langidc"; |
| 82 | 73 |
| 83 // Used in kTranslateScriptURL to specify a callback function name. | |
| 84 const char kCallbackQueryName[] = "cb"; | |
| 85 const char kCallbackQueryValue[] = | |
| 86 "cr.googleTranslate.onTranslateElementLoad"; | |
| 87 | |
| 88 // Used in kReportLanguageDetectionErrorURL to specify the original page | 74 // Used in kReportLanguageDetectionErrorURL to specify the original page |
| 89 // language. | 75 // language. |
| 90 const char kSourceLanguageQueryName[] = "sl"; | 76 const char kSourceLanguageQueryName[] = "sl"; |
| 91 | 77 |
| 92 // Used in kReportLanguageDetectionErrorURL to specify the page URL. | 78 // Used in kReportLanguageDetectionErrorURL to specify the page URL. |
| 93 const char kUrlQueryName[] = "u"; | 79 const char kUrlQueryName[] = "u"; |
| 94 | 80 |
| 95 // The delay in ms that we'll wait to check if a page has finished loading | 81 // The delay in ms that we'll wait to check if a page has finished loading |
| 96 // before attempting a translation. | 82 // before attempting a translation. |
| 97 const int kTranslateLoadCheckDelayMs = 150; | 83 const int kTranslateLoadCheckDelayMs = 150; |
| 98 | 84 |
| 99 // The maximum number of attempts we'll do to see if the page has finshed | 85 // The maximum number of attempts we'll do to see if the page has finshed |
| 100 // loading before giving up the translation | 86 // loading before giving up the translation |
| 101 const int kMaxTranslateLoadCheckAttempts = 20; | 87 const int kMaxTranslateLoadCheckAttempts = 20; |
| 102 | 88 |
| 103 const int kTranslateScriptExpirationDelayDays = 1; | |
| 104 | |
| 105 } // namespace | 89 } // namespace |
| 106 | 90 |
| 107 TranslateManager::~TranslateManager() { | 91 TranslateManager::~TranslateManager() { |
| 108 weak_method_factory_.InvalidateWeakPtrs(); | 92 weak_method_factory_.InvalidateWeakPtrs(); |
| 109 } | 93 } |
| 110 | 94 |
| 111 // static | 95 // static |
| 112 TranslateManager* TranslateManager::GetInstance() { | 96 TranslateManager* TranslateManager::GetInstance() { |
| 113 return Singleton<TranslateManager>::get(); | 97 return Singleton<TranslateManager>::get(); |
| 114 } | 98 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 bool TranslateManager::IsAcceptLanguage(Profile* profile, | 164 bool TranslateManager::IsAcceptLanguage(Profile* profile, |
| 181 const std::string& language) { | 165 const std::string& language) { |
| 182 if (GetInstance()->accept_languages_.get()) { | 166 if (GetInstance()->accept_languages_.get()) { |
| 183 return GetInstance()->accept_languages_->IsAcceptLanguage( | 167 return GetInstance()->accept_languages_->IsAcceptLanguage( |
| 184 profile, language); | 168 profile, language); |
| 185 } | 169 } |
| 186 NOTREACHED(); | 170 NOTREACHED(); |
| 187 return false; | 171 return false; |
| 188 } | 172 } |
| 189 | 173 |
| 174 void TranslateManager::SetTranslateScriptExpirationDelay(int delay_ms) { |
| 175 if (script_.get() == NULL) { |
| 176 NOTREACHED(); |
| 177 return; |
| 178 } |
| 179 script_->set_expiration_delay(delay_ms); |
| 180 } |
| 181 |
| 190 void TranslateManager::Observe(int type, | 182 void TranslateManager::Observe(int type, |
| 191 const content::NotificationSource& source, | 183 const content::NotificationSource& source, |
| 192 const content::NotificationDetails& details) { | 184 const content::NotificationDetails& details) { |
| 193 switch (type) { | 185 switch (type) { |
| 194 case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { | 186 case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { |
| 195 NavigationController* controller = | 187 NavigationController* controller = |
| 196 content::Source<NavigationController>(source).ptr(); | 188 content::Source<NavigationController>(source).ptr(); |
| 197 content::LoadCommittedDetails* load_details = | 189 content::LoadCommittedDetails* load_details = |
| 198 content::Details<content::LoadCommittedDetails>(details).ptr(); | 190 content::Details<content::LoadCommittedDetails>(details).ptr(); |
| 199 NavigationEntry* entry = controller->GetActiveEntry(); | 191 NavigationEntry* entry = controller->GetActiveEntry(); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 PageTranslatedDetails* page_translated_details = | 269 PageTranslatedDetails* page_translated_details = |
| 278 content::Details<PageTranslatedDetails>(details).ptr(); | 270 content::Details<PageTranslatedDetails>(details).ptr(); |
| 279 PageTranslated(tab, page_translated_details); | 271 PageTranslated(tab, page_translated_details); |
| 280 break; | 272 break; |
| 281 } | 273 } |
| 282 default: | 274 default: |
| 283 NOTREACHED(); | 275 NOTREACHED(); |
| 284 } | 276 } |
| 285 } | 277 } |
| 286 | 278 |
| 287 void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) { | |
| 288 if (translate_script_request_pending_.get() != source) { | |
| 289 // Looks like crash on Mac is possibly caused with callback entering here | |
| 290 // with unknown fetcher when network is refreshed. | |
| 291 scoped_ptr<const net::URLFetcher> delete_ptr(source); | |
| 292 return; | |
| 293 } | |
| 294 | |
| 295 bool error = | |
| 296 source->GetStatus().status() != net::URLRequestStatus::SUCCESS || | |
| 297 source->GetResponseCode() != net::HTTP_OK; | |
| 298 if (translate_script_request_pending_.get() == source) { | |
| 299 scoped_ptr<const net::URLFetcher> delete_ptr( | |
| 300 translate_script_request_pending_.release()); | |
| 301 if (!error) { | |
| 302 base::StringPiece str = ResourceBundle::GetSharedInstance(). | |
| 303 GetRawDataResource(IDR_TRANSLATE_JS); | |
| 304 DCHECK(translate_script_.empty()); | |
| 305 str.CopyToString(&translate_script_); | |
| 306 std::string argument = "('"; | |
| 307 std::string api_key = google_apis::GetAPIKey(); | |
| 308 argument += net::EscapeQueryParamValue(api_key, true); | |
| 309 argument += "');\n"; | |
| 310 std::string data; | |
| 311 source->GetResponseAsString(&data); | |
| 312 translate_script_ += argument + data; | |
| 313 | |
| 314 // We'll expire the cached script after some time, to make sure long | |
| 315 // running browsers still get fixes that might get pushed with newer | |
| 316 // scripts. | |
| 317 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, | |
| 318 base::Bind(&TranslateManager::ClearTranslateScript, | |
| 319 weak_method_factory_.GetWeakPtr()), | |
| 320 translate_script_expiration_delay_); | |
| 321 } | |
| 322 // Process any pending requests. | |
| 323 std::vector<PendingRequest>::const_iterator iter; | |
| 324 for (iter = pending_requests_.begin(); iter != pending_requests_.end(); | |
| 325 ++iter) { | |
| 326 const PendingRequest& request = *iter; | |
| 327 WebContents* web_contents = | |
| 328 tab_util::GetWebContentsByID(request.render_process_id, | |
| 329 request.render_view_id); | |
| 330 if (!web_contents) { | |
| 331 // The tab went away while we were retrieving the script. | |
| 332 continue; | |
| 333 } | |
| 334 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | |
| 335 if (!entry || entry->GetPageID() != request.page_id) { | |
| 336 // We navigated away from the page the translation was triggered on. | |
| 337 continue; | |
| 338 } | |
| 339 | |
| 340 if (error) { | |
| 341 Profile* profile = | |
| 342 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | |
| 343 TranslateInfoBarDelegate::Create( | |
| 344 InfoBarService::FromWebContents(web_contents), | |
| 345 true, | |
| 346 TranslateInfoBarDelegate::TRANSLATION_ERROR, | |
| 347 TranslateErrors::NETWORK, | |
| 348 profile->GetPrefs(), | |
| 349 ShortcutConfig(), | |
| 350 request.source_lang, | |
| 351 request.target_lang); | |
| 352 | |
| 353 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { | |
| 354 TranslateErrorDetails error_details; | |
| 355 error_details.time = base::Time::Now(); | |
| 356 error_details.url = entry->GetURL(); | |
| 357 error_details.error = TranslateErrors::NETWORK; | |
| 358 NotifyTranslateError(error_details); | |
| 359 } | |
| 360 } else { | |
| 361 // Translate the page. | |
| 362 DoTranslatePage(web_contents, translate_script_, | |
| 363 request.source_lang, request.target_lang); | |
| 364 } | |
| 365 } | |
| 366 pending_requests_.clear(); | |
| 367 } | |
| 368 } | |
| 369 | |
| 370 void TranslateManager::AddObserver(Observer* obs) { | 279 void TranslateManager::AddObserver(Observer* obs) { |
| 371 observer_list_.AddObserver(obs); | 280 observer_list_.AddObserver(obs); |
| 372 } | 281 } |
| 373 | 282 |
| 374 void TranslateManager::RemoveObserver(Observer* obs) { | 283 void TranslateManager::RemoveObserver(Observer* obs) { |
| 375 observer_list_.RemoveObserver(obs); | 284 observer_list_.RemoveObserver(obs); |
| 376 } | 285 } |
| 377 | 286 |
| 378 void TranslateManager::NotifyTranslateEvent( | 287 void TranslateManager::NotifyTranslateEvent( |
| 379 const TranslateEventDetails& details) { | 288 const TranslateEventDetails& details) { |
| 380 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateEvent(details)); | 289 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateEvent(details)); |
| 381 } | 290 } |
| 382 | 291 |
| 383 void TranslateManager::NotifyLanguageDetection( | 292 void TranslateManager::NotifyLanguageDetection( |
| 384 const LanguageDetectionDetails& details) { | 293 const LanguageDetectionDetails& details) { |
| 385 FOR_EACH_OBSERVER(Observer, observer_list_, OnLanguageDetection(details)); | 294 FOR_EACH_OBSERVER(Observer, observer_list_, OnLanguageDetection(details)); |
| 386 } | 295 } |
| 387 | 296 |
| 388 void TranslateManager::NotifyTranslateError( | 297 void TranslateManager::NotifyTranslateError( |
| 389 const TranslateErrorDetails& details) { | 298 const TranslateErrorDetails& details) { |
| 390 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateError(details)); | 299 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateError(details)); |
| 391 } | 300 } |
| 392 | 301 |
| 393 TranslateManager::TranslateManager() | 302 TranslateManager::TranslateManager() |
| 394 : weak_method_factory_(this), | 303 : weak_method_factory_(this), |
| 395 translate_script_expiration_delay_(base::TimeDelta::FromDays( | |
| 396 kTranslateScriptExpirationDelayDays)), | |
| 397 max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts) { | 304 max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts) { |
| 398 notification_registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 305 notification_registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 399 content::NotificationService::AllSources()); | 306 content::NotificationService::AllSources()); |
| 400 notification_registrar_.Add(this, | 307 notification_registrar_.Add(this, |
| 401 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, | 308 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, |
| 402 content::NotificationService::AllSources()); | 309 content::NotificationService::AllSources()); |
| 403 notification_registrar_.Add(this, chrome::NOTIFICATION_PAGE_TRANSLATED, | 310 notification_registrar_.Add(this, chrome::NOTIFICATION_PAGE_TRANSLATED, |
| 404 content::NotificationService::AllSources()); | 311 content::NotificationService::AllSources()); |
| 405 language_list_.reset(new TranslateLanguageList); | 312 language_list_.reset(new TranslateLanguageList); |
| 406 accept_languages_.reset(new TranslateAcceptLanguages); | 313 accept_languages_.reset(new TranslateAcceptLanguages); |
| 314 script_.reset(new TranslateScript); |
| 407 } | 315 } |
| 408 | 316 |
| 409 void TranslateManager::InitiateTranslation(WebContents* web_contents, | 317 void TranslateManager::InitiateTranslation(WebContents* web_contents, |
| 410 const std::string& page_lang) { | 318 const std::string& page_lang) { |
| 411 Profile* profile = | 319 Profile* profile = |
| 412 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 320 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
| 413 Profile* original_profile = profile->GetOriginalProfile(); | 321 Profile* original_profile = profile->GetOriginalProfile(); |
| 414 PrefService* prefs = original_profile->GetPrefs(); | 322 PrefService* prefs = original_profile->GetPrefs(); |
| 415 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { | 323 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { |
| 416 TranslateBrowserMetrics::ReportInitiationStatus( | 324 TranslateBrowserMetrics::ReportInitiationStatus( |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 // kUnknownLanguageCode in order to send a translation request with enabling | 487 // kUnknownLanguageCode in order to send a translation request with enabling |
| 580 // server side auto language detection. | 488 // server side auto language detection. |
| 581 if (!IsSupportedLanguage(source_lang)) | 489 if (!IsSupportedLanguage(source_lang)) |
| 582 source_lang = std::string(chrome::kUnknownLanguageCode); | 490 source_lang = std::string(chrome::kUnknownLanguageCode); |
| 583 | 491 |
| 584 TranslateInfoBarDelegate::Create( | 492 TranslateInfoBarDelegate::Create( |
| 585 InfoBarService::FromWebContents(web_contents), true, | 493 InfoBarService::FromWebContents(web_contents), true, |
| 586 TranslateInfoBarDelegate::TRANSLATING, TranslateErrors::NONE, | 494 TranslateInfoBarDelegate::TRANSLATING, TranslateErrors::NONE, |
| 587 profile->GetPrefs(), ShortcutConfig(), source_lang, target_lang); | 495 profile->GetPrefs(), ShortcutConfig(), source_lang, target_lang); |
| 588 | 496 |
| 589 if (!translate_script_.empty()) { | 497 DCHECK(script_.get() != NULL); |
| 590 DoTranslatePage(web_contents, translate_script_, source_lang, target_lang); | 498 |
| 499 const std::string& translate_script = script_->data(); |
| 500 if (!translate_script.empty()) { |
| 501 DoTranslatePage(web_contents, translate_script, source_lang, target_lang); |
| 591 return; | 502 return; |
| 592 } | 503 } |
| 593 | 504 |
| 594 // The script is not available yet. Queue that request and query for the | 505 // The script is not available yet. Queue that request and query for the |
| 595 // script. Once it is downloaded we'll do the translate. | 506 // script. Once it is downloaded we'll do the translate. |
| 596 content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); | 507 content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); |
| 597 PendingRequest request; | 508 PendingRequest request; |
| 598 request.render_process_id = rvh->GetProcess()->GetID(); | 509 request.render_process_id = rvh->GetProcess()->GetID(); |
| 599 request.render_view_id = rvh->GetRoutingID(); | 510 request.render_view_id = rvh->GetRoutingID(); |
| 600 request.page_id = entry->GetPageID(); | 511 request.page_id = entry->GetPageID(); |
| 601 request.source_lang = source_lang; | 512 request.source_lang = source_lang; |
| 602 request.target_lang = target_lang; | 513 request.target_lang = target_lang; |
| 603 pending_requests_.push_back(request); | 514 pending_requests_.push_back(request); |
| 604 RequestTranslateScript(); | 515 |
| 516 if (script_->HasPendingRequest()) |
| 517 return; |
| 518 |
| 519 script_->Request( |
| 520 base::Bind(&TranslateManager::OnTranslateScriptFetchComplete, |
| 521 base::Unretained(this))); |
| 605 } | 522 } |
| 606 | 523 |
| 607 void TranslateManager::RevertTranslation(WebContents* web_contents) { | 524 void TranslateManager::RevertTranslation(WebContents* web_contents) { |
| 608 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | 525 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
| 609 if (!entry) { | 526 if (!entry) { |
| 610 NOTREACHED(); | 527 NOTREACHED(); |
| 611 return; | 528 return; |
| 612 } | 529 } |
| 613 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( | 530 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( |
| 614 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); | 531 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 643 kSourceLanguageQueryName, | 560 kSourceLanguageQueryName, |
| 644 translate_tab_helper->language_state().original_language()); | 561 translate_tab_helper->language_state().original_language()); |
| 645 | 562 |
| 646 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); | 563 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); |
| 647 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); | 564 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); |
| 648 | 565 |
| 649 chrome::AddSelectedTabWithURL(browser, report_error_url, | 566 chrome::AddSelectedTabWithURL(browser, report_error_url, |
| 650 content::PAGE_TRANSITION_AUTO_BOOKMARK); | 567 content::PAGE_TRANSITION_AUTO_BOOKMARK); |
| 651 } | 568 } |
| 652 | 569 |
| 570 void TranslateManager::ClearTranslateScript() { |
| 571 if (script_.get() == NULL) { |
| 572 NOTREACHED(); |
| 573 return; |
| 574 } |
| 575 script_->Clear(); |
| 576 } |
| 577 |
| 653 void TranslateManager::DoTranslatePage(WebContents* web_contents, | 578 void TranslateManager::DoTranslatePage(WebContents* web_contents, |
| 654 const std::string& translate_script, | 579 const std::string& translate_script, |
| 655 const std::string& source_lang, | 580 const std::string& source_lang, |
| 656 const std::string& target_lang) { | 581 const std::string& target_lang) { |
| 657 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | 582 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
| 658 if (!entry) { | 583 if (!entry) { |
| 659 NOTREACHED(); | 584 NOTREACHED(); |
| 660 return; | 585 return; |
| 661 } | 586 } |
| 662 | 587 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 } | 636 } |
| 712 | 637 |
| 713 if (language_list_.get()) | 638 if (language_list_.get()) |
| 714 language_list_->RequestLanguageList(); | 639 language_list_->RequestLanguageList(); |
| 715 else | 640 else |
| 716 NOTREACHED(); | 641 NOTREACHED(); |
| 717 } | 642 } |
| 718 | 643 |
| 719 void TranslateManager::CleanupPendingUlrFetcher() { | 644 void TranslateManager::CleanupPendingUlrFetcher() { |
| 720 language_list_.reset(); | 645 language_list_.reset(); |
| 721 translate_script_request_pending_.reset(); | 646 script_.reset(); |
| 722 } | 647 } |
| 723 | 648 |
| 724 void TranslateManager::RequestTranslateScript() { | 649 void TranslateManager::OnTranslateScriptFetchComplete( |
| 725 if (translate_script_request_pending_.get() != NULL) | 650 bool success, const std::string& data) { |
| 726 return; | 651 std::vector<PendingRequest>::const_iterator iter; |
| 652 for (iter = pending_requests_.begin(); iter != pending_requests_.end(); |
| 653 ++iter) { |
| 654 const PendingRequest& request = *iter; |
| 655 WebContents* web_contents = |
| 656 tab_util::GetWebContentsByID(request.render_process_id, |
| 657 request.render_view_id); |
| 658 if (!web_contents) { |
| 659 // The tab went away while we were retrieving the script. |
| 660 continue; |
| 661 } |
| 662 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
| 663 if (!entry || entry->GetPageID() != request.page_id) { |
| 664 // We navigated away from the page the translation was triggered on. |
| 665 continue; |
| 666 } |
| 727 | 667 |
| 728 GURL translate_script_url; | 668 if (success) { |
| 729 // Check if command-line contains an alternative URL for translate service. | 669 // Translate the page. |
| 730 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 670 const std::string& translate_script = script_->data(); |
| 731 if (command_line.HasSwitch(switches::kTranslateScriptURL)) { | 671 DoTranslatePage(web_contents, translate_script, |
| 732 translate_script_url = GURL( | 672 request.source_lang, request.target_lang); |
| 733 command_line.GetSwitchValueASCII(switches::kTranslateScriptURL)); | 673 } else { |
| 734 if (!translate_script_url.is_valid() || | 674 Profile* profile = |
| 735 !translate_script_url.query().empty()) { | 675 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
| 736 LOG(WARNING) << "The following translate URL specified at the " | 676 TranslateInfoBarDelegate::Create( |
| 737 << "command-line is invalid: " | 677 InfoBarService::FromWebContents(web_contents), |
| 738 << translate_script_url.spec(); | 678 true, |
| 739 translate_script_url = GURL(); | 679 TranslateInfoBarDelegate::TRANSLATION_ERROR, |
| 680 TranslateErrors::NETWORK, |
| 681 profile->GetPrefs(), |
| 682 ShortcutConfig(), |
| 683 request.source_lang, |
| 684 request.target_lang); |
| 685 |
| 686 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { |
| 687 TranslateErrorDetails error_details; |
| 688 error_details.time = base::Time::Now(); |
| 689 error_details.url = entry->GetURL(); |
| 690 error_details.error = TranslateErrors::NETWORK; |
| 691 NotifyTranslateError(error_details); |
| 692 } |
| 740 } | 693 } |
| 741 } | 694 } |
| 742 // Use default URL when command-line argument is not specified, or specified | 695 pending_requests_.clear(); |
| 743 // URL is invalid. | |
| 744 if (translate_script_url.is_empty()) | |
| 745 translate_script_url = GURL(kTranslateScriptURL); | |
| 746 | |
| 747 translate_script_url = net::AppendQueryParameter( | |
| 748 translate_script_url, | |
| 749 kCallbackQueryName, | |
| 750 kCallbackQueryValue); | |
| 751 | |
| 752 translate_script_url = | |
| 753 TranslateURLUtil::AddHostLocaleToUrl(translate_script_url); | |
| 754 translate_script_url = | |
| 755 TranslateURLUtil::AddApiKeyToUrl(translate_script_url); | |
| 756 | |
| 757 translate_script_request_pending_.reset(net::URLFetcher::Create( | |
| 758 0, translate_script_url, net::URLFetcher::GET, this)); | |
| 759 translate_script_request_pending_->SetLoadFlags( | |
| 760 net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES); | |
| 761 translate_script_request_pending_->SetRequestContext( | |
| 762 g_browser_process->system_request_context()); | |
| 763 translate_script_request_pending_->SetExtraRequestHeaders( | |
| 764 kTranslateScriptHeader); | |
| 765 translate_script_request_pending_->Start(); | |
| 766 } | 696 } |
| 767 | 697 |
| 768 // static | 698 // static |
| 769 std::string TranslateManager::GetTargetLanguage(PrefService* prefs) { | 699 std::string TranslateManager::GetTargetLanguage(PrefService* prefs) { |
| 770 std::string ui_lang = | 700 std::string ui_lang = |
| 771 GetLanguageCode(g_browser_process->GetApplicationLocale()); | 701 GetLanguageCode(g_browser_process->GetApplicationLocale()); |
| 772 if (IsSupportedLanguage(ui_lang)) | 702 if (IsSupportedLanguage(ui_lang)) |
| 773 return ui_lang; | 703 return ui_lang; |
| 774 | 704 |
| 775 // Getting the accepted languages list | 705 // Getting the accepted languages list |
| (...skipping 22 matching lines...) Expand all Loading... |
| 798 // reason so we are more aggressive showing the shortcuts for never translate. | 728 // reason so we are more aggressive showing the shortcuts for never translate. |
| 799 #if defined(OS_ANDROID) | 729 #if defined(OS_ANDROID) |
| 800 config.never_translate_min_count = 1; | 730 config.never_translate_min_count = 1; |
| 801 #else | 731 #else |
| 802 config.never_translate_min_count = 3; | 732 config.never_translate_min_count = 3; |
| 803 #endif // defined(OS_ANDROID) | 733 #endif // defined(OS_ANDROID) |
| 804 | 734 |
| 805 config.always_translate_min_count = 3; | 735 config.always_translate_min_count = 3; |
| 806 return config; | 736 return config; |
| 807 } | 737 } |
| OLD | NEW |