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

Side by Side Diff: components/translate/content/renderer/translate_helper.cc

Issue 564793003: Move TranslateHelper to the translate component. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@translateBrowserIPC
Patch Set: rebase AGAIN Created 6 years, 3 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
« no previous file with comments | « components/translate/content/renderer/translate_helper.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "chrome/renderer/translate/translate_helper.h" 5 #include "components/translate/content/renderer/translate_helper.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
13 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "chrome/renderer/isolated_world_ids.h"
16 #include "components/translate/content/common/translate_messages.h" 15 #include "components/translate/content/common/translate_messages.h"
17 #include "components/translate/core/common/translate_constants.h" 16 #include "components/translate/core/common/translate_constants.h"
18 #include "components/translate/core/common/translate_metrics.h" 17 #include "components/translate/core/common/translate_metrics.h"
19 #include "components/translate/core/common/translate_util.h" 18 #include "components/translate/core/common/translate_util.h"
20 #include "components/translate/core/language_detection/language_detection_util.h " 19 #include "components/translate/core/language_detection/language_detection_util.h "
21 #include "content/public/common/content_constants.h" 20 #include "content/public/common/content_constants.h"
21 #include "content/public/common/url_constants.h"
22 #include "content/public/renderer/render_thread.h" 22 #include "content/public/renderer/render_thread.h"
23 #include "content/public/renderer/render_view.h" 23 #include "content/public/renderer/render_view.h"
24 #include "extensions/common/constants.h"
25 #include "extensions/renderer/extension_groups.h"
26 #include "ipc/ipc_platform_file.h" 24 #include "ipc/ipc_platform_file.h"
27 #include "content/public/common/url_constants.h"
28 #include "third_party/WebKit/public/web/WebDocument.h" 25 #include "third_party/WebKit/public/web/WebDocument.h"
29 #include "third_party/WebKit/public/web/WebElement.h" 26 #include "third_party/WebKit/public/web/WebElement.h"
30 #include "third_party/WebKit/public/web/WebFrame.h" 27 #include "third_party/WebKit/public/web/WebFrame.h"
31 #include "third_party/WebKit/public/web/WebNode.h" 28 #include "third_party/WebKit/public/web/WebNode.h"
32 #include "third_party/WebKit/public/web/WebNodeList.h" 29 #include "third_party/WebKit/public/web/WebNodeList.h"
33 #include "third_party/WebKit/public/web/WebScriptSource.h" 30 #include "third_party/WebKit/public/web/WebScriptSource.h"
34 #include "third_party/WebKit/public/web/WebView.h" 31 #include "third_party/WebKit/public/web/WebView.h"
35 #include "third_party/WebKit/public/web/WebWidget.h" 32 #include "third_party/WebKit/public/web/WebWidget.h"
36 #include "url/gurl.h" 33 #include "url/gurl.h"
37 #include "v8/include/v8.h" 34 #include "v8/include/v8.h"
(...skipping 28 matching lines...) Expand all
66 const char kAutoDetectionLanguage[] = "auto"; 63 const char kAutoDetectionLanguage[] = "auto";
67 64
68 // Isolated world sets following content-security-policy. 65 // Isolated world sets following content-security-policy.
69 const char kContentSecurityPolicy[] = "script-src 'self' 'unsafe-eval'"; 66 const char kContentSecurityPolicy[] = "script-src 'self' 'unsafe-eval'";
70 67
71 // Whether or not we have set the CLD callback yet. 68 // Whether or not we have set the CLD callback yet.
72 bool g_cld_callback_set = false; 69 bool g_cld_callback_set = false;
73 70
74 } // namespace 71 } // namespace
75 72
73 namespace translate {
76 74
77 //////////////////////////////////////////////////////////////////////////////// 75 ////////////////////////////////////////////////////////////////////////////////
78 // TranslateHelper, public: 76 // TranslateHelper, public:
79 // 77 //
80 TranslateHelper::TranslateHelper(content::RenderView* render_view) 78 TranslateHelper::TranslateHelper(content::RenderView* render_view,
79 int world_id,
80 int extension_group,
81 const std::string& extension_scheme)
81 : content::RenderViewObserver(render_view), 82 : content::RenderViewObserver(render_view),
82 page_seq_no_(0), 83 page_seq_no_(0),
83 translation_pending_(false), 84 translation_pending_(false),
84 cld_data_provider_(translate::CreateRendererCldDataProviderFor(this)), 85 cld_data_provider_(translate::CreateRendererCldDataProviderFor(this)),
85 cld_data_polling_started_(false), 86 cld_data_polling_started_(false),
86 cld_data_polling_canceled_(false), 87 cld_data_polling_canceled_(false),
87 deferred_page_capture_(false), 88 deferred_page_capture_(false),
88 deferred_page_seq_no_(-1), 89 deferred_page_seq_no_(-1),
90 world_id_(world_id),
91 extension_group_(extension_group),
92 extension_scheme_(extension_scheme),
89 weak_method_factory_(this) { 93 weak_method_factory_(this) {
90 } 94 }
91 95
92 TranslateHelper::~TranslateHelper() { 96 TranslateHelper::~TranslateHelper() {
93 CancelPendingTranslation(); 97 CancelPendingTranslation();
94 CancelCldDataPolling(); 98 CancelCldDataPolling();
95 } 99 }
96 100
97 void TranslateHelper::PrepareForUrl(const GURL& url) { 101 void TranslateHelper::PrepareForUrl(const GURL& url) {
98 ++page_seq_no_; 102 ++page_seq_no_;
(...skipping 10 matching lines...) Expand all
109 // that fails that check. This will require moving unit tests and rewiring 113 // that fails that check. This will require moving unit tests and rewiring
110 // other function calls as well, so for now replicate the logic here. 114 // other function calls as well, so for now replicate the logic here.
111 if (url.is_empty()) 115 if (url.is_empty())
112 return; 116 return;
113 if (url.SchemeIs(content::kChromeUIScheme)) 117 if (url.SchemeIs(content::kChromeUIScheme))
114 return; 118 return;
115 if (url.SchemeIs(content::kChromeDevToolsScheme)) 119 if (url.SchemeIs(content::kChromeDevToolsScheme))
116 return; 120 return;
117 if (url.SchemeIs(url::kFtpScheme)) 121 if (url.SchemeIs(url::kFtpScheme))
118 return; 122 return;
119 if (url.SchemeIs(extensions::kExtensionScheme)) 123 if (url.SchemeIs(extension_scheme_.c_str()))
120 return; 124 return;
121 125
122 // Start polling for CLD data. 126 // Start polling for CLD data.
123 cld_data_polling_started_ = true; 127 cld_data_polling_started_ = true;
124 TranslateHelper::SendCldDataRequest(0, 1000); 128 TranslateHelper::SendCldDataRequest(0, 1000);
125 } 129 }
126 130
127 void TranslateHelper::PageCaptured(const base::string16& contents) { 131 void TranslateHelper::PageCaptured(const base::string16& contents) {
128 PageCapturedImpl(page_seq_no_, contents); 132 PageCapturedImpl(page_seq_no_, contents);
129 } 133 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 WebDocument document = main_frame->document(); 169 WebDocument document = main_frame->document();
166 std::string content_language = document.contentLanguage().utf8(); 170 std::string content_language = document.contentLanguage().utf8();
167 WebElement html_element = document.documentElement(); 171 WebElement html_element = document.documentElement();
168 std::string html_lang; 172 std::string html_lang;
169 // |html_element| can be null element, e.g. in 173 // |html_element| can be null element, e.g. in
170 // BrowserTest.WindowOpenClose. 174 // BrowserTest.WindowOpenClose.
171 if (!html_element.isNull()) 175 if (!html_element.isNull())
172 html_lang = html_element.getAttribute("lang").utf8(); 176 html_lang = html_element.getAttribute("lang").utf8();
173 std::string cld_language; 177 std::string cld_language;
174 bool is_cld_reliable; 178 bool is_cld_reliable;
175 std::string language = translate::DeterminePageLanguage( 179 std::string language = DeterminePageLanguage(
176 content_language, html_lang, contents, &cld_language, &is_cld_reliable); 180 content_language, html_lang, contents, &cld_language, &is_cld_reliable);
177 181
178 if (language.empty()) 182 if (language.empty())
179 return; 183 return;
180 184
181 language_determined_time_ = base::TimeTicks::Now(); 185 language_determined_time_ = base::TimeTicks::Now();
182 186
183 GURL url(document.url()); 187 GURL url(document.url());
184 translate::LanguageDetectionDetails details; 188 LanguageDetectionDetails details;
185 details.time = base::Time::Now(); 189 details.time = base::Time::Now();
186 details.url = url; 190 details.url = url;
187 details.content_language = content_language; 191 details.content_language = content_language;
188 details.cld_language = cld_language; 192 details.cld_language = cld_language;
189 details.is_cld_reliable = is_cld_reliable; 193 details.is_cld_reliable = is_cld_reliable;
190 details.html_root_language = html_lang; 194 details.html_root_language = html_lang;
191 details.adopted_language = language; 195 details.adopted_language = language;
192 196
193 // TODO(hajimehoshi): If this affects performance, it should be set only if 197 // TODO(hajimehoshi): If this affects performance, it should be set only if
194 // translate-internals tab exists. 198 // translate-internals tab exists.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 return base::TimeDelta::FromMilliseconds(delayInMs); 252 return base::TimeDelta::FromMilliseconds(delayInMs);
249 } 253 }
250 254
251 void TranslateHelper::ExecuteScript(const std::string& script) { 255 void TranslateHelper::ExecuteScript(const std::string& script) {
252 WebFrame* main_frame = GetMainFrame(); 256 WebFrame* main_frame = GetMainFrame();
253 if (!main_frame) 257 if (!main_frame)
254 return; 258 return;
255 259
256 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); 260 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script));
257 main_frame->executeScriptInIsolatedWorld( 261 main_frame->executeScriptInIsolatedWorld(
258 chrome::ISOLATED_WORLD_ID_TRANSLATE, 262 world_id_, &source, 1, extension_group_);
259 &source,
260 1,
261 extensions::EXTENSION_GROUP_INTERNAL_TRANSLATE_SCRIPTS);
262 } 263 }
263 264
264 bool TranslateHelper::ExecuteScriptAndGetBoolResult(const std::string& script, 265 bool TranslateHelper::ExecuteScriptAndGetBoolResult(const std::string& script,
265 bool fallback) { 266 bool fallback) {
266 WebFrame* main_frame = GetMainFrame(); 267 WebFrame* main_frame = GetMainFrame();
267 if (!main_frame) 268 if (!main_frame)
268 return fallback; 269 return fallback;
269 270
270 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 271 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
271 WebVector<v8::Local<v8::Value> > results; 272 WebVector<v8::Local<v8::Value> > results;
272 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); 273 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script));
273 main_frame->executeScriptInIsolatedWorld( 274 main_frame->executeScriptInIsolatedWorld(
274 chrome::ISOLATED_WORLD_ID_TRANSLATE, 275 world_id_, &source, 1, extension_group_, &results);
275 &source,
276 1,
277 extensions::EXTENSION_GROUP_INTERNAL_TRANSLATE_SCRIPTS,
278 &results);
279 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsBoolean()) { 276 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsBoolean()) {
280 NOTREACHED(); 277 NOTREACHED();
281 return fallback; 278 return fallback;
282 } 279 }
283 280
284 return results[0]->BooleanValue(); 281 return results[0]->BooleanValue();
285 } 282 }
286 283
287 std::string TranslateHelper::ExecuteScriptAndGetStringResult( 284 std::string TranslateHelper::ExecuteScriptAndGetStringResult(
288 const std::string& script) { 285 const std::string& script) {
289 WebFrame* main_frame = GetMainFrame(); 286 WebFrame* main_frame = GetMainFrame();
290 if (!main_frame) 287 if (!main_frame)
291 return std::string(); 288 return std::string();
292 289
293 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 290 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
294 WebVector<v8::Local<v8::Value> > results; 291 WebVector<v8::Local<v8::Value> > results;
295 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); 292 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script));
296 main_frame->executeScriptInIsolatedWorld( 293 main_frame->executeScriptInIsolatedWorld(
297 chrome::ISOLATED_WORLD_ID_TRANSLATE, 294 world_id_, &source, 1, extension_group_, &results);
298 &source,
299 1,
300 extensions::EXTENSION_GROUP_INTERNAL_TRANSLATE_SCRIPTS,
301 &results);
302 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsString()) { 295 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsString()) {
303 NOTREACHED(); 296 NOTREACHED();
304 return std::string(); 297 return std::string();
305 } 298 }
306 299
307 v8::Local<v8::String> v8_str = results[0]->ToString(); 300 v8::Local<v8::String> v8_str = results[0]->ToString();
308 int length = v8_str->Utf8Length() + 1; 301 int length = v8_str->Utf8Length() + 1;
309 scoped_ptr<char[]> str(new char[length]); 302 scoped_ptr<char[]> str(new char[length]);
310 v8_str->WriteUtf8(str.get(), length); 303 v8_str->WriteUtf8(str.get(), length);
311 return std::string(str.get()); 304 return std::string(str.get());
312 } 305 }
313 306
314 double TranslateHelper::ExecuteScriptAndGetDoubleResult( 307 double TranslateHelper::ExecuteScriptAndGetDoubleResult(
315 const std::string& script) { 308 const std::string& script) {
316 WebFrame* main_frame = GetMainFrame(); 309 WebFrame* main_frame = GetMainFrame();
317 if (!main_frame) 310 if (!main_frame)
318 return 0.0; 311 return 0.0;
319 312
320 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 313 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
321 WebVector<v8::Local<v8::Value> > results; 314 WebVector<v8::Local<v8::Value> > results;
322 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); 315 WebScriptSource source = WebScriptSource(ASCIIToUTF16(script));
323 main_frame->executeScriptInIsolatedWorld( 316 main_frame->executeScriptInIsolatedWorld(
324 chrome::ISOLATED_WORLD_ID_TRANSLATE, 317 world_id_, &source, 1, extension_group_, &results);
325 &source,
326 1,
327 extensions::EXTENSION_GROUP_INTERNAL_TRANSLATE_SCRIPTS,
328 &results);
329 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) { 318 if (results.size() != 1 || results[0].IsEmpty() || !results[0]->IsNumber()) {
330 NOTREACHED(); 319 NOTREACHED();
331 return 0.0; 320 return 0.0;
332 } 321 }
333 322
334 return results[0]->NumberValue(); 323 return results[0]->NumberValue();
335 } 324 }
336 325
337 //////////////////////////////////////////////////////////////////////////////// 326 ////////////////////////////////////////////////////////////////////////////////
338 // TranslateHelper, private: 327 // TranslateHelper, private:
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 return; 390 return;
402 391
403 // Any pending translation is now irrelevant. 392 // Any pending translation is now irrelevant.
404 CancelPendingTranslation(); 393 CancelPendingTranslation();
405 394
406 // Set our states. 395 // Set our states.
407 translation_pending_ = true; 396 translation_pending_ = true;
408 397
409 // If the source language is undetermined, we'll let the translate element 398 // If the source language is undetermined, we'll let the translate element
410 // detect it. 399 // detect it.
411 source_lang_ = (source_lang != translate::kUnknownLanguageCode) ? 400 source_lang_ = (source_lang != kUnknownLanguageCode) ? source_lang
412 source_lang : kAutoDetectionLanguage; 401 : kAutoDetectionLanguage;
413 target_lang_ = target_lang; 402 target_lang_ = target_lang;
414 403
415 translate::ReportUserActionDuration(language_determined_time_, 404 ReportUserActionDuration(language_determined_time_, base::TimeTicks::Now());
416 base::TimeTicks::Now());
417 405
418 GURL url(main_frame->document().url()); 406 GURL url(main_frame->document().url());
419 translate::ReportPageScheme(url.scheme()); 407 ReportPageScheme(url.scheme());
420 408
421 // Set up v8 isolated world with proper content-security-policy and 409 // Set up v8 isolated world with proper content-security-policy and
422 // security-origin. 410 // security-origin.
423 WebFrame* frame = GetMainFrame(); 411 WebFrame* frame = GetMainFrame();
424 if (frame) { 412 if (frame) {
425 frame->setIsolatedWorldContentSecurityPolicy( 413 frame->setIsolatedWorldContentSecurityPolicy(
426 chrome::ISOLATED_WORLD_ID_TRANSLATE, 414 world_id_, WebString::fromUTF8(kContentSecurityPolicy));
427 WebString::fromUTF8(kContentSecurityPolicy));
428 415
429 GURL security_origin = translate::GetTranslateSecurityOrigin(); 416 GURL security_origin = GetTranslateSecurityOrigin();
430 frame->setIsolatedWorldSecurityOrigin( 417 frame->setIsolatedWorldSecurityOrigin(
431 chrome::ISOLATED_WORLD_ID_TRANSLATE, 418 world_id_, WebSecurityOrigin::create(security_origin));
432 WebSecurityOrigin::create(security_origin));
433 } 419 }
434 420
435 if (!IsTranslateLibAvailable()) { 421 if (!IsTranslateLibAvailable()) {
436 // Evaluate the script to add the translation related method to the global 422 // Evaluate the script to add the translation related method to the global
437 // context of the page. 423 // context of the page.
438 ExecuteScript(translate_script); 424 ExecuteScript(translate_script);
439 DCHECK(IsTranslateLibAvailable()); 425 DCHECK(IsTranslateLibAvailable());
440 } 426 }
441 427
442 TranslatePageImpl(page_seq_no, 0); 428 TranslatePageImpl(page_seq_no, 0);
(...skipping 15 matching lines...) Expand all
458 444
459 void TranslateHelper::CheckTranslateStatus(int page_seq_no) { 445 void TranslateHelper::CheckTranslateStatus(int page_seq_no) {
460 // If this is not the same page, the translation has been canceled. If the 446 // If this is not the same page, the translation has been canceled. If the
461 // view is gone, the page is closing. 447 // view is gone, the page is closing.
462 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) 448 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView())
463 return; 449 return;
464 450
465 // First check if there was an error. 451 // First check if there was an error.
466 if (HasTranslationFailed()) { 452 if (HasTranslationFailed()) {
467 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here. 453 // TODO(toyoshim): Check |errorCode| of translate.js and notify it here.
468 NotifyBrowserTranslationFailed( 454 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR);
469 translate::TranslateErrors::TRANSLATION_ERROR);
470 return; // There was an error. 455 return; // There was an error.
471 } 456 }
472 457
473 if (HasTranslationFinished()) { 458 if (HasTranslationFinished()) {
474 std::string actual_source_lang; 459 std::string actual_source_lang;
475 // Translation was successfull, if it was auto, retrieve the source 460 // Translation was successfull, if it was auto, retrieve the source
476 // language the Translate Element detected. 461 // language the Translate Element detected.
477 if (source_lang_ == kAutoDetectionLanguage) { 462 if (source_lang_ == kAutoDetectionLanguage) {
478 actual_source_lang = GetOriginalPageLanguage(); 463 actual_source_lang = GetOriginalPageLanguage();
479 if (actual_source_lang.empty()) { 464 if (actual_source_lang.empty()) {
480 NotifyBrowserTranslationFailed( 465 NotifyBrowserTranslationFailed(TranslateErrors::UNKNOWN_LANGUAGE);
481 translate::TranslateErrors::UNKNOWN_LANGUAGE);
482 return; 466 return;
483 } else if (actual_source_lang == target_lang_) { 467 } else if (actual_source_lang == target_lang_) {
484 NotifyBrowserTranslationFailed( 468 NotifyBrowserTranslationFailed(TranslateErrors::IDENTICAL_LANGUAGES);
485 translate::TranslateErrors::IDENTICAL_LANGUAGES);
486 return; 469 return;
487 } 470 }
488 } else { 471 } else {
489 actual_source_lang = source_lang_; 472 actual_source_lang = source_lang_;
490 } 473 }
491 474
492 if (!translation_pending_) { 475 if (!translation_pending_) {
493 NOTREACHED(); 476 NOTREACHED();
494 return; 477 return;
495 } 478 }
496 479
497 translation_pending_ = false; 480 translation_pending_ = false;
498 481
499 // Check JavaScript performance counters for UMA reports. 482 // Check JavaScript performance counters for UMA reports.
500 translate::ReportTimeToTranslate( 483 ReportTimeToTranslate(
501 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime")); 484 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime"));
502 485
503 // Notify the browser we are done. 486 // Notify the browser we are done.
504 render_view()->Send( 487 render_view()->Send(
505 new ChromeViewHostMsg_PageTranslated(render_view()->GetRoutingID(), 488 new ChromeViewHostMsg_PageTranslated(render_view()->GetRoutingID(),
506 actual_source_lang, 489 actual_source_lang,
507 target_lang_, 490 target_lang_,
508 translate::TranslateErrors::NONE)); 491 TranslateErrors::NONE));
509 return; 492 return;
510 } 493 }
511 494
512 // The translation is still pending, check again later. 495 // The translation is still pending, check again later.
513 base::MessageLoop::current()->PostDelayedTask( 496 base::MessageLoop::current()->PostDelayedTask(
514 FROM_HERE, 497 FROM_HERE,
515 base::Bind(&TranslateHelper::CheckTranslateStatus, 498 base::Bind(&TranslateHelper::CheckTranslateStatus,
516 weak_method_factory_.GetWeakPtr(), page_seq_no), 499 weak_method_factory_.GetWeakPtr(), page_seq_no),
517 AdjustDelay(kTranslateStatusCheckDelayMs)); 500 AdjustDelay(kTranslateStatusCheckDelayMs));
518 } 501 }
519 502
520 void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) { 503 void TranslateHelper::TranslatePageImpl(int page_seq_no, int count) {
521 DCHECK_LT(count, kMaxTranslateInitCheckAttempts); 504 DCHECK_LT(count, kMaxTranslateInitCheckAttempts);
522 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView()) 505 if (page_seq_no_ != page_seq_no || !render_view()->GetWebView())
523 return; 506 return;
524 507
525 if (!IsTranslateLibReady()) { 508 if (!IsTranslateLibReady()) {
526 // The library is not ready, try again later, unless we have tried several 509 // The library is not ready, try again later, unless we have tried several
527 // times unsucessfully already. 510 // times unsucessfully already.
528 if (++count >= kMaxTranslateInitCheckAttempts) { 511 if (++count >= kMaxTranslateInitCheckAttempts) {
529 NotifyBrowserTranslationFailed( 512 NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR);
530 translate::TranslateErrors::INITIALIZATION_ERROR);
531 return; 513 return;
532 } 514 }
533 base::MessageLoop::current()->PostDelayedTask( 515 base::MessageLoop::current()->PostDelayedTask(
534 FROM_HERE, 516 FROM_HERE,
535 base::Bind(&TranslateHelper::TranslatePageImpl, 517 base::Bind(&TranslateHelper::TranslatePageImpl,
536 weak_method_factory_.GetWeakPtr(), 518 weak_method_factory_.GetWeakPtr(),
537 page_seq_no, count), 519 page_seq_no, count),
538 AdjustDelay(count * kTranslateInitCheckDelayMs)); 520 AdjustDelay(count * kTranslateInitCheckDelayMs));
539 return; 521 return;
540 } 522 }
541 523
542 // The library is loaded, and ready for translation now. 524 // The library is loaded, and ready for translation now.
543 // Check JavaScript performance counters for UMA reports. 525 // Check JavaScript performance counters for UMA reports.
544 translate::ReportTimeToBeReady( 526 ReportTimeToBeReady(
545 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); 527 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime"));
546 translate::ReportTimeToLoad( 528 ReportTimeToLoad(
547 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); 529 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime"));
548 530
549 if (!StartTranslation()) { 531 if (!StartTranslation()) {
550 NotifyBrowserTranslationFailed( 532 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR);
551 translate::TranslateErrors::TRANSLATION_ERROR);
552 return; 533 return;
553 } 534 }
554 // Check the status of the translation. 535 // Check the status of the translation.
555 base::MessageLoop::current()->PostDelayedTask( 536 base::MessageLoop::current()->PostDelayedTask(
556 FROM_HERE, 537 FROM_HERE,
557 base::Bind(&TranslateHelper::CheckTranslateStatus, 538 base::Bind(&TranslateHelper::CheckTranslateStatus,
558 weak_method_factory_.GetWeakPtr(), page_seq_no), 539 weak_method_factory_.GetWeakPtr(), page_seq_no),
559 AdjustDelay(kTranslateStatusCheckDelayMs)); 540 AdjustDelay(kTranslateStatusCheckDelayMs));
560 } 541 }
561 542
562 void TranslateHelper::NotifyBrowserTranslationFailed( 543 void TranslateHelper::NotifyBrowserTranslationFailed(
563 translate::TranslateErrors::Type error) { 544 TranslateErrors::Type error) {
564 translation_pending_ = false; 545 translation_pending_ = false;
565 // Notify the browser there was an error. 546 // Notify the browser there was an error.
566 render_view()->Send(new ChromeViewHostMsg_PageTranslated( 547 render_view()->Send(new ChromeViewHostMsg_PageTranslated(
567 render_view()->GetRoutingID(), source_lang_, target_lang_, error)); 548 render_view()->GetRoutingID(), source_lang_, target_lang_, error));
568 } 549 }
569 550
570 WebFrame* TranslateHelper::GetMainFrame() { 551 WebFrame* TranslateHelper::GetMainFrame() {
571 WebView* web_view = render_view()->GetWebView(); 552 WebView* web_view = render_view()->GetWebView();
572 553
573 // When the tab is going to be closed, the web_view can be NULL. 554 // When the tab is going to be closed, the web_view can be NULL.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 // be DEFERRED until CLD is ready. In the latter case, CLD is in dynamic mode 627 // be DEFERRED until CLD is ready. In the latter case, CLD is in dynamic mode
647 // and may eventually become available, triggering the RESUMED event; after 628 // and may eventually become available, triggering the RESUMED event; after
648 // this, everything should start being ON_TIME. This should never run more 629 // this, everything should start being ON_TIME. This should never run more
649 // than twice in a page load, under any conditions. 630 // than twice in a page load, under any conditions.
650 // Also note that language detection is triggered off of a delay AFTER the 631 // Also note that language detection is triggered off of a delay AFTER the
651 // page load completed event has fired, making this very much off the critical 632 // page load completed event has fired, making this very much off the critical
652 // path. 633 // path.
653 content::RenderThread::Get()->UpdateHistograms( 634 content::RenderThread::Get()->UpdateHistograms(
654 content::kHistogramSynchronizerReservedSequenceNumber); 635 content::kHistogramSynchronizerReservedSequenceNumber);
655 } 636 }
637
638 } // namespace translate
OLDNEW
« no previous file with comments | « components/translate/content/renderer/translate_helper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698