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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 } | 160 } |
161 | 161 |
162 bool TranslateHelper::HasTranslationFinished() { | 162 bool TranslateHelper::HasTranslationFinished() { |
163 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.finished", true); | 163 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.finished", true); |
164 } | 164 } |
165 | 165 |
166 bool TranslateHelper::HasTranslationFailed() { | 166 bool TranslateHelper::HasTranslationFailed() { |
167 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.error", true); | 167 return ExecuteScriptAndGetBoolResult("cr.googleTranslate.error", true); |
168 } | 168 } |
169 | 169 |
| 170 int64_t TranslateHelper::GetErrorCode() { |
| 171 int64_t error_code = |
| 172 ExecuteScriptAndGetIntegerResult("cr.googleTranslate.errorCode"); |
| 173 DCHECK_LT(error_code, static_cast<int>(TranslateErrors::TRANSLATE_ERROR_MAX)); |
| 174 return error_code; |
| 175 } |
| 176 |
170 bool TranslateHelper::StartTranslation() { | 177 bool TranslateHelper::StartTranslation() { |
171 return ExecuteScriptAndGetBoolResult( | 178 return ExecuteScriptAndGetBoolResult( |
172 BuildTranslationScript(source_lang_, target_lang_), false); | 179 BuildTranslationScript(source_lang_, target_lang_), false); |
173 } | 180 } |
174 | 181 |
175 std::string TranslateHelper::GetOriginalPageLanguage() { | 182 std::string TranslateHelper::GetOriginalPageLanguage() { |
176 return ExecuteScriptAndGetStringResult("cr.googleTranslate.sourceLang"); | 183 return ExecuteScriptAndGetStringResult("cr.googleTranslate.sourceLang"); |
177 } | 184 } |
178 | 185 |
179 base::TimeDelta TranslateHelper::AdjustDelay(int delayInMs) { | 186 base::TimeDelta TranslateHelper::AdjustDelay(int delayInMs) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 WebScriptSource source = WebScriptSource(WebString::FromASCII(script)); | 249 WebScriptSource source = WebScriptSource(WebString::FromASCII(script)); |
243 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results); | 250 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results); |
244 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { | 251 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { |
245 NOTREACHED(); | 252 NOTREACHED(); |
246 return 0.0; | 253 return 0.0; |
247 } | 254 } |
248 | 255 |
249 return results[0]->NumberValue(); | 256 return results[0]->NumberValue(); |
250 } | 257 } |
251 | 258 |
| 259 int64_t TranslateHelper::ExecuteScriptAndGetIntegerResult( |
| 260 const std::string& script) { |
| 261 WebLocalFrame* main_frame = render_frame()->GetWebFrame(); |
| 262 if (!main_frame) |
| 263 return 0; |
| 264 |
| 265 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); |
| 266 WebVector<v8::Local<v8::Value>> results; |
| 267 WebScriptSource source = WebScriptSource(WebString::FromASCII(script)); |
| 268 main_frame->ExecuteScriptInIsolatedWorld(world_id_, &source, 1, &results); |
| 269 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { |
| 270 NOTREACHED(); |
| 271 return 0; |
| 272 } |
| 273 |
| 274 return results[0]->IntegerValue(); |
| 275 } |
| 276 |
252 // mojom::Page implementations. | 277 // mojom::Page implementations. |
253 void TranslateHelper::Translate(const std::string& translate_script, | 278 void TranslateHelper::Translate(const std::string& translate_script, |
254 const std::string& source_lang, | 279 const std::string& source_lang, |
255 const std::string& target_lang, | 280 const std::string& target_lang, |
256 TranslateCallback callback) { | 281 TranslateCallback callback) { |
257 WebLocalFrame* main_frame = render_frame()->GetWebFrame(); | 282 WebLocalFrame* main_frame = render_frame()->GetWebFrame(); |
258 if (!main_frame) { | 283 if (!main_frame) { |
259 // Cancelled. | 284 // Cancelled. |
260 std::move(callback).Run(true, source_lang, target_lang, | 285 std::move(callback).Run(true, source_lang, target_lang, |
261 TranslateErrors::NONE); | 286 TranslateErrors::NONE); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 CancelPendingTranslation(); | 340 CancelPendingTranslation(); |
316 | 341 |
317 ExecuteScript("cr.googleTranslate.revert()"); | 342 ExecuteScript("cr.googleTranslate.revert()"); |
318 } | 343 } |
319 | 344 |
320 //////////////////////////////////////////////////////////////////////////////// | 345 //////////////////////////////////////////////////////////////////////////////// |
321 // TranslateHelper, private: | 346 // TranslateHelper, private: |
322 void TranslateHelper::CheckTranslateStatus() { | 347 void TranslateHelper::CheckTranslateStatus() { |
323 // First check if there was an error. | 348 // First check if there was an error. |
324 if (HasTranslationFailed()) { | 349 if (HasTranslationFailed()) { |
325 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. | 350 NotifyBrowserTranslationFailed( |
326 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); | 351 static_cast<translate::TranslateErrors::Type>(GetErrorCode())); |
327 return; // There was an error. | 352 return; // There was an error. |
328 } | 353 } |
329 | 354 |
330 if (HasTranslationFinished()) { | 355 if (HasTranslationFinished()) { |
331 std::string actual_source_lang; | 356 std::string actual_source_lang; |
332 // Translation was successfull, if it was auto, retrieve the source | 357 // Translation was successfull, if it was auto, retrieve the source |
333 // language the Translate Element detected. | 358 // language the Translate Element detected. |
334 if (source_lang_ == kAutoDetectionLanguage) { | 359 if (source_lang_ == kAutoDetectionLanguage) { |
335 actual_source_lang = GetOriginalPageLanguage(); | 360 actual_source_lang = GetOriginalPageLanguage(); |
336 if (actual_source_lang.empty()) { | 361 if (actual_source_lang.empty()) { |
(...skipping 25 matching lines...) Expand all Loading... |
362 // The translation is still pending, check again later. | 387 // The translation is still pending, check again later. |
363 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 388 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
364 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, | 389 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, |
365 weak_method_factory_.GetWeakPtr()), | 390 weak_method_factory_.GetWeakPtr()), |
366 AdjustDelay(kTranslateStatusCheckDelayMs)); | 391 AdjustDelay(kTranslateStatusCheckDelayMs)); |
367 } | 392 } |
368 | 393 |
369 void TranslateHelper::TranslatePageImpl(int count) { | 394 void TranslateHelper::TranslatePageImpl(int count) { |
370 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); | 395 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); |
371 if (!IsTranslateLibReady()) { | 396 if (!IsTranslateLibReady()) { |
| 397 // There was an error during initialization of library. |
| 398 TranslateErrors::Type error = |
| 399 static_cast<translate::TranslateErrors::Type>(GetErrorCode()); |
| 400 if (error != TranslateErrors::NONE) { |
| 401 NotifyBrowserTranslationFailed(error); |
| 402 return; |
| 403 } |
| 404 |
372 // The library is not ready, try again later, unless we have tried several | 405 // The library is not ready, try again later, unless we have tried several |
373 // times unsuccessfully already. | 406 // times unsuccessfully already. |
374 if (++count >= kMaxTranslateInitCheckAttempts) { | 407 if (++count >= kMaxTranslateInitCheckAttempts) { |
375 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); | 408 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_TIMEOUT); |
376 return; | 409 return; |
377 } | 410 } |
378 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 411 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
379 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl, | 412 FROM_HERE, base::Bind(&TranslateHelper::TranslatePageImpl, |
380 weak_method_factory_.GetWeakPtr(), count), | 413 weak_method_factory_.GetWeakPtr(), count), |
381 AdjustDelay(count * kTranslateInitCheckDelayMs)); | 414 AdjustDelay(count * kTranslateInitCheckDelayMs)); |
382 return; | 415 return; |
383 } | 416 } |
384 | 417 |
385 // The library is loaded, and ready for translation now. | 418 // The library is loaded, and ready for translation now. |
386 // Check JavaScript performance counters for UMA reports. | 419 // Check JavaScript performance counters for UMA reports. |
387 ReportTimeToBeReady( | 420 ReportTimeToBeReady( |
388 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); | 421 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); |
389 ReportTimeToLoad( | 422 ReportTimeToLoad( |
390 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); | 423 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); |
391 | 424 |
392 if (!StartTranslation()) { | 425 if (!StartTranslation()) { |
393 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); | 426 CheckTranslateStatus(); |
394 return; | 427 return; |
395 } | 428 } |
396 // Check the status of the translation. | 429 // Check the status of the translation. |
397 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 430 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
398 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, | 431 FROM_HERE, base::Bind(&TranslateHelper::CheckTranslateStatus, |
399 weak_method_factory_.GetWeakPtr()), | 432 weak_method_factory_.GetWeakPtr()), |
400 AdjustDelay(kTranslateStatusCheckDelayMs)); | 433 AdjustDelay(kTranslateStatusCheckDelayMs)); |
401 } | 434 } |
402 | 435 |
403 void TranslateHelper::NotifyBrowserTranslationFailed( | 436 void TranslateHelper::NotifyBrowserTranslationFailed( |
(...skipping 26 matching lines...) Expand all Loading... |
430 /* static */ | 463 /* static */ |
431 std::string TranslateHelper::BuildTranslationScript( | 464 std::string TranslateHelper::BuildTranslationScript( |
432 const std::string& source_lang, | 465 const std::string& source_lang, |
433 const std::string& target_lang) { | 466 const std::string& target_lang) { |
434 return "cr.googleTranslate.translate(" + | 467 return "cr.googleTranslate.translate(" + |
435 base::GetQuotedJSONString(source_lang) + "," + | 468 base::GetQuotedJSONString(source_lang) + "," + |
436 base::GetQuotedJSONString(target_lang) + ")"; | 469 base::GetQuotedJSONString(target_lang) + ")"; |
437 } | 470 } |
438 | 471 |
439 } // namespace translate | 472 } // namespace translate |
OLD | NEW |