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 "components/translate/content/renderer/translate_helper.h" | 5 #include "components/translate/content/renderer/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/location.h" |
9 #include "base/logging.h" | 10 #include "base/logging.h" |
10 #include "base/message_loop/message_loop.h" | |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 12 #include "base/single_thread_task_runner.h" |
12 #include "base/strings/string16.h" | 13 #include "base/strings/string16.h" |
13 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
14 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "base/thread_task_runner_handle.h" |
15 #include "components/translate/content/common/translate_messages.h" | 17 #include "components/translate/content/common/translate_messages.h" |
16 #include "components/translate/content/renderer/renderer_cld_data_provider.h" | 18 #include "components/translate/content/renderer/renderer_cld_data_provider.h" |
17 #include "components/translate/content/renderer/renderer_cld_data_provider_facto
ry.h" | 19 #include "components/translate/content/renderer/renderer_cld_data_provider_facto
ry.h" |
18 #include "components/translate/content/renderer/renderer_cld_utils.h" | 20 #include "components/translate/content/renderer/renderer_cld_utils.h" |
19 #include "components/translate/core/common/translate_constants.h" | 21 #include "components/translate/core/common/translate_constants.h" |
20 #include "components/translate/core/common/translate_metrics.h" | 22 #include "components/translate/core/common/translate_metrics.h" |
21 #include "components/translate/core/common/translate_util.h" | 23 #include "components/translate/core/common/translate_util.h" |
22 #include "components/translate/core/language_detection/language_detection_util.h
" | 24 #include "components/translate/core/language_detection/language_detection_util.h
" |
23 #include "content/public/common/content_constants.h" | 25 #include "content/public/common/content_constants.h" |
24 #include "content/public/common/url_constants.h" | 26 #include "content/public/common/url_constants.h" |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 // Notify the browser we are done. | 503 // Notify the browser we are done. |
502 render_view()->Send( | 504 render_view()->Send( |
503 new ChromeViewHostMsg_PageTranslated(render_view()->GetRoutingID(), | 505 new ChromeViewHostMsg_PageTranslated(render_view()->GetRoutingID(), |
504 actual_source_lang, | 506 actual_source_lang, |
505 target_lang_, | 507 target_lang_, |
506 TranslateErrors::NONE)); | 508 TranslateErrors::NONE)); |
507 return; | 509 return; |
508 } | 510 } |
509 | 511 |
510 // The translation is still pending, check again later. | 512 // The translation is still pending, check again later. |
511 base::MessageLoop::current()->PostDelayedTask( | 513 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
512 FROM_HERE, | 514 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, |
513 base::Bind(&TranslateHelper::CheckTranslateStatus, | 515 weak_method_factory_.GetWeakPtr(), page_seq_no), |
514 weak_method_factory_.GetWeakPtr(), page_seq_no), | |
515 AdjustDelay(kTranslateStatusCheckDelayMs)); | 516 AdjustDelay(kTranslateStatusCheckDelayMs)); |
516 } | 517 } |
517 | 518 |
518 void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { | 519 void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { |
519 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); | 520 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); |
520 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) | 521 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) |
521 return; | 522 return; |
522 | 523 |
523 if (!IsTranslateLibReady()) { | 524 if (!IsTranslateLibReady()) { |
524 // The library is not ready, try again later, unless we have tried several | 525 // The library is not ready, try again later, unless we have tried several |
525 // times unsucessfully already. | 526 // times unsucessfully already. |
526 if (++count >= kMaxTranslateInitCheckAttempts) { | 527 if (++count >= kMaxTranslateInitCheckAttempts) { |
527 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); | 528 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); |
528 return; | 529 return; |
529 } | 530 } |
530 base::MessageLoop::current()->PostDelayedTask( | 531 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
531 FROM_HERE, | 532 FROM_HERE, |
532 base::Bind(&TranslateHelper::TranslatePageImpl, | 533 base::Bind(&TranslateHelper::TranslatePageImpl, |
533 weak_method_factory_.GetWeakPtr(), | 534 weak_method_factory_.GetWeakPtr(), page_seq_no, count), |
534 page_seq_no, count), | |
535 AdjustDelay(count * kTranslateInitCheckDelayMs)); | 535 AdjustDelay(count * kTranslateInitCheckDelayMs)); |
536 return; | 536 return; |
537 } | 537 } |
538 | 538 |
539 // The library is loaded, and ready for translation now. | 539 // The library is loaded, and ready for translation now. |
540 // Check JavaScript performance counters for UMA reports. | 540 // Check JavaScript performance counters for UMA reports. |
541 ReportTimeToBeReady( | 541 ReportTimeToBeReady( |
542 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); | 542 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); |
543 ReportTimeToLoad( | 543 ReportTimeToLoad( |
544 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); | 544 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); |
545 | 545 |
546 if (!StartTranslation()) { | 546 if (!StartTranslation()) { |
547 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); | 547 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); |
548 return; | 548 return; |
549 } | 549 } |
550 // Check the status of the translation. | 550 // Check the status of the translation. |
551 base::MessageLoop::current()->PostDelayedTask( | 551 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
552 FROM_HERE, | 552 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, |
553 base::Bind(&TranslateHelper::CheckTranslateStatus, | 553 weak_method_factory_.GetWeakPtr(), page_seq_no), |
554 weak_method_factory_.GetWeakPtr(), page_seq_no), | |
555 AdjustDelay(kTranslateStatusCheckDelayMs)); | 554 AdjustDelay(kTranslateStatusCheckDelayMs)); |
556 } | 555 } |
557 | 556 |
558 void TranslateHelper::NotifyBrowserTranslationFailed( | 557 void TranslateHelper::NotifyBrowserTranslationFailed( |
559 TranslateErrors::Type error) { | 558 TranslateErrors::Type error) { |
560 translation_pending_ = false; | 559 translation_pending_ = false; |
561 // Notify the browser there was an error. | 560 // Notify the browser there was an error. |
562 render_view()->Send(new ChromeViewHostMsg_PageTranslated( | 561 render_view()->Send(new ChromeViewHostMsg_PageTranslated( |
563 render_view()->GetRoutingID(), source_lang_, target_lang_, error)); | 562 render_view()->GetRoutingID(), source_lang_, target_lang_, error)); |
564 } | 563 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 cld_data_provider_->SendCldDataRequest(); | 612 cld_data_provider_->SendCldDataRequest(); |
614 | 613 |
615 // ... and enqueue another delayed task to call again. This will start a | 614 // ... and enqueue another delayed task to call again. This will start a |
616 // chain of polling that will last until the pointer stops being NULL, | 615 // chain of polling that will last until the pointer stops being NULL, |
617 // which is the right thing to do. | 616 // which is the right thing to do. |
618 // NB: In the great majority of cases, the data file will be available and | 617 // NB: In the great majority of cases, the data file will be available and |
619 // the very first delayed task will be a no-op that terminates the chain. | 618 // the very first delayed task will be a no-op that terminates the chain. |
620 // It's only while downloading the file that this will chain for a | 619 // It's only while downloading the file that this will chain for a |
621 // nontrivial amount of time. | 620 // nontrivial amount of time. |
622 // Use a weak pointer to avoid keeping this helper object around forever. | 621 // Use a weak pointer to avoid keeping this helper object around forever. |
623 base::MessageLoop::current()->PostDelayedTask( | 622 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
624 FROM_HERE, | 623 FROM_HERE, base::Bind(&TranslateHelper::SendCldDataRequest, |
625 base::Bind(&TranslateHelper::SendCldDataRequest, | 624 weak_method_factory_.GetWeakPtr(), |
626 weak_method_factory_.GetWeakPtr(), | 625 next_delay_millis, next_delay_millis * 2), |
627 next_delay_millis, | |
628 next_delay_millis * 2), | |
629 base::TimeDelta::FromMilliseconds(delay_millis)); | 626 base::TimeDelta::FromMilliseconds(delay_millis)); |
630 } | 627 } |
631 | 628 |
632 void TranslateHelper::OnCldDataAvailable() { | 629 void TranslateHelper::OnCldDataAvailable() { |
633 if (deferred_page_capture_) { | 630 if (deferred_page_capture_) { |
634 deferred_page_capture_ = false; // Don't do this a second time. | 631 deferred_page_capture_ = false; // Don't do this a second time. |
635 PageCapturedImpl(deferred_page_seq_no_, deferred_contents_); | 632 PageCapturedImpl(deferred_page_seq_no_, deferred_contents_); |
636 deferred_page_seq_no_ = -1; // Clean up for sanity | 633 deferred_page_seq_no_ = -1; // Clean up for sanity |
637 deferred_contents_.clear(); // Clean up for sanity | 634 deferred_contents_.clear(); // Clean up for sanity |
638 } | 635 } |
(...skipping 20 matching lines...) Expand all Loading... |
659 // this, everything should start being ON_TIME. This should never run more | 656 // this, everything should start being ON_TIME. This should never run more |
660 // than twice in a page load, under any conditions. | 657 // than twice in a page load, under any conditions. |
661 // Also note that language detection is triggered off of a delay AFTER the | 658 // Also note that language detection is triggered off of a delay AFTER the |
662 // page load completed event has fired, making this very much off the critical | 659 // page load completed event has fired, making this very much off the critical |
663 // path. | 660 // path. |
664 content::RenderThread::Get()->UpdateHistograms( | 661 content::RenderThread::Get()->UpdateHistograms( |
665 content::kHistogramSynchronizerReservedSequenceNumber); | 662 content::kHistogramSynchronizerReservedSequenceNumber); |
666 } | 663 } |
667 | 664 |
668 } // namespace translate | 665 } // namespace translate |
OLD | NEW |