Chromium Code Reviews| Index: components/translate/content/renderer/translate_helper.cc |
| diff --git a/components/translate/content/renderer/translate_helper.cc b/components/translate/content/renderer/translate_helper.cc |
| index 6eca21044c0ba04082e68533149c10b2187f3a3d..295256e01b351389dd3f8d91c09764c905f05290 100644 |
| --- a/components/translate/content/renderer/translate_helper.cc |
| +++ b/components/translate/content/renderer/translate_helper.cc |
| @@ -14,7 +14,6 @@ |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| -#include "components/translate/content/common/translate_messages.h" |
| #include "components/translate/core/common/translate_constants.h" |
| #include "components/translate/core/common/translate_metrics.h" |
| #include "components/translate/core/common/translate_util.h" |
| @@ -23,7 +22,7 @@ |
| #include "content/public/common/url_constants.h" |
| #include "content/public/renderer/render_frame.h" |
| #include "content/public/renderer/render_thread.h" |
| -#include "ipc/ipc_platform_file.h" |
| +#include "services/shell/public/cpp/interface_provider.h" |
| #include "third_party/WebKit/public/web/WebDocument.h" |
| #include "third_party/WebKit/public/web/WebElement.h" |
| #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| @@ -78,7 +77,7 @@ bool HasNoTranslateMeta(WebDocument* document) { |
| const WebString content(ASCIIToUTF16("content")); |
| for (WebNode child = head.firstChild(); !child.isNull(); |
| - child = child.nextSibling()) { |
| + child = child.nextSibling()) { |
| if (!child.isElementNode()) |
| continue; |
| WebElement element = child.to<WebElement>(); |
| @@ -114,28 +113,21 @@ TranslateHelper::TranslateHelper(content::RenderFrame* render_frame, |
| int extension_group, |
| const std::string& extension_scheme) |
| : content::RenderFrameObserver(render_frame), |
| - page_seq_no_(0), |
| - translation_pending_(false), |
| world_id_(world_id), |
| extension_group_(extension_group), |
| extension_scheme_(extension_scheme), |
| + binding_(this), |
| weak_method_factory_(this) {} |
| -TranslateHelper::~TranslateHelper() { |
| -} |
| +TranslateHelper::~TranslateHelper() {} |
| void TranslateHelper::PrepareForUrl(const GURL& url) { |
| - ++page_seq_no_; |
| - Send(new ChromeFrameHostMsg_TranslateAssignedSequenceNumber(routing_id(), |
| - page_seq_no_)); |
| + // Navigated to a new page, close the binding for previous page. |
| + binding_.Close(); |
| + translate_callback_pending_.Reset(); |
| } |
| void TranslateHelper::PageCaptured(const base::string16& contents) { |
| - PageCapturedImpl(page_seq_no_, contents); |
| -} |
| - |
| -void TranslateHelper::PageCapturedImpl(int page_seq_no, |
| - const base::string16& contents) { |
| // Get the document language as set by WebKit from the http-equiv |
| // meta tag for "content-language". This may or may not also |
| // have a value derived from the actual Content-Language HTTP |
| @@ -146,7 +138,7 @@ void TranslateHelper::PageCapturedImpl(int page_seq_no, |
| // relevant for things like langauge textbooks). This distinction |
| // shouldn't affect translation. |
| WebLocalFrame* main_frame = render_frame()->GetWebFrame(); |
| - if (!main_frame || page_seq_no_ != page_seq_no) |
| + if (!main_frame) |
| return; |
| WebDocument document = main_frame->document(); |
| @@ -182,13 +174,22 @@ void TranslateHelper::PageCapturedImpl(int page_seq_no, |
| // translate-internals tab exists. |
| details.contents = contents; |
| - Send(new ChromeFrameHostMsg_TranslateLanguageDetermined( |
| - routing_id(), details, !details.has_notranslate && !language.empty())); |
| + // For the same render frame with the same url, each time when its texts are |
| + // captured, it should be treated as a new page to do translation. |
| + binding_.Close(); |
| + GetTranslateDriver()->RegisterPage( |
| + binding_.CreateInterfacePtrAndBind(), details, |
| + !details.has_notranslate && !language.empty()); |
| } |
| void TranslateHelper::CancelPendingTranslation() { |
| weak_method_factory_.InvalidateWeakPtrs(); |
| - translation_pending_ = false; |
| + // Make sure to send the cancelled response back. |
| + if (translate_callback_pending_) { |
| + translate_callback_pending_.Run(true, source_lang_, target_lang_, |
| + TranslateErrors::NONE); |
| + translate_callback_pending_.Reset(); |
| + } |
| source_lang_.clear(); |
| target_lang_.clear(); |
| } |
| @@ -199,7 +200,8 @@ void TranslateHelper::CancelPendingTranslation() { |
| bool TranslateHelper::IsTranslateLibAvailable() { |
| return ExecuteScriptAndGetBoolResult( |
| "typeof cr != 'undefined' && typeof cr.googleTranslate != 'undefined' && " |
| - "typeof cr.googleTranslate.translate == 'function'", false); |
| + "typeof cr.googleTranslate.translate == 'function'", |
| + false); |
| } |
| bool TranslateHelper::IsTranslateLibReady() { |
| @@ -215,11 +217,8 @@ bool TranslateHelper::HasTranslationFailed() { |
| } |
| bool TranslateHelper::StartTranslation() { |
| - std::string script = "cr.googleTranslate.translate('" + |
| - source_lang_ + |
| - "','" + |
| - target_lang_ + |
| - "')"; |
| + std::string script = "cr.googleTranslate.translate('" + source_lang_ + "','" + |
|
Tom Sepez
2016/08/01 17:08:17
Note: pre-existing. Although this is invoked in r
leonhsl(Using Gerrit)
2016/08/02 02:52:23
Understood. I filed an issue crbug.com/633460 to d
|
| + target_lang_ + "')"; |
| return ExecuteScriptAndGetBoolResult(script, false); |
| } |
| @@ -239,8 +238,8 @@ void TranslateHelper::ExecuteScript(const std::string& script) { |
| return; |
| WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); |
| - main_frame->executeScriptInIsolatedWorld( |
| - world_id_, &source, 1, extension_group_); |
| + main_frame->executeScriptInIsolatedWorld(world_id_, &source, 1, |
| + extension_group_); |
| } |
| bool TranslateHelper::ExecuteScriptAndGetBoolResult(const std::string& script, |
| @@ -250,10 +249,10 @@ bool TranslateHelper::ExecuteScriptAndGetBoolResult(const std::string& script, |
| return fallback; |
| v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); |
| - WebVector<v8::Local<v8::Value> > results; |
| + WebVector<v8::Local<v8::Value>> results; |
| WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); |
| - main_frame->executeScriptInIsolatedWorld( |
| - world_id_, &source, 1, extension_group_, &results); |
| + main_frame->executeScriptInIsolatedWorld(world_id_, &source, 1, |
| + extension_group_, &results); |
| if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsBoolean()) { |
| NOTREACHED(); |
| return fallback; |
| @@ -269,10 +268,10 @@ std::string TranslateHelper::ExecuteScriptAndGetStringResult( |
| return std::string(); |
| v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); |
| - WebVector<v8::Local<v8::Value> > results; |
| + WebVector<v8::Local<v8::Value>> results; |
| WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); |
| - main_frame->executeScriptInIsolatedWorld( |
| - world_id_, &source, 1, extension_group_, &results); |
| + main_frame->executeScriptInIsolatedWorld(world_id_, &source, 1, |
| + extension_group_, &results); |
| if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsString()) { |
| NOTREACHED(); |
| return std::string(); |
| @@ -292,10 +291,10 @@ double TranslateHelper::ExecuteScriptAndGetDoubleResult( |
| return 0.0; |
| v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); |
| - WebVector<v8::Local<v8::Value> > results; |
| + WebVector<v8::Local<v8::Value>> results; |
| WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); |
| - main_frame->executeScriptInIsolatedWorld( |
| - world_id_, &source, 1, extension_group_, &results); |
| + main_frame->executeScriptInIsolatedWorld(world_id_, &source, 1, |
| + extension_group_, &results); |
| if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { |
| NOTREACHED(); |
| return 0.0; |
| @@ -304,36 +303,30 @@ double TranslateHelper::ExecuteScriptAndGetDoubleResult( |
| return results[0]->NumberValue(); |
| } |
| -//////////////////////////////////////////////////////////////////////////////// |
| -// TranslateHelper, private: |
| -// |
| -bool TranslateHelper::OnMessageReceived(const IPC::Message& message) { |
| - bool handled = true; |
| - IPC_BEGIN_MESSAGE_MAP(TranslateHelper, message) |
| - IPC_MESSAGE_HANDLER(ChromeFrameMsg_TranslatePage, OnTranslatePage) |
| - IPC_MESSAGE_HANDLER(ChromeFrameMsg_RevertTranslation, OnRevertTranslation) |
| - IPC_MESSAGE_UNHANDLED(handled = false) |
| - IPC_END_MESSAGE_MAP() |
| - return handled; |
| -} |
| - |
| -void TranslateHelper::OnTranslatePage(int page_seq_no, |
| - const std::string& translate_script, |
| - const std::string& source_lang, |
| - const std::string& target_lang) { |
| +// mojom::Page implementations. |
| +void TranslateHelper::Translate(const std::string& translate_script, |
| + const std::string& source_lang, |
| + const std::string& target_lang, |
| + const TranslateCallback& callback) { |
| WebLocalFrame* main_frame = render_frame()->GetWebFrame(); |
| - if (!main_frame || page_seq_no_ != page_seq_no) |
| + if (!main_frame) { |
| + // Cancelled. |
| + callback.Run(true, source_lang, target_lang, TranslateErrors::NONE); |
| return; // We navigated away, nothing to do. |
| + } |
| // A similar translation is already under way, nothing to do. |
| - if (translation_pending_ && target_lang_ == target_lang) |
| + if (translate_callback_pending_ && target_lang_ == target_lang) { |
| + // This request is ignored. |
| + callback.Run(true, source_lang, target_lang, TranslateErrors::NONE); |
| return; |
| + } |
| // Any pending translation is now irrelevant. |
| CancelPendingTranslation(); |
| // Set our states. |
| - translation_pending_ = true; |
| + translate_callback_pending_ = callback; |
| // If the source language is undetermined, we'll let the translate element |
| // detect it. |
| @@ -362,13 +355,10 @@ void TranslateHelper::OnTranslatePage(int page_seq_no, |
| DCHECK(IsTranslateLibAvailable()); |
| } |
| - TranslatePageImpl(page_seq_no, 0); |
| + TranslatePageImpl(0); |
| } |
| -void TranslateHelper::OnRevertTranslation(int page_seq_no) { |
| - if (page_seq_no_ != page_seq_no) |
| - return; // We navigated away, nothing to do. |
| - |
| +void TranslateHelper::RevertTranslation() { |
| if (!IsTranslateLibAvailable()) { |
| NOTREACHED(); |
| return; |
| @@ -379,11 +369,10 @@ void TranslateHelper::OnRevertTranslation(int page_seq_no) { |
| ExecuteScript("cr.googleTranslate.revert()"); |
| } |
| -void TranslateHelper::CheckTranslateStatus(int page_seq_no) { |
| - // If this is not the same page, the translation has been canceled. |
| - if (page_seq_no_ != page_seq_no) |
| - return; |
| - |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// TranslateHelper, private: |
| +// |
| +void TranslateHelper::CheckTranslateStatus() { |
| // First check if there was an error. |
| if (HasTranslationFailed()) { |
| // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. |
| @@ -408,36 +397,31 @@ void TranslateHelper::CheckTranslateStatus(int page_seq_no) { |
| actual_source_lang = source_lang_; |
| } |
| - if (!translation_pending_) { |
| + if (!translate_callback_pending_) { |
| NOTREACHED(); |
| return; |
| } |
| - translation_pending_ = false; |
| - |
| // Check JavaScript performance counters for UMA reports. |
| ReportTimeToTranslate( |
| ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime")); |
| // Notify the browser we are done. |
| - render_frame()->Send(new ChromeFrameHostMsg_PageTranslated( |
| - render_frame()->GetRoutingID(), actual_source_lang, target_lang_, |
| - TranslateErrors::NONE)); |
| + translate_callback_pending_.Run(false, actual_source_lang, target_lang_, |
| + TranslateErrors::NONE); |
| + translate_callback_pending_.Reset(); |
| return; |
| } |
| // The translation is still pending, check again later. |
| base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, |
| - weak_method_factory_.GetWeakPtr(), page_seq_no), |
| + weak_method_factory_.GetWeakPtr()), |
| AdjustDelay(kTranslateStatusCheckDelayMs)); |
| } |
| -void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { |
| +void TranslateHelper::TranslatePageImpl(int count) { |
| DCHECK_LT(count, kMaxTranslateInitCheckAttempts); |
| - if (page_seq_no_ != page_seq_no) |
| - return; |
| - |
| if (!IsTranslateLibReady()) { |
| // The library is not ready, try again later, unless we have tried several |
| // times unsuccessfully already. |
| @@ -446,9 +430,8 @@ void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { |
| return; |
| } |
| base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| - FROM_HERE, |
| - base::Bind(&TranslateHelper::TranslatePageImpl, |
| - weak_method_factory_.GetWeakPtr(), page_seq_no, count), |
| + FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl, |
| + weak_method_factory_.GetWeakPtr(), count), |
| AdjustDelay(count * kTranslateInitCheckDelayMs)); |
| return; |
| } |
| @@ -467,16 +450,25 @@ void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { |
| // Check the status of the translation. |
| base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, |
| - weak_method_factory_.GetWeakPtr(), page_seq_no), |
| + weak_method_factory_.GetWeakPtr()), |
| AdjustDelay(kTranslateStatusCheckDelayMs)); |
| } |
| void TranslateHelper::NotifyBrowserTranslationFailed( |
| TranslateErrors::Type error) { |
| - translation_pending_ = false; |
| + DCHECK(translate_callback_pending_); |
| // Notify the browser there was an error. |
| - render_frame()->Send(new ChromeFrameHostMsg_PageTranslated( |
| - render_frame()->GetRoutingID(), source_lang_, target_lang_, error)); |
| + translate_callback_pending_.Run(false, source_lang_, target_lang_, error); |
| + translate_callback_pending_.Reset(); |
| +} |
| + |
| +const mojom::ContentTranslateDriverPtr& TranslateHelper::GetTranslateDriver() { |
| + if (!translate_driver_) { |
| + render_frame()->GetRemoteInterfaces()->GetInterface( |
| + mojo::GetProxy(&translate_driver_)); |
| + } |
| + |
| + return translate_driver_; |
| } |
| void TranslateHelper::OnDestruct() { |