Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: chrome/browser/translate/translate_manager.cc

Issue 3034013: Fetch the translate script regularly (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Synced Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "app/resource_bundle.h" 7 #include "app/resource_bundle.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/histogram.h" 9 #include "base/histogram.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 }; 122 };
123 123
124 const char* const kTranslateScriptURL = 124 const char* const kTranslateScriptURL =
125 "http://translate.google.com/translate_a/element.js?" 125 "http://translate.google.com/translate_a/element.js?"
126 "cb=cr.googleTranslate.onTranslateElementLoad"; 126 "cb=cr.googleTranslate.onTranslateElementLoad";
127 const char* const kTranslateScriptHeader = 127 const char* const kTranslateScriptHeader =
128 "Google-Translate-Element-Mode: library"; 128 "Google-Translate-Element-Mode: library";
129 const char* const kReportLanguageDetectionErrorURL = 129 const char* const kReportLanguageDetectionErrorURL =
130 "http://translate.google.com/translate_error"; 130 "http://translate.google.com/translate_error";
131 131
132 const int kTranslateScriptExpirationDelayMS = 24 * 60 * 60 * 1000; // 1 day.
133
132 } // namespace 134 } // namespace
133 135
134 // static 136 // static
135 base::LazyInstance<std::set<std::string> > 137 base::LazyInstance<std::set<std::string> >
136 TranslateManager::supported_languages_(base::LINKER_INITIALIZED); 138 TranslateManager::supported_languages_(base::LINKER_INITIALIZED);
137 139
138 TranslateManager::~TranslateManager() { 140 TranslateManager::~TranslateManager() {
139 } 141 }
140 142
141 // static 143 // static
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 translate_script_request_pending_ = false; 263 translate_script_request_pending_ = false;
262 bool error = 264 bool error =
263 (status.status() != URLRequestStatus::SUCCESS || response_code != 200); 265 (status.status() != URLRequestStatus::SUCCESS || response_code != 200);
264 266
265 if (!error) { 267 if (!error) {
266 base::StringPiece str = ResourceBundle::GetSharedInstance(). 268 base::StringPiece str = ResourceBundle::GetSharedInstance().
267 GetRawDataResource(IDR_TRANSLATE_JS); 269 GetRawDataResource(IDR_TRANSLATE_JS);
268 DCHECK(translate_script_.empty()); 270 DCHECK(translate_script_.empty());
269 str.CopyToString(&translate_script_); 271 str.CopyToString(&translate_script_);
270 translate_script_ += "\n" + data; 272 translate_script_ += "\n" + data;
273 // We'll expire the cached script after some time, to make sure long running
274 // browsers still get fixes that might get pushed with newer scripts.
275 MessageLoop::current()->PostDelayedTask(FROM_HERE,
276 method_factory_.NewRunnableMethod(
277 &TranslateManager::ClearTranslateScript),
278 translate_script_expiration_delay_);
271 } 279 }
272 280
273 // Process any pending requests. 281 // Process any pending requests.
274 std::vector<PendingRequest>::const_iterator iter; 282 std::vector<PendingRequest>::const_iterator iter;
275 for (iter = pending_requests_.begin(); iter != pending_requests_.end(); 283 for (iter = pending_requests_.begin(); iter != pending_requests_.end();
276 ++iter) { 284 ++iter) {
277 const PendingRequest& request = *iter; 285 const PendingRequest& request = *iter;
278 TabContents* tab = tab_util::GetTabContentsByID(request.render_process_id, 286 TabContents* tab = tab_util::GetTabContentsByID(request.render_process_id,
279 request.render_view_id); 287 request.render_view_id);
280 if (!tab) { 288 if (!tab) {
(...skipping 19 matching lines...) Expand all
300 pending_requests_.clear(); 308 pending_requests_.clear();
301 } 309 }
302 310
303 // static 311 // static
304 bool TranslateManager::IsShowingTranslateInfobar(TabContents* tab) { 312 bool TranslateManager::IsShowingTranslateInfobar(TabContents* tab) {
305 return GetTranslateInfoBarDelegate(tab) != NULL; 313 return GetTranslateInfoBarDelegate(tab) != NULL;
306 } 314 }
307 315
308 TranslateManager::TranslateManager() 316 TranslateManager::TranslateManager()
309 : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), 317 : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
318 translate_script_expiration_delay_(kTranslateScriptExpirationDelayMS),
310 translate_script_request_pending_(false) { 319 translate_script_request_pending_(false) {
311 notification_registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, 320 notification_registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED,
312 NotificationService::AllSources()); 321 NotificationService::AllSources());
313 notification_registrar_.Add(this, NotificationType::TAB_LANGUAGE_DETERMINED, 322 notification_registrar_.Add(this, NotificationType::TAB_LANGUAGE_DETERMINED,
314 NotificationService::AllSources()); 323 NotificationService::AllSources());
315 notification_registrar_.Add(this, NotificationType::PAGE_TRANSLATED, 324 notification_registrar_.Add(this, NotificationType::PAGE_TRANSLATED,
316 NotificationService::AllSources()); 325 NotificationService::AllSources());
317 } 326 }
318 327
319 void TranslateManager::InitiateTranslation(TabContents* tab, 328 void TranslateManager::InitiateTranslation(TabContents* tab,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 373
365 std::string auto_translate_to = tab->language_state().AutoTranslateTo(); 374 std::string auto_translate_to = tab->language_state().AutoTranslateTo();
366 if (!auto_translate_to.empty()) { 375 if (!auto_translate_to.empty()) {
367 // This page was navigated through a click from a translated page. 376 // This page was navigated through a click from a translated page.
368 TranslatePage(tab, page_lang, auto_translate_to); 377 TranslatePage(tab, page_lang, auto_translate_to);
369 return; 378 return;
370 } 379 }
371 380
372 // Prompts the user if he/she wants the page translated. 381 // Prompts the user if he/she wants the page translated.
373 tab->AddInfoBar(TranslateInfoBarDelegate::CreateDelegate( 382 tab->AddInfoBar(TranslateInfoBarDelegate::CreateDelegate(
374 TranslateInfoBarDelegate::kBeforeTranslate, tab, 383 TranslateInfoBarDelegate::BEFORE_TRANSLATE, tab,
375 page_lang, target_lang)); 384 page_lang, target_lang));
376 } 385 }
377 386
378 void TranslateManager::InitiateTranslationPosted( 387 void TranslateManager::InitiateTranslationPosted(
379 int process_id, int render_id, const std::string& page_lang) { 388 int process_id, int render_id, const std::string& page_lang) {
380 // The tab might have been closed. 389 // The tab might have been closed.
381 TabContents* tab = tab_util::GetTabContentsByID(process_id, render_id); 390 TabContents* tab = tab_util::GetTabContentsByID(process_id, render_id);
382 if (!tab || tab->language_state().translation_pending()) 391 if (!tab || tab->language_state().translation_pending())
383 return; 392 return;
384 393
385 InitiateTranslation(tab, page_lang); 394 InitiateTranslation(tab, page_lang);
386 } 395 }
387 396
388 void TranslateManager::TranslatePage(TabContents* tab_contents, 397 void TranslateManager::TranslatePage(TabContents* tab_contents,
389 const std::string& source_lang, 398 const std::string& source_lang,
390 const std::string& target_lang) { 399 const std::string& target_lang) {
391 NavigationEntry* entry = tab_contents->controller().GetActiveEntry(); 400 NavigationEntry* entry = tab_contents->controller().GetActiveEntry();
392 if (!entry) { 401 if (!entry) {
393 NOTREACHED(); 402 NOTREACHED();
394 return; 403 return;
395 } 404 }
396 405
397 TranslateInfoBarDelegate* infobar = GetTranslateInfoBarDelegate(tab_contents); 406 TranslateInfoBarDelegate* infobar = GetTranslateInfoBarDelegate(tab_contents);
398 if (infobar) { 407 if (infobar) {
399 // We don't show the translating infobar if no translate infobar is already 408 // We don't show the translating infobar if no translate infobar is already
400 // showing (that is the case when the translation was triggered by the 409 // showing (that is the case when the translation was triggered by the
401 // "always translate" for example). 410 // "always translate" for example).
402 infobar = TranslateInfoBarDelegate::CreateDelegate( 411 infobar = TranslateInfoBarDelegate::CreateDelegate(
403 TranslateInfoBarDelegate::kTranslating, tab_contents, 412 TranslateInfoBarDelegate::TRANSLATING, tab_contents,
404 source_lang, target_lang); 413 source_lang, target_lang);
405 ShowInfoBar(tab_contents, infobar); 414 ShowInfoBar(tab_contents, infobar);
406 } 415 }
407 416
408 if (!translate_script_.empty()) { 417 if (!translate_script_.empty()) {
409 DoTranslatePage(tab_contents, translate_script_, source_lang, target_lang); 418 DoTranslatePage(tab_contents, translate_script_, source_lang, target_lang);
410 return; 419 return;
411 } 420 }
412 421
413 // The script is not available yet. Queue that request and query for the 422 // The script is not available yet. Queue that request and query for the
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 } else if (!IsSupportedLanguage(details->source_language)) { 491 } else if (!IsSupportedLanguage(details->source_language)) {
483 // TODO(jcivelli): http://crbug.com/9390 We should change the "after 492 // TODO(jcivelli): http://crbug.com/9390 We should change the "after
484 // translate" infobar to support unknown as the original 493 // translate" infobar to support unknown as the original
485 // language. 494 // language.
486 UMA_HISTOGRAM_COUNTS("Translate.ServerReportedUnsupportedLanguage", 1); 495 UMA_HISTOGRAM_COUNTS("Translate.ServerReportedUnsupportedLanguage", 1);
487 infobar = TranslateInfoBarDelegate::CreateErrorDelegate( 496 infobar = TranslateInfoBarDelegate::CreateErrorDelegate(
488 TranslateErrors::UNSUPPORTED_LANGUAGE, tab, 497 TranslateErrors::UNSUPPORTED_LANGUAGE, tab,
489 details->source_language, details->target_language); 498 details->source_language, details->target_language);
490 } else { 499 } else {
491 infobar = TranslateInfoBarDelegate::CreateDelegate( 500 infobar = TranslateInfoBarDelegate::CreateDelegate(
492 TranslateInfoBarDelegate::kAfterTranslate, tab, 501 TranslateInfoBarDelegate::AFTER_TRANSLATE, tab,
493 details->source_language, details->target_language); 502 details->source_language, details->target_language);
494 } 503 }
495 ShowInfoBar(tab, infobar); 504 ShowInfoBar(tab, infobar);
496 } 505 }
497 506
498 bool TranslateManager::IsAcceptLanguage(TabContents* tab, 507 bool TranslateManager::IsAcceptLanguage(TabContents* tab,
499 const std::string& language) { 508 const std::string& language) {
500 PrefService* pref_service = tab->profile()->GetPrefs(); 509 PrefService* pref_service = tab->profile()->GetPrefs();
501 PrefServiceLanguagesMap::const_iterator iter = 510 PrefServiceLanguagesMap::const_iterator iter =
502 accept_languages_.find(pref_service); 511 accept_languages_.find(pref_service);
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 TranslateInfoBarDelegate* TranslateManager::GetTranslateInfoBarDelegate( 592 TranslateInfoBarDelegate* TranslateManager::GetTranslateInfoBarDelegate(
584 TabContents* tab) { 593 TabContents* tab) {
585 for (int i = 0; i < tab->infobar_delegate_count(); ++i) { 594 for (int i = 0; i < tab->infobar_delegate_count(); ++i) {
586 TranslateInfoBarDelegate* delegate = 595 TranslateInfoBarDelegate* delegate =
587 tab->GetInfoBarDelegateAt(i)->AsTranslateInfoBarDelegate(); 596 tab->GetInfoBarDelegateAt(i)->AsTranslateInfoBarDelegate();
588 if (delegate) 597 if (delegate)
589 return delegate; 598 return delegate;
590 } 599 }
591 return NULL; 600 return NULL;
592 } 601 }
OLDNEW
« no previous file with comments | « chrome/browser/translate/translate_manager.h ('k') | chrome/browser/translate/translate_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698