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

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: Added test cases to check for translate error types and a minor refactoring. Created 3 years, 6 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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 } 159 }
160 160
161 bool TranslateHelper::HasTranslationFinished() { 161 bool TranslateHelper::HasTranslationFinished() {
162 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.finished", true); 162 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.finished", true);
163 } 163 }
164 164
165 bool TranslateHelper::HasTranslationFailed() { 165 bool TranslateHelper::HasTranslationFailed() {
166 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.error", true); 166 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.error", true);
167 } 167 }
168 168
169 int64_t TranslateHelper::GetErrorCode() {
170 return ExecuteScriptAndGetIntegerResult(
171 "cr.googleTranslate.errorCode",
172 static_cast<int>(TranslateErrors::TRANSLATION_ERROR));
173 }
174
169 bool TranslateHelper::StartTranslation() { 175 bool TranslateHelper::StartTranslation() {
170 std::string script = "cr.googleTranslate.translate('" + 176 std::string script = "cr.googleTranslate.translate('" +
171 source_lang_ + 177 source_lang_ +
172 "','" + 178 "','" +
173 target_lang_ + 179 target_lang_ +
174 "')"; 180 "')";
175 return ExecuteScriptAndGetBoolResult(script, false); 181 return ExecuteScriptAndGetBoolResult(script, false);
176 } 182 }
177 183
178 std::string TranslateHelper::GetOriginalPageLanguage() { 184 std::string TranslateHelper::GetOriginalPageLanguage() {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 WebScriptSource source = WebScriptSource(WebString::FromASCII(script)); 251 WebScriptSource source = WebScriptSource(WebString::FromASCII(script));
246 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results); 252 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results);
247 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { 253 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) {
248 NOTREACHED(); 254 NOTREACHED();
249 return 0.0; 255 return 0.0;
250 } 256 }
251 257
252 return results[0]->NumberValue(); 258 return results[0]->NumberValue();
253 } 259 }
254 260
261 int64_t TranslateHelper::ExecuteScriptAndGetIntegerResult(
262 const std::string& script,
263 int64_t fallback) {
264 WebLocalFrame* main_frame = render_frame()->GetWebFrame();
265 if (!main_frame)
266 return fallback;
267
268 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
269 WebVector<v8::Local<v8::Value>> results;
270 WebScriptSource source = WebScriptSource(WebString::FromASCII(script));
271 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results);
272 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) {
273 NOTREACHED();
274 return fallback;
275 }
276
277 return results[0]->IntegerValue();
278 }
279
255 // mojom::Page implementations. 280 // mojom::Page implementations.
256 void TranslateHelper::Translate(const std::string& translate_script, 281 void TranslateHelper::Translate(const std::string& translate_script,
257 const std::string& source_lang, 282 const std::string& source_lang,
258 const std::string& target_lang, 283 const std::string& target_lang,
259 TranslateCallback callback) { 284 TranslateCallback callback) {
260 WebLocalFrame* main_frame = render_frame()->GetWebFrame(); 285 WebLocalFrame* main_frame = render_frame()->GetWebFrame();
261 if (!main_frame) { 286 if (!main_frame) {
262 // Cancelled. 287 // Cancelled.
263 std::move(callback).Run(true, source_lang, target_lang, 288 std::move(callback).Run(true, source_lang, target_lang,
264 TranslateErrors::NONE); 289 TranslateErrors::NONE);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 CancelPendingTranslation(); 343 CancelPendingTranslation();
319 344
320 ExecuteScript("cr.googleTranslate.revert()"); 345 ExecuteScript("cr.googleTranslate.revert()");
321 } 346 }
322 347
323 //////////////////////////////////////////////////////////////////////////////// 348 ////////////////////////////////////////////////////////////////////////////////
324 // TranslateHelper, private: 349 // TranslateHelper, private:
325 void TranslateHelper::CheckTranslateStatus() { 350 void TranslateHelper::CheckTranslateStatus() {
326 // First check if there was an error. 351 // First check if there was an error.
327 if (HasTranslationFailed()) { 352 if (HasTranslationFailed()) {
328 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. 353 NotifyBrowserTranslationFailed(
329 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); 354 static_cast<translate::TranslateErrors::Type>(GetErrorCode()));
napper 2017/06/16 12:41:51 Consider checking that GetErrorCode() < TRANSLATE_
Takashi Toyoshima 2017/06/16 16:14:17 maybe DCHECK inside GetErrorCode impl?
Gaja 2017/06/17 06:41:46 Acknowledged.
Gaja 2017/06/17 13:25:48 Done.
330 return; // There was an error. 355 return; // There was an error.
331 } 356 }
332 357
333 if (HasTranslationFinished()) { 358 if (HasTranslationFinished()) {
334 std::string actual_source_lang; 359 std::string actual_source_lang;
335 // Translation was successfull, if it was auto, retrieve the source 360 // Translation was successfull, if it was auto, retrieve the source
336 // language the Translate Element detected. 361 // language the Translate Element detected.
337 if (source_lang_ == kAutoDetectionLanguage) { 362 if (source_lang_ == kAutoDetectionLanguage) {
338 actual_source_lang = GetOriginalPageLanguage(); 363 actual_source_lang = GetOriginalPageLanguage();
339 if (actual_source_lang.empty()) { 364 if (actual_source_lang.empty()) {
340 NotifyBrowserTranslationFailed(TranslateErrors::UNKNOWN_LANGUAGE); 365 NotifyBrowserTranslationFailed(TranslateErrors::UNKNOWN_LANGUAGE);
341 return; 366 return;
342 } else if (actual_source_lang == target_lang_) {
343 NotifyBrowserTranslationFailed(TranslateErrors::IDENTICAL_LANGUAGES);
344 return;
345 } 367 }
346 } else { 368 } else {
347 actual_source_lang = source_lang_; 369 actual_source_lang = source_lang_;
348 } 370 }
349 371
372 if (actual_source_lang == target_lang_) {
Takashi Toyoshima 2017/06/16 04:51:29 What is the motivation to move here? |actual_sourc
Gaja 2017/06/17 06:41:46 Please correct me if I am wrong. As per my analysi
Takashi Toyoshima 2017/06/20 11:49:54 Here, |source_lang| is the language Chrome's CLD d
Gaja 2017/06/22 05:22:23 Thanks for the detailed explanation. Now I unders
373 NotifyBrowserTranslationFailed(TranslateErrors::IDENTICAL_LANGUAGES);
374 return;
375 }
376
350 if (!translate_callback_pending_) { 377 if (!translate_callback_pending_) {
351 NOTREACHED(); 378 NOTREACHED();
352 return; 379 return;
353 } 380 }
354 381
355 // Check JavaScript performance counters for UMA reports. 382 // Check JavaScript performance counters for UMA reports.
356 ReportTimeToTranslate( 383 ReportTimeToTranslate(
357 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime")); 384 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime"));
358 385
359 // Notify the browser we are done. 386 // Notify the browser we are done.
360 std::move(translate_callback_pending_) 387 std::move(translate_callback_pending_)
361 .Run(false, actual_source_lang, target_lang_, TranslateErrors::NONE); 388 .Run(false, actual_source_lang, target_lang_, TranslateErrors::NONE);
362 return; 389 return;
363 } 390 }
364 391
365 // The translation is still pending, check again later. 392 // The translation is still pending, check again later.
366 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 393 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
367 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, 394 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus,
368 weak_method_factory_.GetWeakPtr()), 395 weak_method_factory_.GetWeakPtr()),
369 AdjustDelay(kTranslateStatusCheckDelayMs)); 396 AdjustDelay(kTranslateStatusCheckDelayMs));
370 } 397 }
371 398
372 void TranslateHelper::TranslatePageImpl(int count) { 399 void TranslateHelper::TranslatePageImpl(int count) {
373 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); 400 DCHECK_LT(count, kMaxTranslateInitCheckAttempts);
374 if (!IsTranslateLibReady()) { 401 if (!IsTranslateLibReady()) {
402 // There was an error during initialization of library.
Takashi Toyoshima 2017/06/16 04:51:28 I don't think errorCode is ready here, because IsT
Gaja 2017/06/17 06:41:46 I added this check considering the way the errorCo
Takashi Toyoshima 2017/06/20 11:49:54 I see, that makes sense. So, could you change the
Gaja 2017/06/22 05:22:23 I made the change suggested by you and all the tes
403 TranslateErrors::Type error =
404 static_cast<translate::TranslateErrors::Type>(GetErrorCode());
405 if (error == TranslateErrors::INITIALIZATION_ERROR) {
406 NotifyBrowserTranslationFailed(error);
407 return;
408 }
409
375 // The library is not ready, try again later, unless we have tried several 410 // The library is not ready, try again later, unless we have tried several
376 // times unsuccessfully already. 411 // times unsuccessfully already.
377 if (++count >= kMaxTranslateInitCheckAttempts) { 412 if (++count >= kMaxTranslateInitCheckAttempts) {
378 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); 413 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_TIMEOUT);
Takashi Toyoshima 2017/06/16 04:51:28 We use the timeout error only when actual translat
Gaja 2017/06/17 06:41:46 I added this check considering the way the errorCo
Takashi Toyoshima 2017/06/20 11:49:54 Oops, I was wrong. We already used it for library
Gaja 2017/06/22 05:22:23 Done.
379 return; 414 return;
380 } 415 }
381 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 416 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
382 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl, 417 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl,
383 weak_method_factory_.GetWeakPtr(), count), 418 weak_method_factory_.GetWeakPtr(), count),
384 AdjustDelay(count * kTranslateInitCheckDelayMs)); 419 AdjustDelay(count * kTranslateInitCheckDelayMs));
385 return; 420 return;
386 } 421 }
387 422
388 // The library is loaded, and ready for translation now. 423 // The library is loaded, and ready for translation now.
389 // Check JavaScript performance counters for UMA reports. 424 // Check JavaScript performance counters for UMA reports.
390 ReportTimeToBeReady( 425 ReportTimeToBeReady(
391 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); 426 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime"));
392 ReportTimeToLoad( 427 ReportTimeToLoad(
393 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); 428 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime"));
394 429
395 if (!StartTranslation()) { 430 if (!StartTranslation()) {
396 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); 431 CheckTranslateStatus();
397 return; 432 return;
398 } 433 }
399 // Check the status of the translation. 434 // Check the status of the translation.
400 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 435 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
401 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, 436 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus,
402 weak_method_factory_.GetWeakPtr()), 437 weak_method_factory_.GetWeakPtr()),
403 AdjustDelay(kTranslateStatusCheckDelayMs)); 438 AdjustDelay(kTranslateStatusCheckDelayMs));
404 } 439 }
405 440
406 void TranslateHelper::NotifyBrowserTranslationFailed( 441 void TranslateHelper::NotifyBrowserTranslationFailed(
(...skipping 17 matching lines...) Expand all
424 binding_.Close(); 459 binding_.Close();
425 translate_callback_pending_.Reset(); 460 translate_callback_pending_.Reset();
426 CancelPendingTranslation(); 461 CancelPendingTranslation();
427 } 462 }
428 463
429 void TranslateHelper::OnDestruct() { 464 void TranslateHelper::OnDestruct() {
430 delete this; 465 delete this;
431 } 466 }
432 467
433 } // namespace translate 468 } // namespace translate
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698