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::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 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(); |
| 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>(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 Loading... |
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 Loading... |
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 |
OLD | NEW |