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

Side by Side Diff: components/translate/content/renderer/translate_helper.cc

Issue 2919343007: Check |errorCode| of translate.js and notify to Browser (Closed)
Patch Set: Rebase Created 3 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) 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 <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 } 160 }
161 161
162 bool TranslateHelper::HasTranslationFinished() { 162 bool TranslateHelper::HasTranslationFinished() {
163 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.finished", true); 163 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.finished", true);
164 } 164 }
165 165
166 bool TranslateHelper::HasTranslationFailed() { 166 bool TranslateHelper::HasTranslationFailed() {
167 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.error", true); 167 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.error", true);
168 } 168 }
169 169
170 int64_t TranslateHelper::GetErrorCode() {
171 int64_t error_code =
172 ExecuteScriptAndGetIntegerResult("cr.googleTranslate.errorCode");
173 DCHECK_LT(error_code, static_cast<int>(TranslateErrors::TRANSLATE_ERROR_MAX));
174 return error_code;
175 }
176
170 bool TranslateHelper::StartTranslation() { 177 bool TranslateHelper::StartTranslation() {
171 return ExecuteScriptAndGetBoolResult( 178 return ExecuteScriptAndGetBoolResult(
172 BuildTranslationScript(source_lang_, target_lang_), false); 179 BuildTranslationScript(source_lang_, target_lang_), false);
173 } 180 }
174 181
175 std::string TranslateHelper::GetOriginalPageLanguage() { 182 std::string TranslateHelper::GetOriginalPageLanguage() {
176 return ExecuteScriptAndGetStringResult("cr.googleTranslate.sourceLang"); 183 return ExecuteScriptAndGetStringResult("cr.googleTranslate.sourceLang");
177 } 184 }
178 185
179 base::TimeDelta TranslateHelper::AdjustDelay(int delayInMs) { 186 base::TimeDelta TranslateHelper::AdjustDelay(int delayInMs) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 WebScriptSource source = WebScriptSource(WebString::FromASCII(script)); 249 WebScriptSource source = WebScriptSource(WebString::FromASCII(script));
243 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results); 250 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results);
244 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { 251 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) {
245 NOTREACHED(); 252 NOTREACHED();
246 return 0.0; 253 return 0.0;
247 } 254 }
248 255
249 return results[0]->NumberValue(); 256 return results[0]->NumberValue();
250 } 257 }
251 258
259 int64_t TranslateHelper::ExecuteScriptAndGetIntegerResult(
260 const std::string& script) {
261 WebLocalFrame* main_frame = render_frame()->GetWebFrame();
262 if (!main_frame)
263 return 0;
264
265 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
266 WebVector<v8::Local<v8::Value>> results;
267 WebScriptSource source = WebScriptSource(WebString::FromASCII(script));
268 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results);
269 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) {
270 NOTREACHED();
271 return 0;
272 }
273
274 return results[0]->IntegerValue();
275 }
276
252 // mojom::Page implementations. 277 // mojom::Page implementations.
253 void TranslateHelper::Translate(const std::string& translate_script, 278 void TranslateHelper::Translate(const std::string& translate_script,
254 const std::string& source_lang, 279 const std::string& source_lang,
255 const std::string& target_lang, 280 const std::string& target_lang,
256 TranslateCallback callback) { 281 TranslateCallback callback) {
257 WebLocalFrame* main_frame = render_frame()->GetWebFrame(); 282 WebLocalFrame* main_frame = render_frame()->GetWebFrame();
258 if (!main_frame) { 283 if (!main_frame) {
259 // Cancelled. 284 // Cancelled.
260 std::move(callback).Run(true, source_lang, target_lang, 285 std::move(callback).Run(true, source_lang, target_lang,
261 TranslateErrors::NONE); 286 TranslateErrors::NONE);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 CancelPendingTranslation(); 340 CancelPendingTranslation();
316 341
317 ExecuteScript("cr.googleTranslate.revert()"); 342 ExecuteScript("cr.googleTranslate.revert()");
318 } 343 }
319 344
320 //////////////////////////////////////////////////////////////////////////////// 345 ////////////////////////////////////////////////////////////////////////////////
321 // TranslateHelper, private: 346 // TranslateHelper, private:
322 void TranslateHelper::CheckTranslateStatus() { 347 void TranslateHelper::CheckTranslateStatus() {
323 // First check if there was an error. 348 // First check if there was an error.
324 if (HasTranslationFailed()) { 349 if (HasTranslationFailed()) {
325 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. 350 NotifyBrowserTranslationFailed(
326 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); 351 static_cast<translate::TranslateErrors::Type>(GetErrorCode()));
327 return; // There was an error. 352 return; // There was an error.
328 } 353 }
329 354
330 if (HasTranslationFinished()) { 355 if (HasTranslationFinished()) {
331 std::string actual_source_lang; 356 std::string actual_source_lang;
332 // Translation was successfull, if it was auto, retrieve the source 357 // Translation was successfull, if it was auto, retrieve the source
333 // language the Translate Element detected. 358 // language the Translate Element detected.
334 if (source_lang_ == kAutoDetectionLanguage) { 359 if (source_lang_ == kAutoDetectionLanguage) {
335 actual_source_lang = GetOriginalPageLanguage(); 360 actual_source_lang = GetOriginalPageLanguage();
336 if (actual_source_lang.empty()) { 361 if (actual_source_lang.empty()) {
(...skipping 25 matching lines...) Expand all
362 // The translation is still pending, check again later. 387 // The translation is still pending, check again later.
363 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 388 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
364 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, 389 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus,
365 weak_method_factory_.GetWeakPtr()), 390 weak_method_factory_.GetWeakPtr()),
366 AdjustDelay(kTranslateStatusCheckDelayMs)); 391 AdjustDelay(kTranslateStatusCheckDelayMs));
367 } 392 }
368 393
369 void TranslateHelper::TranslatePageImpl(int count) { 394 void TranslateHelper::TranslatePageImpl(int count) {
370 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); 395 DCHECK_LT(count, kMaxTranslateInitCheckAttempts);
371 if (!IsTranslateLibReady()) { 396 if (!IsTranslateLibReady()) {
397 // There was an error during initialization of library.
398 TranslateErrors::Type error =
399 static_cast<translate::TranslateErrors::Type>(GetErrorCode());
400 if (error != TranslateErrors::NONE) {
401 NotifyBrowserTranslationFailed(error);
402 return;
403 }
404
372 // The library is not ready, try again later, unless we have tried several 405 // The library is not ready, try again later, unless we have tried several
373 // times unsuccessfully already. 406 // times unsuccessfully already.
374 if (++count >= kMaxTranslateInitCheckAttempts) { 407 if (++count >= kMaxTranslateInitCheckAttempts) {
375 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); 408 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_TIMEOUT);
376 return; 409 return;
377 } 410 }
378 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 411 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
379 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl, 412 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl,
380 weak_method_factory_.GetWeakPtr(), count), 413 weak_method_factory_.GetWeakPtr(), count),
381 AdjustDelay(count * kTranslateInitCheckDelayMs)); 414 AdjustDelay(count * kTranslateInitCheckDelayMs));
382 return; 415 return;
383 } 416 }
384 417
385 // The library is loaded, and ready for translation now. 418 // The library is loaded, and ready for translation now.
386 // Check JavaScript performance counters for UMA reports. 419 // Check JavaScript performance counters for UMA reports.
387 ReportTimeToBeReady( 420 ReportTimeToBeReady(
388 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); 421 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime"));
389 ReportTimeToLoad( 422 ReportTimeToLoad(
390 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); 423 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime"));
391 424
392 if (!StartTranslation()) { 425 if (!StartTranslation()) {
393 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); 426 CheckTranslateStatus();
394 return; 427 return;
395 } 428 }
396 // Check the status of the translation. 429 // Check the status of the translation.
397 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 430 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
398 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, 431 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus,
399 weak_method_factory_.GetWeakPtr()), 432 weak_method_factory_.GetWeakPtr()),
400 AdjustDelay(kTranslateStatusCheckDelayMs)); 433 AdjustDelay(kTranslateStatusCheckDelayMs));
401 } 434 }
402 435
403 void TranslateHelper::NotifyBrowserTranslationFailed( 436 void TranslateHelper::NotifyBrowserTranslationFailed(
(...skipping 21 matching lines...) Expand all
425 458
426 void TranslateHelper::OnDestruct() { 459 void TranslateHelper::OnDestruct() {
427 delete this; 460 delete this;
428 } 461 }
429 462
430 /* static */ 463 /* static */
431 std::string TranslateHelper::BuildTranslationScript( 464 std::string TranslateHelper::BuildTranslationScript(
432 const std::string& source_lang, 465 const std::string& source_lang,
433 const std::string& target_lang) { 466 const std::string& target_lang) {
434 return "cr.googleTranslate.translate(" + 467 return "cr.googleTranslate.translate(" +
435 base::GetQuotedJSONString(source_lang) + "," + 468 base::GetQuotedJSONString(source_lang) + "," +
Takashi Toyoshima 2017/07/03 12:12:52 I feel we do not need to be careful about these la
Gaja 2017/07/03 12:58:50 I am little confused about your comment here. This
Takashi Toyoshima 2017/07/03 13:28:57 Oh, sorry, I added this comment when I'm reviewing
436 base::GetQuotedJSONString(target_lang) + ")"; 469 base::GetQuotedJSONString(target_lang) + ")";
437 } 470 }
438 471
439 } // namespace translate 472 } // namespace translate
OLDNEW
« no previous file with comments | « components/translate/content/renderer/translate_helper.h ('k') | components/translate/core/common/translate_errors.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698