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/renderer/translate/translate_helper.h" | 5 #include "chrome/renderer/translate/translate_helper.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 bool is_cld_reliable; | 174 bool is_cld_reliable; |
175 std::string language = translate::DeterminePageLanguage( | 175 std::string language = translate::DeterminePageLanguage( |
176 content_language, html_lang, contents, &cld_language, &is_cld_reliable); | 176 content_language, html_lang, contents, &cld_language, &is_cld_reliable); |
177 | 177 |
178 if (language.empty()) | 178 if (language.empty()) |
179 return; | 179 return; |
180 | 180 |
181 language_determined_time_ = base::TimeTicks::Now(); | 181 language_determined_time_ = base::TimeTicks::Now(); |
182 | 182 |
183 GURL url(document.url()); | 183 GURL url(document.url()); |
184 LanguageDetectionDetails details; | 184 translate::LanguageDetectionDetails details; |
185 details.time = base::Time::Now(); | 185 details.time = base::Time::Now(); |
186 details.url = url; | 186 details.url = url; |
187 details.content_language = content_language; | 187 details.content_language = content_language; |
188 details.cld_language = cld_language; | 188 details.cld_language = cld_language; |
189 details.is_cld_reliable = is_cld_reliable; | 189 details.is_cld_reliable = is_cld_reliable; |
190 details.html_root_language = html_lang; | 190 details.html_root_language = html_lang; |
191 details.adopted_language = language; | 191 details.adopted_language = language; |
192 | 192 |
193 // TODO(hajimehoshi): If this affects performance, it should be set only if | 193 // TODO(hajimehoshi): If this affects performance, it should be set only if |
194 // translate-internals tab exists. | 194 // translate-internals tab exists. |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 | 458 |
459 void TranslateHelper::CheckTranslateStatus(int page_seq_no) { | 459 void TranslateHelper::CheckTranslateStatus(int page_seq_no) { |
460 // If this is not the same page, the translation has been canceled. If the | 460 // If this is not the same page, the translation has been canceled. If the |
461 // view is gone, the page is closing. | 461 // view is gone, the page is closing. |
462 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) | 462 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) |
463 return; | 463 return; |
464 | 464 |
465 // First check if there was an error. | 465 // First check if there was an error. |
466 if (HasTranslationFailed()) { | 466 if (HasTranslationFailed()) { |
467 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. | 467 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. |
468 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); | 468 NotifyBrowserTranslationFailed( |
| 469 translate::TranslateErrors::TRANSLATION_ERROR); |
469 return; // There was an error. | 470 return; // There was an error. |
470 } | 471 } |
471 | 472 |
472 if (HasTranslationFinished()) { | 473 if (HasTranslationFinished()) { |
473 std::string actual_source_lang; | 474 std::string actual_source_lang; |
474 // Translation was successfull, if it was auto, retrieve the source | 475 // Translation was successfull, if it was auto, retrieve the source |
475 // language the Translate Element detected. | 476 // language the Translate Element detected. |
476 if (source_lang_ == kAutoDetectionLanguage) { | 477 if (source_lang_ == kAutoDetectionLanguage) { |
477 actual_source_lang = GetOriginalPageLanguage(); | 478 actual_source_lang = GetOriginalPageLanguage(); |
478 if (actual_source_lang.empty()) { | 479 if (actual_source_lang.empty()) { |
479 NotifyBrowserTranslationFailed(TranslateErrors::UNKNOWN_LANGUAGE); | 480 NotifyBrowserTranslationFailed( |
| 481 translate::TranslateErrors::UNKNOWN_LANGUAGE); |
480 return; | 482 return; |
481 } else if (actual_source_lang == target_lang_) { | 483 } else if (actual_source_lang == target_lang_) { |
482 NotifyBrowserTranslationFailed(TranslateErrors::IDENTICAL_LANGUAGES); | 484 NotifyBrowserTranslationFailed( |
| 485 translate::TranslateErrors::IDENTICAL_LANGUAGES); |
483 return; | 486 return; |
484 } | 487 } |
485 } else { | 488 } else { |
486 actual_source_lang = source_lang_; | 489 actual_source_lang = source_lang_; |
487 } | 490 } |
488 | 491 |
489 if (!translation_pending_) { | 492 if (!translation_pending_) { |
490 NOTREACHED(); | 493 NOTREACHED(); |
491 return; | 494 return; |
492 } | 495 } |
493 | 496 |
494 translation_pending_ = false; | 497 translation_pending_ = false; |
495 | 498 |
496 // Check JavaScript performance counters for UMA reports. | 499 // Check JavaScript performance counters for UMA reports. |
497 translate::ReportTimeToTranslate( | 500 translate::ReportTimeToTranslate( |
498 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime")); | 501 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime")); |
499 | 502 |
500 // Notify the browser we are done. | 503 // Notify the browser we are done. |
501 render_view()->Send(new ChromeViewHostMsg_PageTranslated( | 504 render_view()->Send( |
502 render_view()->GetRoutingID(), actual_source_lang, target_lang_, | 505 new ChromeViewHostMsg_PageTranslated(render_view()->GetRoutingID(), |
503 TranslateErrors::NONE)); | 506 actual_source_lang, |
| 507 target_lang_, |
| 508 translate::TranslateErrors::NONE)); |
504 return; | 509 return; |
505 } | 510 } |
506 | 511 |
507 // The translation is still pending, check again later. | 512 // The translation is still pending, check again later. |
508 base::MessageLoop::current()->PostDelayedTask( | 513 base::MessageLoop::current()->PostDelayedTask( |
509 FROM_HERE, | 514 FROM_HERE, |
510 base::Bind(&TranslateHelper::CheckTranslateStatus, | 515 base::Bind(&TranslateHelper::CheckTranslateStatus, |
511 weak_method_factory_.GetWeakPtr(), page_seq_no), | 516 weak_method_factory_.GetWeakPtr(), page_seq_no), |
512 AdjustDelay(kTranslateStatusCheckDelayMs)); | 517 AdjustDelay(kTranslateStatusCheckDelayMs)); |
513 } | 518 } |
514 | 519 |
515 void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { | 520 void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { |
516 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); | 521 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); |
517 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) | 522 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) |
518 return; | 523 return; |
519 | 524 |
520 if (!IsTranslateLibReady()) { | 525 if (!IsTranslateLibReady()) { |
521 // The library is not ready, try again later, unless we have tried several | 526 // The library is not ready, try again later, unless we have tried several |
522 // times unsucessfully already. | 527 // times unsucessfully already. |
523 if (++count >= kMaxTranslateInitCheckAttempts) { | 528 if (++count >= kMaxTranslateInitCheckAttempts) { |
524 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); | 529 NotifyBrowserTranslationFailed( |
| 530 translate::TranslateErrors::INITIALIZATION_ERROR); |
525 return; | 531 return; |
526 } | 532 } |
527 base::MessageLoop::current()->PostDelayedTask( | 533 base::MessageLoop::current()->PostDelayedTask( |
528 FROM_HERE, | 534 FROM_HERE, |
529 base::Bind(&TranslateHelper::TranslatePageImpl, | 535 base::Bind(&TranslateHelper::TranslatePageImpl, |
530 weak_method_factory_.GetWeakPtr(), | 536 weak_method_factory_.GetWeakPtr(), |
531 page_seq_no, count), | 537 page_seq_no, count), |
532 AdjustDelay(count * kTranslateInitCheckDelayMs)); | 538 AdjustDelay(count * kTranslateInitCheckDelayMs)); |
533 return; | 539 return; |
534 } | 540 } |
535 | 541 |
536 // The library is loaded, and ready for translation now. | 542 // The library is loaded, and ready for translation now. |
537 // Check JavaScript performance counters for UMA reports. | 543 // Check JavaScript performance counters for UMA reports. |
538 translate::ReportTimeToBeReady( | 544 translate::ReportTimeToBeReady( |
539 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); | 545 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); |
540 translate::ReportTimeToLoad( | 546 translate::ReportTimeToLoad( |
541 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); | 547 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); |
542 | 548 |
543 if (!StartTranslation()) { | 549 if (!StartTranslation()) { |
544 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); | 550 NotifyBrowserTranslationFailed( |
| 551 translate::TranslateErrors::TRANSLATION_ERROR); |
545 return; | 552 return; |
546 } | 553 } |
547 // Check the status of the translation. | 554 // Check the status of the translation. |
548 base::MessageLoop::current()->PostDelayedTask( | 555 base::MessageLoop::current()->PostDelayedTask( |
549 FROM_HERE, | 556 FROM_HERE, |
550 base::Bind(&TranslateHelper::CheckTranslateStatus, | 557 base::Bind(&TranslateHelper::CheckTranslateStatus, |
551 weak_method_factory_.GetWeakPtr(), page_seq_no), | 558 weak_method_factory_.GetWeakPtr(), page_seq_no), |
552 AdjustDelay(kTranslateStatusCheckDelayMs)); | 559 AdjustDelay(kTranslateStatusCheckDelayMs)); |
553 } | 560 } |
554 | 561 |
555 void TranslateHelper::NotifyBrowserTranslationFailed( | 562 void TranslateHelper::NotifyBrowserTranslationFailed( |
556 TranslateErrors::Type error) { | 563 translate::TranslateErrors::Type error) { |
557 translation_pending_ = false; | 564 translation_pending_ = false; |
558 // Notify the browser there was an error. | 565 // Notify the browser there was an error. |
559 render_view()->Send(new ChromeViewHostMsg_PageTranslated( | 566 render_view()->Send(new ChromeViewHostMsg_PageTranslated( |
560 render_view()->GetRoutingID(), source_lang_, target_lang_, error)); | 567 render_view()->GetRoutingID(), source_lang_, target_lang_, error)); |
561 } | 568 } |
562 | 569 |
563 WebFrame* TranslateHelper::GetMainFrame() { | 570 WebFrame* TranslateHelper::GetMainFrame() { |
564 WebView* web_view = render_view()->GetWebView(); | 571 WebView* web_view = render_view()->GetWebView(); |
565 | 572 |
566 // When the tab is going to be closed, the web_view can be NULL. | 573 // When the tab is going to be closed, the web_view can be NULL. |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 // be DEFERRED until CLD is ready. In the latter case, CLD is in dynamic mode | 646 // be DEFERRED until CLD is ready. In the latter case, CLD is in dynamic mode |
640 // and may eventually become available, triggering the RESUMED event; after | 647 // and may eventually become available, triggering the RESUMED event; after |
641 // this, everything should start being ON_TIME. This should never run more | 648 // this, everything should start being ON_TIME. This should never run more |
642 // than twice in a page load, under any conditions. | 649 // than twice in a page load, under any conditions. |
643 // Also note that language detection is triggered off of a delay AFTER the | 650 // Also note that language detection is triggered off of a delay AFTER the |
644 // page load completed event has fired, making this very much off the critical | 651 // page load completed event has fired, making this very much off the critical |
645 // path. | 652 // path. |
646 content::RenderThread::Get()->UpdateHistograms( | 653 content::RenderThread::Get()->UpdateHistograms( |
647 content::kHistogramSynchronizerReservedSequenceNumber); | 654 content::kHistogramSynchronizerReservedSequenceNumber); |
648 } | 655 } |
OLD | NEW |