OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |