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

Side by Side Diff: chrome/renderer/translate/translate_helper.cc

Issue 18911002: Move language detection to chrome/common/. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 7 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 "chrome/renderer/translate/translate_helper.h" 5 #include "chrome/renderer/translate/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.h" 10 #include "base/message_loop.h"
11 #include "base/strings/string16.h" 11 #include "base/strings/string16.h"
12 #include "base/strings/string_split.h"
13 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
14 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
15 #include "chrome/common/chrome_constants.h" 14 #include "chrome/common/chrome_constants.h"
16 #include "chrome/common/render_messages.h" 15 #include "chrome/common/render_messages.h"
17 #include "chrome/common/translate/translate_util.h" 16 #include "chrome/common/translate/language_detection_util.h"
18 #include "chrome/renderer/translate/translate_helper_metrics.h" 17 #include "chrome/common/translate/translate_common_metrics.h"
19 #include "content/public/renderer/render_view.h" 18 #include "content/public/renderer/render_view.h"
20 #include "third_party/WebKit/public/web/WebDocument.h" 19 #include "third_party/WebKit/public/web/WebDocument.h"
21 #include "third_party/WebKit/public/web/WebElement.h" 20 #include "third_party/WebKit/public/web/WebElement.h"
22 #include "third_party/WebKit/public/web/WebFrame.h" 21 #include "third_party/WebKit/public/web/WebFrame.h"
23 #include "third_party/WebKit/public/web/WebNode.h" 22 #include "third_party/WebKit/public/web/WebNode.h"
24 #include "third_party/WebKit/public/web/WebNodeList.h" 23 #include "third_party/WebKit/public/web/WebNodeList.h"
25 #include "third_party/WebKit/public/web/WebScriptSource.h" 24 #include "third_party/WebKit/public/web/WebScriptSource.h"
26 #include "third_party/WebKit/public/web/WebView.h" 25 #include "third_party/WebKit/public/web/WebView.h"
27 #include "v8/include/v8.h" 26 #include "v8/include/v8.h"
28 27
29 #if defined(ENABLE_LANGUAGE_DETECTION)
30 #include "third_party/cld/encodings/compact_lang_det/win/cld_unicodetext.h"
31 #endif
32
33 using WebKit::WebDocument; 28 using WebKit::WebDocument;
34 using WebKit::WebElement; 29 using WebKit::WebElement;
35 using WebKit::WebFrame; 30 using WebKit::WebFrame;
36 using WebKit::WebNode; 31 using WebKit::WebNode;
37 using WebKit::WebNodeList; 32 using WebKit::WebNodeList;
38 using WebKit::WebScriptSource; 33 using WebKit::WebScriptSource;
39 using WebKit::WebString; 34 using WebKit::WebString;
40 using WebKit::WebView; 35 using WebKit::WebView;
41 36
42 namespace { 37 namespace {
43 38
44 // The delay in milliseconds that we'll wait before checking to see if the 39 // The delay in milliseconds that we'll wait before checking to see if the
45 // translate library injected in the page is ready. 40 // translate library injected in the page is ready.
46 const int kTranslateInitCheckDelayMs = 150; 41 const int kTranslateInitCheckDelayMs = 150;
47 42
48 // The maximum number of times we'll check to see if the translate library 43 // The maximum number of times we'll check to see if the translate library
49 // injected in the page is ready. 44 // injected in the page is ready.
50 const int kMaxTranslateInitCheckAttempts = 5; 45 const int kMaxTranslateInitCheckAttempts = 5;
51 46
52 // The delay we wait in milliseconds before checking whether the translation has 47 // The delay we wait in milliseconds before checking whether the translation has
53 // finished. 48 // finished.
54 const int kTranslateStatusCheckDelayMs = 400; 49 const int kTranslateStatusCheckDelayMs = 400;
55 50
56 // Language name passed to the Translate element for it to detect the language. 51 // Language name passed to the Translate element for it to detect the language.
57 const char kAutoDetectionLanguage[] = "auto"; 52 const char kAutoDetectionLanguage[] = "auto";
58 53
59 // Similar language code list. Some languages are very similar and difficult
60 // for CLD to distinguish.
61 struct SimilarLanguageCode {
62 const char* const code;
63 int group;
64 };
65
66 const SimilarLanguageCode kSimilarLanguageCodes[] = {
67 {"bs", 1},
68 {"hr", 1},
69 {"hi", 2},
70 {"ne", 2},
71 };
72
73 // Checks |kSimilarLanguageCodes| and returns group code.
74 int GetSimilarLanguageGroupCode(const std::string& language) {
75 for (size_t i = 0; i < arraysize(kSimilarLanguageCodes); ++i) {
76 if (language.find(kSimilarLanguageCodes[i].code) != 0)
77 continue;
78 return kSimilarLanguageCodes[i].group;
79 }
80 return 0;
81 }
82
83 // Well-known languages which often have wrong server configuration of
84 // Content-Language: en.
85 // TODO(toyoshim): Remove these static tables and caller functions to
86 // chrome/common/translate, and implement them as std::set<>.
87 const char* kWellKnownCodesOnWrongConfiguration[] = {
88 "es", "pt", "ja", "ru", "de", "zh-CN", "zh-TW", "ar", "id", "fr", "it", "th"
89 };
90
91 } // namespace 54 } // namespace
92 55
93 //////////////////////////////////////////////////////////////////////////////// 56 ////////////////////////////////////////////////////////////////////////////////
94 // TranslateHelper, public: 57 // TranslateHelper, public:
95 // 58 //
96 TranslateHelper::TranslateHelper(content::RenderView* render_view) 59 TranslateHelper::TranslateHelper(content::RenderView* render_view)
97 : content::RenderViewObserver(render_view), 60 : content::RenderViewObserver(render_view),
98 page_id_(-1), 61 page_id_(-1),
99 translation_pending_(false), 62 translation_pending_(false),
100 weak_method_factory_(this) { 63 weak_method_factory_(this) {
(...skipping 20 matching lines...) Expand all
121 WebDocument document = main_frame->document(); 84 WebDocument document = main_frame->document();
122 std::string content_language = document.contentLanguage().utf8(); 85 std::string content_language = document.contentLanguage().utf8();
123 WebElement html_element = document.documentElement(); 86 WebElement html_element = document.documentElement();
124 std::string html_lang; 87 std::string html_lang;
125 // |html_element| can be null element, e.g. in 88 // |html_element| can be null element, e.g. in
126 // BrowserTest.WindowOpenClose. 89 // BrowserTest.WindowOpenClose.
127 if (!html_element.isNull()) 90 if (!html_element.isNull())
128 html_lang = html_element.getAttribute("lang").utf8(); 91 html_lang = html_element.getAttribute("lang").utf8();
129 std::string cld_language; 92 std::string cld_language;
130 bool is_cld_reliable; 93 bool is_cld_reliable;
131 std::string language = DeterminePageLanguage( 94 std::string language = LanguageDetectionUtil::DeterminePageLanguage(
132 content_language, html_lang, contents, &cld_language, &is_cld_reliable); 95 content_language, html_lang, contents, &cld_language, &is_cld_reliable);
133 96
134 if (language.empty()) 97 if (language.empty())
135 return; 98 return;
136 99
137 language_determined_time_ = base::TimeTicks::Now(); 100 language_determined_time_ = base::TimeTicks::Now();
138 101
139 GURL url(document.url()); 102 GURL url(document.url());
140 LanguageDetectionDetails details; 103 LanguageDetectionDetails details;
141 details.time = base::Time::Now(); 104 details.time = base::Time::Now();
(...skipping 14 matching lines...) Expand all
156 IsTranslationAllowed(&document) && !language.empty())); 119 IsTranslationAllowed(&document) && !language.empty()));
157 } 120 }
158 121
159 void TranslateHelper::CancelPendingTranslation() { 122 void TranslateHelper::CancelPendingTranslation() {
160 weak_method_factory_.InvalidateWeakPtrs(); 123 weak_method_factory_.InvalidateWeakPtrs();
161 translation_pending_ = false; 124 translation_pending_ = false;
162 source_lang_.clear(); 125 source_lang_.clear();
163 target_lang_.clear(); 126 target_lang_.clear();
164 } 127 }
165 128
166 #if defined(ENABLE_LANGUAGE_DETECTION)
167 // static
168 std::string TranslateHelper::DetermineTextLanguage(const string16& text,
169 bool* is_cld_reliable) {
170 std::string language = chrome::kUnknownLanguageCode;
171 int num_languages = 0;
172 int text_bytes = 0;
173 bool is_reliable = false;
174 Language cld_language =
175 DetectLanguageOfUnicodeText(NULL, text.c_str(), true, &is_reliable,
176 &num_languages, NULL, &text_bytes);
177 if (is_cld_reliable != NULL)
178 *is_cld_reliable = is_reliable;
179
180 // We don't trust the result if the CLD reports that the detection is not
181 // reliable, or if the actual text used to detect the language was less than
182 // 100 bytes (short texts can often lead to wrong results).
183 // TODO(toyoshim): CLD provides |is_reliable| flag. But, it just says that
184 // the determined language code is correct with 50% confidence. Chrome should
185 // handle the real confidence value to judge.
186 if (is_reliable && text_bytes >= 100 && cld_language != NUM_LANGUAGES &&
187 cld_language != UNKNOWN_LANGUAGE && cld_language != TG_UNKNOWN_LANGUAGE) {
188 // We should not use LanguageCode_ISO_639_1 because it does not cover all
189 // the languages CLD can detect. As a result, it'll return the invalid
190 // language code for tradtional Chinese among others.
191 // |LanguageCodeWithDialect| will go through ISO 639-1, ISO-639-2 and
192 // 'other' tables to do the 'right' thing. In addition, it'll return zh-CN
193 // for Simplified Chinese.
194 language = LanguageCodeWithDialects(cld_language);
195 }
196 VLOG(9) << "Detected lang_id: " << language << ", from Text:\n" << text
197 << "\n*************************************\n";
198 return language;
199 }
200 #endif // defined(ENABLE_LANGUAGE_DETECTION)
201
202 //////////////////////////////////////////////////////////////////////////////// 129 ////////////////////////////////////////////////////////////////////////////////
203 // TranslateHelper, protected: 130 // TranslateHelper, protected:
204 // 131 //
205 bool TranslateHelper::IsTranslateLibAvailable() { 132 bool TranslateHelper::IsTranslateLibAvailable() {
206 return ExecuteScriptAndGetBoolResult( 133 return ExecuteScriptAndGetBoolResult(
207 "typeof cr != 'undefined' && typeof cr.googleTranslate != 'undefined' && " 134 "typeof cr != 'undefined' && typeof cr.googleTranslate != 'undefined' && "
208 "typeof cr.googleTranslate.translate == 'function'", false); 135 "typeof cr.googleTranslate.translate == 'function'", false);
209 } 136 }
210 137
211 bool TranslateHelper::IsTranslateLibReady() { 138 bool TranslateHelper::IsTranslateLibReady() {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 NOTREACHED(); 223 NOTREACHED();
297 return 0.0; 224 return 0.0;
298 } 225 }
299 226
300 return v->NumberValue(); 227 return v->NumberValue();
301 } 228 }
302 229
303 //////////////////////////////////////////////////////////////////////////////// 230 ////////////////////////////////////////////////////////////////////////////////
304 // TranslateHelper, private: 231 // TranslateHelper, private:
305 // 232 //
306 // static
307 void TranslateHelper::CorrectLanguageCodeTypo(std::string* code) {
308 DCHECK(code);
309
310 size_t coma_index = code->find(',');
311 if (coma_index != std::string::npos) {
312 // There are more than 1 language specified, just keep the first one.
313 *code = code->substr(0, coma_index);
314 }
315 TrimWhitespaceASCII(*code, TRIM_ALL, code);
316
317 // An underscore instead of a dash is a frequent mistake.
318 size_t underscore_index = code->find('_');
319 if (underscore_index != std::string::npos)
320 (*code)[underscore_index] = '-';
321
322 // Change everything up to a dash to lower-case and everything after to upper.
323 size_t dash_index = code->find('-');
324 if (dash_index != std::string::npos) {
325 *code = StringToLowerASCII(code->substr(0, dash_index)) +
326 StringToUpperASCII(code->substr(dash_index));
327 } else {
328 *code = StringToLowerASCII(*code);
329 }
330 }
331
332 // static
333 bool TranslateHelper::IsValidLanguageCode(const std::string& code) {
334 // Roughly check if the language code follows /[a-zA-Z]{2,3}(-[a-zA-Z]{2})?/.
335 // TODO(hajimehoshi): How about es-419, which is used as an Accept language?
336 std::vector<std::string> chunks;
337 base::SplitString(code, '-', &chunks);
338
339 if (chunks.size() < 1 || 2 < chunks.size())
340 return false;
341
342 const std::string& main_code = chunks[0];
343
344 if (main_code.size() < 1 || 3 < main_code.size())
345 return false;
346
347 for (std::string::const_iterator it = main_code.begin();
348 it != main_code.end(); ++it) {
349 if (!IsAsciiAlpha(*it))
350 return false;
351 }
352
353 if (chunks.size() == 1)
354 return true;
355
356 const std::string& sub_code = chunks[1];
357
358 if (sub_code.size() != 2)
359 return false;
360
361 for (std::string::const_iterator it = sub_code.begin();
362 it != sub_code.end(); ++it) {
363 if (!IsAsciiAlpha(*it))
364 return false;
365 }
366
367 return true;
368 }
369
370 // static
371 void TranslateHelper::ApplyLanguageCodeCorrection(std::string* code) {
372 // Correct well-known format errors.
373 CorrectLanguageCodeTypo(code);
374
375 if (!IsValidLanguageCode(*code)) {
376 *code = std::string();
377 return;
378 }
379
380 TranslateUtil::ToTranslateLanguageSynonym(code);
381 }
382
383 // static
384 bool TranslateHelper::IsSameOrSimilarLanguages(
385 const std::string& page_language, const std::string& cld_language) {
386 // Language code part of |page_language| is matched to one of |cld_language|.
387 // Country code is ignored here.
388 if (page_language.size() >= 2 &&
389 cld_language.find(page_language.c_str(), 0, 2) == 0) {
390 // Languages are matched strictly. Reports false to metrics, but returns
391 // true.
392 TranslateHelperMetrics::ReportSimilarLanguageMatch(false);
393 return true;
394 }
395
396 // Check if |page_language| and |cld_language| are in the similar language
397 // list and belong to the same language group.
398 int page_code = GetSimilarLanguageGroupCode(page_language);
399 bool match = page_code != 0 &&
400 page_code == GetSimilarLanguageGroupCode(cld_language);
401
402 TranslateHelperMetrics::ReportSimilarLanguageMatch(match);
403 return match;
404 }
405
406 // static
407 bool TranslateHelper::MaybeServerWrongConfiguration(
408 const std::string& page_language, const std::string& cld_language) {
409 // If |page_language| is not "en-*", respect it and just return false here.
410 if (!StartsWithASCII(page_language, "en", false))
411 return false;
412
413 // A server provides a language meta information representing "en-*". But it
414 // might be just a default value due to missing user configuration.
415 // Let's trust |cld_language| if the determined language is not difficult to
416 // distinguish from English, and the language is one of well-known languages
417 // which often provide "en-*" meta information mistakenly.
418 for (size_t i = 0; i < arraysize(kWellKnownCodesOnWrongConfiguration); ++i) {
419 if (cld_language == kWellKnownCodesOnWrongConfiguration[i])
420 return true;
421 }
422 return false;
423 }
424
425 // static
426 bool TranslateHelper::CanCLDComplementSubCode(
427 const std::string& page_language, const std::string& cld_language) {
428 // Translate server cannot treat general Chinese. If Content-Language and
429 // CLD agree that the language is Chinese and Content-Language doesn't know
430 // which dialect is used, CLD language has priority.
431 // TODO(hajimehoshi): How about the other dialects like zh-MO?
432 return page_language == "zh" && StartsWithASCII(cld_language, "zh-", false);
433 }
434
435 // static
436 std::string TranslateHelper::DeterminePageLanguage(const std::string& code,
437 const std::string& html_lang,
438 const string16& contents,
439 std::string* cld_language_p,
440 bool* is_cld_reliable_p) {
441 #if defined(ENABLE_LANGUAGE_DETECTION)
442 base::TimeTicks begin_time = base::TimeTicks::Now();
443 bool is_cld_reliable;
444 std::string cld_language = DetermineTextLanguage(contents, &is_cld_reliable);
445 TranslateHelperMetrics::ReportLanguageDetectionTime(begin_time,
446 base::TimeTicks::Now());
447
448 if (cld_language_p != NULL)
449 *cld_language_p = cld_language;
450 if (is_cld_reliable_p != NULL)
451 *is_cld_reliable_p = is_cld_reliable;
452 TranslateUtil::ToTranslateLanguageSynonym(&cld_language);
453 #endif // defined(ENABLE_LANGUAGE_DETECTION)
454
455 // Check if html lang attribute is valid.
456 std::string modified_html_lang;
457 if (!html_lang.empty()) {
458 modified_html_lang = html_lang;
459 ApplyLanguageCodeCorrection(&modified_html_lang);
460 TranslateHelperMetrics::ReportHtmlLang(html_lang, modified_html_lang);
461 VLOG(9) << "html lang based language code: " << modified_html_lang;
462 }
463
464 // Check if Content-Language is valid.
465 std::string modified_code;
466 if (!code.empty()) {
467 modified_code = code;
468 ApplyLanguageCodeCorrection(&modified_code);
469 TranslateHelperMetrics::ReportContentLanguage(code, modified_code);
470 }
471
472 // Adopt |modified_html_lang| if it is valid. Otherwise, adopt
473 // |modified_code|.
474 std::string language = modified_html_lang.empty() ? modified_code :
475 modified_html_lang;
476
477 #if defined(ENABLE_LANGUAGE_DETECTION)
478 // If |language| is empty, just use CLD result even though it might be
479 // chrome::kUnknownLanguageCode.
480 if (language.empty()) {
481 TranslateHelperMetrics::ReportLanguageVerification(
482 TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_ONLY);
483 return cld_language;
484 }
485
486 if (cld_language == chrome::kUnknownLanguageCode) {
487 TranslateHelperMetrics::ReportLanguageVerification(
488 TranslateHelperMetrics::LANGUAGE_VERIFICATION_UNKNOWN);
489 return language;
490 } else if (IsSameOrSimilarLanguages(language, cld_language)) {
491 TranslateHelperMetrics::ReportLanguageVerification(
492 TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_AGREE);
493 return language;
494 } else if (MaybeServerWrongConfiguration(language, cld_language)) {
495 TranslateHelperMetrics::ReportLanguageVerification(
496 TranslateHelperMetrics::LANGUAGE_VERIFICATION_TRUST_CLD);
497 return cld_language;
498 } else if (CanCLDComplementSubCode(language, cld_language)) {
499 TranslateHelperMetrics::ReportLanguageVerification(
500 TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE);
501 return cld_language;
502 } else {
503 TranslateHelperMetrics::ReportLanguageVerification(
504 TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_DISAGREE);
505 // Content-Language value might be wrong because CLD says that this page
506 // is written in another language with confidence.
507 // In this case, Chrome doesn't rely on any of the language codes, and
508 // gives up suggesting a translation.
509 return std::string(chrome::kUnknownLanguageCode);
510 }
511 #else // defined(ENABLE_LANGUAGE_DETECTION)
512 TranslateHelperMetrics::ReportLanguageVerification(
513 TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_DISABLED);
514 #endif // defined(ENABLE_LANGUAGE_DETECTION)
515
516 return language;
517 }
518 233
519 // static 234 // static
520 bool TranslateHelper::IsTranslationAllowed(WebDocument* document) { 235 bool TranslateHelper::IsTranslationAllowed(WebDocument* document) {
521 WebElement head = document->head(); 236 WebElement head = document->head();
522 if (head.isNull() || !head.hasChildNodes()) 237 if (head.isNull() || !head.hasChildNodes())
523 return true; 238 return true;
524 239
525 const WebString meta(ASCIIToUTF16("meta")); 240 const WebString meta(ASCIIToUTF16("meta"));
526 const WebString name(ASCIIToUTF16("name")); 241 const WebString name(ASCIIToUTF16("name"));
527 const WebString google(ASCIIToUTF16("google")); 242 const WebString google(ASCIIToUTF16("google"));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 297
583 // Set our states. 298 // Set our states.
584 translation_pending_ = true; 299 translation_pending_ = true;
585 300
586 // If the source language is undetermined, we'll let the translate element 301 // If the source language is undetermined, we'll let the translate element
587 // detect it. 302 // detect it.
588 source_lang_ = (source_lang != chrome::kUnknownLanguageCode) ? 303 source_lang_ = (source_lang != chrome::kUnknownLanguageCode) ?
589 source_lang : kAutoDetectionLanguage; 304 source_lang : kAutoDetectionLanguage;
590 target_lang_ = target_lang; 305 target_lang_ = target_lang;
591 306
592 TranslateHelperMetrics::ReportUserActionDuration(language_determined_time_, 307 TranslateCommonMetrics::ReportUserActionDuration(language_determined_time_,
593 base::TimeTicks::Now()); 308 base::TimeTicks::Now());
594 309
595 GURL url(main_frame->document().url()); 310 GURL url(main_frame->document().url());
596 TranslateHelperMetrics::ReportPageScheme(url.scheme()); 311 TranslateCommonMetrics::ReportPageScheme(url.scheme());
597 312
598 if (!IsTranslateLibAvailable()) { 313 if (!IsTranslateLibAvailable()) {
599 // Evaluate the script to add the translation related method to the global 314 // Evaluate the script to add the translation related method to the global
600 // context of the page. 315 // context of the page.
601 ExecuteScript(translate_script); 316 ExecuteScript(translate_script);
602 DCHECK(IsTranslateLibAvailable()); 317 DCHECK(IsTranslateLibAvailable());
603 } 318 }
604 319
605 TranslatePageImpl(0); 320 TranslatePageImpl(0);
606 } 321 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 } 364 }
650 365
651 if (!translation_pending_) { 366 if (!translation_pending_) {
652 NOTREACHED(); 367 NOTREACHED();
653 return; 368 return;
654 } 369 }
655 370
656 translation_pending_ = false; 371 translation_pending_ = false;
657 372
658 // Check JavaScript performance counters for UMA reports. 373 // Check JavaScript performance counters for UMA reports.
659 TranslateHelperMetrics::ReportTimeToTranslate( 374 TranslateCommonMetrics::ReportTimeToTranslate(
660 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime")); 375 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.translationTime"));
661 376
662 // Notify the browser we are done. 377 // Notify the browser we are done.
663 render_view()->Send(new ChromeViewHostMsg_PageTranslated( 378 render_view()->Send(new ChromeViewHostMsg_PageTranslated(
664 render_view()->GetRoutingID(), render_view()->GetPageId(), 379 render_view()->GetRoutingID(), render_view()->GetPageId(),
665 actual_source_lang, target_lang_, TranslateErrors::NONE)); 380 actual_source_lang, target_lang_, TranslateErrors::NONE));
666 return; 381 return;
667 } 382 }
668 383
669 // The translation is still pending, check again later. 384 // The translation is still pending, check again later.
(...skipping 20 matching lines...) Expand all
690 FROM_HERE, 405 FROM_HERE,
691 base::Bind(&TranslateHelper::TranslatePageImpl, 406 base::Bind(&TranslateHelper::TranslatePageImpl,
692 weak_method_factory_.GetWeakPtr(), 407 weak_method_factory_.GetWeakPtr(),
693 count), 408 count),
694 AdjustDelay(count * kTranslateInitCheckDelayMs)); 409 AdjustDelay(count * kTranslateInitCheckDelayMs));
695 return; 410 return;
696 } 411 }
697 412
698 // The library is loaded, and ready for translation now. 413 // The library is loaded, and ready for translation now.
699 // Check JavaScript performance counters for UMA reports. 414 // Check JavaScript performance counters for UMA reports.
700 TranslateHelperMetrics::ReportTimeToBeReady( 415 TranslateCommonMetrics::ReportTimeToBeReady(
701 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime")); 416 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.readyTime"));
702 TranslateHelperMetrics::ReportTimeToLoad( 417 TranslateCommonMetrics::ReportTimeToLoad(
703 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime")); 418 ExecuteScriptAndGetDoubleResult("cr.googleTranslate.loadTime"));
704 419
705 if (!StartTranslation()) { 420 if (!StartTranslation()) {
706 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); 421 NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR);
707 return; 422 return;
708 } 423 }
709 // Check the status of the translation. 424 // Check the status of the translation.
710 base::MessageLoop::current()->PostDelayedTask( 425 base::MessageLoop::current()->PostDelayedTask(
711 FROM_HERE, 426 FROM_HERE,
712 base::Bind(&TranslateHelper::CheckTranslateStatus, 427 base::Bind(&TranslateHelper::CheckTranslateStatus,
(...skipping 12 matching lines...) Expand all
725 440
726 WebFrame* TranslateHelper::GetMainFrame() { 441 WebFrame* TranslateHelper::GetMainFrame() {
727 WebView* web_view = render_view()->GetWebView(); 442 WebView* web_view = render_view()->GetWebView();
728 443
729 // When the tab is going to be closed, the web_view can be NULL. 444 // When the tab is going to be closed, the web_view can be NULL.
730 if (!web_view) 445 if (!web_view)
731 return NULL; 446 return NULL;
732 447
733 return web_view->mainFrame(); 448 return web_view->mainFrame();
734 } 449 }
OLDNEW
« no previous file with comments | « chrome/renderer/translate/translate_helper.h ('k') | chrome/renderer/translate/translate_helper_metrics.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698