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

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: Addressed review comments. 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::GetErrorCodeWithFallback(
170 TranslateErrors::Type fallback) {
171 int64_t error_code = ExecuteScriptAndGetIntegerResult(
172 "cr.googleTranslate.errorCode", static_cast<int>(fallback));
173 DCHECK_LT(error_code, static_cast<int>(TranslateErrors::TRANSLATE_ERROR_MAX));
174 return error_code;
175 }
176
169 bool TranslateHelper::StartTranslation() { 177 bool TranslateHelper::StartTranslation() {
170 std::string script = "cr.googleTranslate.translate('" + 178 std::string script = "cr.googleTranslate.translate('" +
171 source_lang_ + 179 source_lang_ +
172 "','" + 180 "','" +
173 target_lang_ + 181 target_lang_ +
174 "')"; 182 "')";
175 return ExecuteScriptAndGetBoolResult(script, false); 183 return ExecuteScriptAndGetBoolResult(script, false);
176 } 184 }
177 185
178 std::string TranslateHelper::GetOriginalPageLanguage() { 186 std::string TranslateHelper::GetOriginalPageLanguage() {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 WebScriptSource source = WebScriptSource(WebString::FromASCII(script)); 253 WebScriptSource source = WebScriptSource(WebString::FromASCII(script));
246 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results); 254 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results);
247 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { 255 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) {
248 NOTREACHED(); 256 NOTREACHED();
249 return 0.0; 257 return 0.0;
250 } 258 }
251 259
252 return results[0]->NumberValue(); 260 return results[0]->NumberValue();
253 } 261 }
254 262
263 int64_t TranslateHelper::ExecuteScriptAndGetIntegerResult(
264 const std::string& script,
265 int64_t fallback) {
266 WebLocalFrame* main_frame = render_frame()->GetWebFrame();
267 if (!main_frame)
268 return fallback;
269
270 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
271 WebVector<v8::Local<v8::Value>> results;
272 WebScriptSource source = WebScriptSource(WebString::FromASCII(script));
273 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results);
274 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) {
275 NOTREACHED();
Takashi Toyoshima 2017/06/27 12:04:55 If this actually happens as you said, this NOTREAC
Gaja 2017/06/28 03:43:31 It reaches this point for test cases in TrnaslateH
Gaja 2017/06/28 04:16:00 Sorry, I made a mistake here.
Takashi Toyoshima 2017/06/28 07:25:32 So, we should still have this NOTREACHED() check a
Gaja 2017/06/28 11:34:45 Okay.
276 return fallback;
277 }
278
279 return results[0]->IntegerValue();
280 }
281
255 // mojom::Page implementations. 282 // mojom::Page implementations.
256 void TranslateHelper::Translate(const std::string& translate_script, 283 void TranslateHelper::Translate(const std::string& translate_script,
257 const std::string& source_lang, 284 const std::string& source_lang,
258 const std::string& target_lang, 285 const std::string& target_lang,
259 TranslateCallback callback) { 286 TranslateCallback callback) {
260 WebLocalFrame* main_frame = render_frame()->GetWebFrame(); 287 WebLocalFrame* main_frame = render_frame()->GetWebFrame();
261 if (!main_frame) { 288 if (!main_frame) {
262 // Cancelled. 289 // Cancelled.
263 std::move(callback).Run(true, source_lang, target_lang, 290 std::move(callback).Run(true, source_lang, target_lang,
264 TranslateErrors::NONE); 291 TranslateErrors::NONE);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 CancelPendingTranslation(); 345 CancelPendingTranslation();
319 346
320 ExecuteScript("cr.googleTranslate.revert()"); 347 ExecuteScript("cr.googleTranslate.revert()");
321 } 348 }
322 349
323 //////////////////////////////////////////////////////////////////////////////// 350 ////////////////////////////////////////////////////////////////////////////////
324 // TranslateHelper, private: 351 // TranslateHelper, private:
325 void TranslateHelper::CheckTranslateStatus() { 352 void TranslateHelper::CheckTranslateStatus() {
326 // First check if there was an error. 353 // First check if there was an error.
327 if (HasTranslationFailed()) { 354 if (HasTranslationFailed()) {
328 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. 355 NotifyBrowserTranslationFailed(
329 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); 356 static_cast<translate::TranslateErrors::Type>(
357 GetErrorCodeWithFallback(TranslateErrors::TRANSLATION_ERROR)));
330 return; // There was an error. 358 return; // There was an error.
331 } 359 }
332 360
333 if (HasTranslationFinished()) { 361 if (HasTranslationFinished()) {
334 std::string actual_source_lang; 362 std::string actual_source_lang;
335 // Translation was successfull, if it was auto, retrieve the source 363 // Translation was successfull, if it was auto, retrieve the source
336 // language the Translate Element detected. 364 // language the Translate Element detected.
337 if (source_lang_ == kAutoDetectionLanguage) { 365 if (source_lang_ == kAutoDetectionLanguage) {
338 actual_source_lang = GetOriginalPageLanguage(); 366 actual_source_lang = GetOriginalPageLanguage();
339 if (actual_source_lang.empty()) { 367 if (actual_source_lang.empty()) {
(...skipping 25 matching lines...) Expand all
365 // The translation is still pending, check again later. 393 // The translation is still pending, check again later.
366 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 394 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
367 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, 395 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus,
368 weak_method_factory_.GetWeakPtr()), 396 weak_method_factory_.GetWeakPtr()),
369 AdjustDelay(kTranslateStatusCheckDelayMs)); 397 AdjustDelay(kTranslateStatusCheckDelayMs));
370 } 398 }
371 399
372 void TranslateHelper::TranslatePageImpl(int count) { 400 void TranslateHelper::TranslatePageImpl(int count) {
373 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); 401 DCHECK_LT(count, kMaxTranslateInitCheckAttempts);
374 if (!IsTranslateLibReady()) { 402 if (!IsTranslateLibReady()) {
403 // There was an error during initialization of library.
404 TranslateErrors::Type error = static_cast<translate::TranslateErrors::Type>(
405 GetErrorCodeWithFallback(TranslateErrors::NONE));
406 if (error != TranslateErrors::NONE) {
407 NotifyBrowserTranslationFailed(error);
408 return;
409 }
410
375 // The library is not ready, try again later, unless we have tried several 411 // The library is not ready, try again later, unless we have tried several
376 // times unsuccessfully already. 412 // times unsuccessfully already.
377 if (++count >= kMaxTranslateInitCheckAttempts) { 413 if (++count >= kMaxTranslateInitCheckAttempts) {
378 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); 414 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_TIMEOUT);
379 return; 415 return;
380 } 416 }
381 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 417 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
382 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl, 418 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl,
383 weak_method_factory_.GetWeakPtr(), count), 419 weak_method_factory_.GetWeakPtr(), count),
384 AdjustDelay(count * kTranslateInitCheckDelayMs)); 420 AdjustDelay(count * kTranslateInitCheckDelayMs));
385 return; 421 return;
386 } 422 }
387 423
388 // The library is loaded, and ready for translation now. 424 // The library is loaded, and ready for translation now.
389 // Check JavaScript performance counters for UMA reports. 425 // Check JavaScript performance counters for UMA reports.
390 ReportTimeToBeReady( 426 ReportTimeToBeReady(
391 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); 427 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime"));
392 ReportTimeToLoad( 428 ReportTimeToLoad(
393 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); 429 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime"));
394 430
395 if (!StartTranslation()) { 431 if (!StartTranslation()) {
396 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); 432 CheckTranslateStatus();
397 return; 433 return;
398 } 434 }
399 // Check the status of the translation. 435 // Check the status of the translation.
400 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 436 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
401 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, 437 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus,
402 weak_method_factory_.GetWeakPtr()), 438 weak_method_factory_.GetWeakPtr()),
403 AdjustDelay(kTranslateStatusCheckDelayMs)); 439 AdjustDelay(kTranslateStatusCheckDelayMs));
404 } 440 }
405 441
406 void TranslateHelper::NotifyBrowserTranslationFailed( 442 void TranslateHelper::NotifyBrowserTranslationFailed(
(...skipping 17 matching lines...) Expand all
424 binding_.Close(); 460 binding_.Close();
425 translate_callback_pending_.Reset(); 461 translate_callback_pending_.Reset();
426 CancelPendingTranslation(); 462 CancelPendingTranslation();
427 } 463 }
428 464
429 void TranslateHelper::OnDestruct() { 465 void TranslateHelper::OnDestruct() {
430 delete this; 466 delete this;
431 } 467 }
432 468
433 } // namespace translate 469 } // namespace translate
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698