| 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 |