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

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: Update comment in translate_errors.h 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 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 int64_t error_code = ExecuteScriptAndGetIntegerResult(
171 "cr.googleTranslate.errorCode",
172 static_cast<int>(TranslateErrors::TRANSLATION_ERROR));
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();
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>(GetErrorCode()));
330 return; // There was an error. 357 return; // There was an error.
331 } 358 }
332 359
333 if (HasTranslationFinished()) { 360 if (HasTranslationFinished()) {
334 std::string actual_source_lang; 361 std::string actual_source_lang;
335 // Translation was successfull, if it was auto, retrieve the source 362 // Translation was successfull, if it was auto, retrieve the source
336 // language the Translate Element detected. 363 // language the Translate Element detected.
337 if (source_lang_ == kAutoDetectionLanguage) { 364 if (source_lang_ == kAutoDetectionLanguage) {
338 actual_source_lang = GetOriginalPageLanguage(); 365 actual_source_lang = GetOriginalPageLanguage();
339 if (actual_source_lang.empty()) { 366 if (actual_source_lang.empty()) {
(...skipping 25 matching lines...) Expand all
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.
403 TranslateErrors::Type error =
404 static_cast<translate::TranslateErrors::Type>(GetErrorCode());
405 if (error != TranslateErrors::NONE) {
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);
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