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 "chrome/browser/translate/translate_manager.h" | 5 #include "chrome/browser/translate/translate_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
11 #include "base/message_loop.h" | |
12 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
13 #include "base/prefs/pref_service.h" | 12 #include "base/prefs/pref_service.h" |
14 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
15 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
16 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
17 #include "base/time.h" | 16 #include "base/time.h" |
18 #include "base/values.h" | 17 #include "base/values.h" |
19 #include "chrome/browser/browser_process.h" | 18 #include "chrome/browser/browser_process.h" |
20 #include "chrome/browser/infobars/infobar_service.h" | 19 #include "chrome/browser/infobars/infobar_service.h" |
21 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
22 #include "chrome/browser/tab_contents/language_state.h" | 21 #include "chrome/browser/tab_contents/language_state.h" |
23 #include "chrome/browser/tab_contents/tab_util.h" | 22 #include "chrome/browser/tab_contents/tab_util.h" |
24 #include "chrome/browser/translate/page_translated_details.h" | 23 #include "chrome/browser/translate/page_translated_details.h" |
25 #include "chrome/browser/translate/translate_accept_languages.h" | 24 #include "chrome/browser/translate/translate_accept_languages.h" |
26 #include "chrome/browser/translate/translate_browser_metrics.h" | 25 #include "chrome/browser/translate/translate_browser_metrics.h" |
27 #include "chrome/browser/translate/translate_error_details.h" | 26 #include "chrome/browser/translate/translate_error_details.h" |
28 #include "chrome/browser/translate/translate_event_details.h" | 27 #include "chrome/browser/translate/translate_event_details.h" |
29 #include "chrome/browser/translate/translate_infobar_delegate.h" | 28 #include "chrome/browser/translate/translate_infobar_delegate.h" |
30 #include "chrome/browser/translate/translate_language_list.h" | 29 #include "chrome/browser/translate/translate_language_list.h" |
31 #include "chrome/browser/translate/translate_prefs.h" | 30 #include "chrome/browser/translate/translate_prefs.h" |
31 #include "chrome/browser/translate/translate_script.h" | |
32 #include "chrome/browser/translate/translate_tab_helper.h" | 32 #include "chrome/browser/translate/translate_tab_helper.h" |
33 #include "chrome/browser/translate/translate_url_util.h" | 33 #include "chrome/browser/translate/translate_url_util.h" |
34 #include "chrome/browser/ui/browser.h" | 34 #include "chrome/browser/ui/browser.h" |
35 #include "chrome/browser/ui/browser_finder.h" | 35 #include "chrome/browser/ui/browser_finder.h" |
36 #include "chrome/browser/ui/browser_tabstrip.h" | 36 #include "chrome/browser/ui/browser_tabstrip.h" |
37 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 37 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
38 #include "chrome/common/chrome_constants.h" | 38 #include "chrome/common/chrome_constants.h" |
39 #include "chrome/common/chrome_notification_types.h" | 39 #include "chrome/common/chrome_notification_types.h" |
40 #include "chrome/common/chrome_switches.h" | 40 #include "chrome/common/chrome_switches.h" |
41 #include "chrome/common/pref_names.h" | 41 #include "chrome/common/pref_names.h" |
42 #include "chrome/common/render_messages.h" | 42 #include "chrome/common/render_messages.h" |
43 #include "chrome/common/translate/language_detection_details.h" | 43 #include "chrome/common/translate/language_detection_details.h" |
44 #include "chrome/common/url_constants.h" | 44 #include "chrome/common/url_constants.h" |
45 #include "content/public/browser/navigation_controller.h" | 45 #include "content/public/browser/navigation_controller.h" |
46 #include "content/public/browser/navigation_details.h" | 46 #include "content/public/browser/navigation_details.h" |
47 #include "content/public/browser/navigation_entry.h" | 47 #include "content/public/browser/navigation_entry.h" |
48 #include "content/public/browser/notification_details.h" | 48 #include "content/public/browser/notification_details.h" |
49 #include "content/public/browser/notification_service.h" | 49 #include "content/public/browser/notification_service.h" |
50 #include "content/public/browser/notification_source.h" | 50 #include "content/public/browser/notification_source.h" |
51 #include "content/public/browser/notification_types.h" | 51 #include "content/public/browser/notification_types.h" |
52 #include "content/public/browser/render_process_host.h" | 52 #include "content/public/browser/render_process_host.h" |
53 #include "content/public/browser/render_view_host.h" | 53 #include "content/public/browser/render_view_host.h" |
54 #include "content/public/browser/web_contents.h" | 54 #include "content/public/browser/web_contents.h" |
55 #include "google_apis/google_api_keys.h" | |
56 #include "grit/browser_resources.h" | |
57 #include "net/base/escape.h" | |
58 #include "net/base/load_flags.h" | 55 #include "net/base/load_flags.h" |
59 #include "net/base/url_util.h" | 56 #include "net/base/url_util.h" |
60 #include "net/http/http_status_code.h" | 57 #include "net/http/http_status_code.h" |
61 #include "net/url_request/url_fetcher.h" | |
62 #include "net/url_request/url_request_status.h" | |
63 #include "ui/base/l10n/l10n_util.h" | 58 #include "ui/base/l10n/l10n_util.h" |
64 #include "ui/base/resource/resource_bundle.h" | |
65 | 59 |
66 #ifdef FILE_MANAGER_EXTENSION | 60 #ifdef FILE_MANAGER_EXTENSION |
67 #include "chrome/browser/chromeos/extensions/file_manager/file_manager_util.h" | 61 #include "chrome/browser/chromeos/extensions/file_manager/file_manager_util.h" |
68 #include "extensions/common/constants.h" | 62 #include "extensions/common/constants.h" |
69 #endif | 63 #endif |
70 | 64 |
71 using content::NavigationController; | 65 using content::NavigationController; |
72 using content::NavigationEntry; | 66 using content::NavigationEntry; |
73 using content::WebContents; | 67 using content::WebContents; |
74 | 68 |
75 namespace { | 69 namespace { |
76 | 70 |
77 const char kTranslateScriptURL[] = | |
78 "https://translate.google.com/translate_a/element.js"; | |
79 const char kTranslateScriptHeader[] = "Google-Translate-Element-Mode: library"; | |
80 const char kReportLanguageDetectionErrorURL[] = | 71 const char kReportLanguageDetectionErrorURL[] = |
81 "https://translate.google.com/translate_error?client=cr&action=langidc"; | 72 "https://translate.google.com/translate_error?client=cr&action=langidc"; |
82 | 73 |
83 // Used in kTranslateScriptURL to specify a callback function name. | |
84 const char kCallbackQueryName[] = "cb"; | |
85 const char kCallbackQueryValue[] = | |
86 "cr.googleTranslate.onTranslateElementLoad"; | |
87 | |
88 // Used in kReportLanguageDetectionErrorURL to specify the original page | 74 // Used in kReportLanguageDetectionErrorURL to specify the original page |
89 // language. | 75 // language. |
90 const char kSourceLanguageQueryName[] = "sl"; | 76 const char kSourceLanguageQueryName[] = "sl"; |
91 | 77 |
92 // Used in kReportLanguageDetectionErrorURL to specify the page URL. | 78 // Used in kReportLanguageDetectionErrorURL to specify the page URL. |
93 const char kUrlQueryName[] = "u"; | 79 const char kUrlQueryName[] = "u"; |
94 | 80 |
95 // The delay in ms that we'll wait to check if a page has finished loading | 81 // The delay in ms that we'll wait to check if a page has finished loading |
96 // before attempting a translation. | 82 // before attempting a translation. |
97 const int kTranslateLoadCheckDelayMs = 150; | 83 const int kTranslateLoadCheckDelayMs = 150; |
98 | 84 |
99 // The maximum number of attempts we'll do to see if the page has finshed | 85 // The maximum number of attempts we'll do to see if the page has finshed |
100 // loading before giving up the translation | 86 // loading before giving up the translation |
101 const int kMaxTranslateLoadCheckAttempts = 20; | 87 const int kMaxTranslateLoadCheckAttempts = 20; |
102 | 88 |
103 const int kTranslateScriptExpirationDelayDays = 1; | |
104 | |
105 } // namespace | 89 } // namespace |
106 | 90 |
107 TranslateManager::~TranslateManager() { | 91 TranslateManager::~TranslateManager() { |
108 weak_method_factory_.InvalidateWeakPtrs(); | 92 weak_method_factory_.InvalidateWeakPtrs(); |
109 } | 93 } |
110 | 94 |
111 // static | 95 // static |
112 TranslateManager* TranslateManager::GetInstance() { | 96 TranslateManager* TranslateManager::GetInstance() { |
113 return Singleton<TranslateManager>::get(); | 97 return Singleton<TranslateManager>::get(); |
114 } | 98 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
180 bool TranslateManager::IsAcceptLanguage(Profile* profile, | 164 bool TranslateManager::IsAcceptLanguage(Profile* profile, |
181 const std::string& language) { | 165 const std::string& language) { |
182 if (GetInstance()->accept_languages_.get()) { | 166 if (GetInstance()->accept_languages_.get()) { |
183 return GetInstance()->accept_languages_->IsAcceptLanguage( | 167 return GetInstance()->accept_languages_->IsAcceptLanguage( |
184 profile, language); | 168 profile, language); |
185 } | 169 } |
186 NOTREACHED(); | 170 NOTREACHED(); |
187 return false; | 171 return false; |
188 } | 172 } |
189 | 173 |
174 void TranslateManager::SetTranslateScriptExpirationDelay(int delay_ms) { | |
175 if (!script_) { | |
176 NOTREACHED(); | |
177 return; | |
178 } | |
179 script_->set_expiration_delay(delay_ms); | |
180 } | |
181 | |
190 void TranslateManager::Observe(int type, | 182 void TranslateManager::Observe(int type, |
191 const content::NotificationSource& source, | 183 const content::NotificationSource& source, |
192 const content::NotificationDetails& details) { | 184 const content::NotificationDetails& details) { |
193 switch (type) { | 185 switch (type) { |
194 case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { | 186 case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { |
195 NavigationController* controller = | 187 NavigationController* controller = |
196 content::Source<NavigationController>(source).ptr(); | 188 content::Source<NavigationController>(source).ptr(); |
197 content::LoadCommittedDetails* load_details = | 189 content::LoadCommittedDetails* load_details = |
198 content::Details<content::LoadCommittedDetails>(details).ptr(); | 190 content::Details<content::LoadCommittedDetails>(details).ptr(); |
199 NavigationEntry* entry = controller->GetActiveEntry(); | 191 NavigationEntry* entry = controller->GetActiveEntry(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
277 PageTranslatedDetails* page_translated_details = | 269 PageTranslatedDetails* page_translated_details = |
278 content::Details<PageTranslatedDetails>(details).ptr(); | 270 content::Details<PageTranslatedDetails>(details).ptr(); |
279 PageTranslated(tab, page_translated_details); | 271 PageTranslated(tab, page_translated_details); |
280 break; | 272 break; |
281 } | 273 } |
282 default: | 274 default: |
283 NOTREACHED(); | 275 NOTREACHED(); |
284 } | 276 } |
285 } | 277 } |
286 | 278 |
287 void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) { | 279 void TranslateManager::ProcessPendingRequests(bool error) { |
288 if (translate_script_request_pending_.get() != source) { | 280 std::vector<PendingRequest>::const_iterator iter; |
289 // Looks like crash on Mac is possibly caused with callback entering here | 281 for (iter = pending_requests_.begin(); iter != pending_requests_.end(); |
290 // with unknown fetcher when network is refreshed. | 282 ++iter) { |
291 scoped_ptr<const net::URLFetcher> delete_ptr(source); | 283 const PendingRequest& request = *iter; |
292 return; | 284 WebContents* web_contents = |
285 tab_util::GetWebContentsByID(request.render_process_id, | |
286 request.render_view_id); | |
287 if (!web_contents) { | |
288 // The tab went away while we were retrieving the script. | |
289 continue; | |
290 } | |
291 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | |
292 if (!entry || entry->GetPageID() != request.page_id) { | |
293 // We navigated away from the page the translation was triggered on. | |
294 continue; | |
295 } | |
296 | |
297 if (error) { | |
298 Profile* profile = | |
299 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | |
300 TranslateInfoBarDelegate::Create( | |
301 InfoBarService::FromWebContents(web_contents), | |
302 true, | |
303 TranslateInfoBarDelegate::TRANSLATION_ERROR, | |
304 TranslateErrors::NETWORK, | |
305 profile->GetPrefs(), | |
306 ShortcutConfig(), | |
307 request.source_lang, | |
308 request.target_lang); | |
309 | |
310 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { | |
311 TranslateErrorDetails error_details; | |
312 error_details.time = base::Time::Now(); | |
313 error_details.url = entry->GetURL(); | |
314 error_details.error = TranslateErrors::NETWORK; | |
315 NotifyTranslateError(error_details); | |
316 } | |
317 } else { | |
318 // Translate the page. | |
319 const std::string& translate_script = script_->data(); | |
320 DoTranslatePage(web_contents, translate_script, | |
321 request.source_lang, request.target_lang); | |
322 } | |
293 } | 323 } |
294 | 324 pending_requests_.clear(); |
295 bool error = | |
296 source->GetStatus().status() != net::URLRequestStatus::SUCCESS || | |
297 source->GetResponseCode() != net::HTTP_OK; | |
298 if (translate_script_request_pending_.get() == source) { | |
299 scoped_ptr<const net::URLFetcher> delete_ptr( | |
300 translate_script_request_pending_.release()); | |
301 if (!error) { | |
302 base::StringPiece str = ResourceBundle::GetSharedInstance(). | |
303 GetRawDataResource(IDR_TRANSLATE_JS); | |
304 DCHECK(translate_script_.empty()); | |
305 str.CopyToString(&translate_script_); | |
306 std::string argument = "('"; | |
307 std::string api_key = google_apis::GetAPIKey(); | |
308 argument += net::EscapeQueryParamValue(api_key, true); | |
309 argument += "');\n"; | |
310 std::string data; | |
311 source->GetResponseAsString(&data); | |
312 translate_script_ += argument + data; | |
313 | |
314 // We'll expire the cached script after some time, to make sure long | |
315 // running browsers still get fixes that might get pushed with newer | |
316 // scripts. | |
317 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, | |
318 base::Bind(&TranslateManager::ClearTranslateScript, | |
319 weak_method_factory_.GetWeakPtr()), | |
320 translate_script_expiration_delay_); | |
321 } | |
322 // Process any pending requests. | |
323 std::vector<PendingRequest>::const_iterator iter; | |
324 for (iter = pending_requests_.begin(); iter != pending_requests_.end(); | |
325 ++iter) { | |
326 const PendingRequest& request = *iter; | |
327 WebContents* web_contents = | |
328 tab_util::GetWebContentsByID(request.render_process_id, | |
329 request.render_view_id); | |
330 if (!web_contents) { | |
331 // The tab went away while we were retrieving the script. | |
332 continue; | |
333 } | |
334 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | |
335 if (!entry || entry->GetPageID() != request.page_id) { | |
336 // We navigated away from the page the translation was triggered on. | |
337 continue; | |
338 } | |
339 | |
340 if (error) { | |
341 Profile* profile = | |
342 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | |
343 TranslateInfoBarDelegate::Create( | |
344 InfoBarService::FromWebContents(web_contents), | |
345 true, | |
346 TranslateInfoBarDelegate::TRANSLATION_ERROR, | |
347 TranslateErrors::NETWORK, | |
348 profile->GetPrefs(), | |
349 ShortcutConfig(), | |
350 request.source_lang, | |
351 request.target_lang); | |
352 | |
353 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { | |
354 TranslateErrorDetails error_details; | |
355 error_details.time = base::Time::Now(); | |
356 error_details.url = entry->GetURL(); | |
357 error_details.error = TranslateErrors::NETWORK; | |
358 NotifyTranslateError(error_details); | |
359 } | |
360 } else { | |
361 // Translate the page. | |
362 DoTranslatePage(web_contents, translate_script_, | |
363 request.source_lang, request.target_lang); | |
364 } | |
365 } | |
366 pending_requests_.clear(); | |
367 } | |
368 } | 325 } |
369 | 326 |
370 void TranslateManager::AddObserver(Observer* obs) { | 327 void TranslateManager::AddObserver(Observer* obs) { |
371 observer_list_.AddObserver(obs); | 328 observer_list_.AddObserver(obs); |
372 } | 329 } |
373 | 330 |
374 void TranslateManager::RemoveObserver(Observer* obs) { | 331 void TranslateManager::RemoveObserver(Observer* obs) { |
375 observer_list_.RemoveObserver(obs); | 332 observer_list_.RemoveObserver(obs); |
376 } | 333 } |
377 | 334 |
378 void TranslateManager::NotifyTranslateEvent( | 335 void TranslateManager::NotifyTranslateEvent( |
379 const TranslateEventDetails& details) { | 336 const TranslateEventDetails& details) { |
380 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateEvent(details)); | 337 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateEvent(details)); |
381 } | 338 } |
382 | 339 |
383 void TranslateManager::NotifyLanguageDetection( | 340 void TranslateManager::NotifyLanguageDetection( |
384 const LanguageDetectionDetails& details) { | 341 const LanguageDetectionDetails& details) { |
385 FOR_EACH_OBSERVER(Observer, observer_list_, OnLanguageDetection(details)); | 342 FOR_EACH_OBSERVER(Observer, observer_list_, OnLanguageDetection(details)); |
386 } | 343 } |
387 | 344 |
388 void TranslateManager::NotifyTranslateError( | 345 void TranslateManager::NotifyTranslateError( |
389 const TranslateErrorDetails& details) { | 346 const TranslateErrorDetails& details) { |
390 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateError(details)); | 347 FOR_EACH_OBSERVER(Observer, observer_list_, OnTranslateError(details)); |
391 } | 348 } |
392 | 349 |
393 TranslateManager::TranslateManager() | 350 TranslateManager::TranslateManager() |
394 : weak_method_factory_(this), | 351 : weak_method_factory_(this), |
395 translate_script_expiration_delay_(base::TimeDelta::FromDays( | |
396 kTranslateScriptExpirationDelayDays)), | |
397 max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts) { | 352 max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts) { |
398 notification_registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 353 notification_registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
399 content::NotificationService::AllSources()); | 354 content::NotificationService::AllSources()); |
400 notification_registrar_.Add(this, | 355 notification_registrar_.Add(this, |
401 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, | 356 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, |
402 content::NotificationService::AllSources()); | 357 content::NotificationService::AllSources()); |
403 notification_registrar_.Add(this, chrome::NOTIFICATION_PAGE_TRANSLATED, | 358 notification_registrar_.Add(this, chrome::NOTIFICATION_PAGE_TRANSLATED, |
404 content::NotificationService::AllSources()); | 359 content::NotificationService::AllSources()); |
405 language_list_.reset(new TranslateLanguageList); | 360 language_list_.reset(new TranslateLanguageList); |
406 accept_languages_.reset(new TranslateAcceptLanguages); | 361 accept_languages_.reset(new TranslateAcceptLanguages); |
362 script_.reset(new TranslateScript); | |
407 } | 363 } |
408 | 364 |
409 void TranslateManager::InitiateTranslation(WebContents* web_contents, | 365 void TranslateManager::InitiateTranslation(WebContents* web_contents, |
410 const std::string& page_lang) { | 366 const std::string& page_lang) { |
411 Profile* profile = | 367 Profile* profile = |
412 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 368 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
413 Profile* original_profile = profile->GetOriginalProfile(); | 369 Profile* original_profile = profile->GetOriginalProfile(); |
414 PrefService* prefs = original_profile->GetPrefs(); | 370 PrefService* prefs = original_profile->GetPrefs(); |
415 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { | 371 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { |
416 TranslateBrowserMetrics::ReportInitiationStatus( | 372 TranslateBrowserMetrics::ReportInitiationStatus( |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
578 // Unsupported language strings should be replaced with | 534 // Unsupported language strings should be replaced with |
579 // kUnknownLanguageCode in order to send a translation request with enabling | 535 // kUnknownLanguageCode in order to send a translation request with enabling |
580 // server side auto language detection. | 536 // server side auto language detection. |
581 if (!IsSupportedLanguage(source_lang)) | 537 if (!IsSupportedLanguage(source_lang)) |
582 source_lang = std::string(chrome::kUnknownLanguageCode); | 538 source_lang = std::string(chrome::kUnknownLanguageCode); |
583 | 539 |
584 TranslateInfoBarDelegate::Create( | 540 TranslateInfoBarDelegate::Create( |
585 InfoBarService::FromWebContents(web_contents), true, | 541 InfoBarService::FromWebContents(web_contents), true, |
586 TranslateInfoBarDelegate::TRANSLATING, TranslateErrors::NONE, | 542 TranslateInfoBarDelegate::TRANSLATING, TranslateErrors::NONE, |
587 profile->GetPrefs(), ShortcutConfig(), source_lang, target_lang); | 543 profile->GetPrefs(), ShortcutConfig(), source_lang, target_lang); |
588 | 544 |
Takashi Toyoshima
2013/06/21 05:38:55
Should relocate DCHECK at line 562 to here?
hajimehoshi
2013/06/21 07:01:44
Done.
| |
589 if (!translate_script_.empty()) { | 545 const std::string& translate_script = script_->data(); |
590 DoTranslatePage(web_contents, translate_script_, source_lang, target_lang); | 546 if (!translate_script.empty()) { |
547 DoTranslatePage(web_contents, translate_script, source_lang, target_lang); | |
591 return; | 548 return; |
592 } | 549 } |
593 | 550 |
594 // The script is not available yet. Queue that request and query for the | 551 // The script is not available yet. Queue that request and query for the |
595 // script. Once it is downloaded we'll do the translate. | 552 // script. Once it is downloaded we'll do the translate. |
596 content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); | 553 content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); |
597 PendingRequest request; | 554 PendingRequest request; |
598 request.render_process_id = rvh->GetProcess()->GetID(); | 555 request.render_process_id = rvh->GetProcess()->GetID(); |
599 request.render_view_id = rvh->GetRoutingID(); | 556 request.render_view_id = rvh->GetRoutingID(); |
600 request.page_id = entry->GetPageID(); | 557 request.page_id = entry->GetPageID(); |
601 request.source_lang = source_lang; | 558 request.source_lang = source_lang; |
602 request.target_lang = target_lang; | 559 request.target_lang = target_lang; |
603 pending_requests_.push_back(request); | 560 pending_requests_.push_back(request); |
604 RequestTranslateScript(); | 561 |
562 DCHECK(script_ != NULL); | |
Takashi Toyoshima
2013/06/21 05:38:55
script_.get()
hajimehoshi
2013/06/21 07:01:44
Done.
| |
563 if (script_->HasPendingRequest()) | |
564 return; | |
565 | |
566 script_->Request( | |
567 base::Bind(&TranslateManager::OnTranslateScriptFetchComplete, | |
568 base::Unretained(this))); | |
605 } | 569 } |
606 | 570 |
607 void TranslateManager::RevertTranslation(WebContents* web_contents) { | 571 void TranslateManager::RevertTranslation(WebContents* web_contents) { |
608 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | 572 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
609 if (!entry) { | 573 if (!entry) { |
610 NOTREACHED(); | 574 NOTREACHED(); |
611 return; | 575 return; |
612 } | 576 } |
613 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( | 577 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( |
614 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); | 578 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); |
(...skipping 28 matching lines...) Expand all Loading... | |
643 kSourceLanguageQueryName, | 607 kSourceLanguageQueryName, |
644 translate_tab_helper->language_state().original_language()); | 608 translate_tab_helper->language_state().original_language()); |
645 | 609 |
646 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); | 610 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); |
647 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); | 611 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); |
648 | 612 |
649 chrome::AddSelectedTabWithURL(browser, report_error_url, | 613 chrome::AddSelectedTabWithURL(browser, report_error_url, |
650 content::PAGE_TRANSITION_AUTO_BOOKMARK); | 614 content::PAGE_TRANSITION_AUTO_BOOKMARK); |
651 } | 615 } |
652 | 616 |
617 void TranslateManager::ClearTranslateScript() { | |
618 if (!script_) { | |
Takashi Toyoshima
2013/06/21 05:38:55
script_.get() == NULL
hajimehoshi
2013/06/21 07:01:44
Done.
| |
619 NOTREACHED(); | |
620 return; | |
621 } | |
622 script_->Clear(); | |
623 } | |
624 | |
653 void TranslateManager::DoTranslatePage(WebContents* web_contents, | 625 void TranslateManager::DoTranslatePage(WebContents* web_contents, |
654 const std::string& translate_script, | 626 const std::string& translate_script, |
655 const std::string& source_lang, | 627 const std::string& source_lang, |
656 const std::string& target_lang) { | 628 const std::string& target_lang) { |
657 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | 629 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
658 if (!entry) { | 630 if (!entry) { |
659 NOTREACHED(); | 631 NOTREACHED(); |
660 return; | 632 return; |
661 } | 633 } |
662 | 634 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
711 } | 683 } |
712 | 684 |
713 if (language_list_.get()) | 685 if (language_list_.get()) |
714 language_list_->RequestLanguageList(); | 686 language_list_->RequestLanguageList(); |
715 else | 687 else |
716 NOTREACHED(); | 688 NOTREACHED(); |
717 } | 689 } |
718 | 690 |
719 void TranslateManager::CleanupPendingUlrFetcher() { | 691 void TranslateManager::CleanupPendingUlrFetcher() { |
720 language_list_.reset(); | 692 language_list_.reset(); |
721 translate_script_request_pending_.reset(); | 693 script_.reset(); |
722 } | 694 } |
723 | 695 |
724 void TranslateManager::RequestTranslateScript() { | 696 void TranslateManager::OnTranslateScriptFetchComplete( |
725 if (translate_script_request_pending_.get() != NULL) | 697 bool success, const std::string& data) { |
726 return; | 698 ProcessPendingRequests(!success); |
Takashi Toyoshima
2013/06/21 05:38:55
How about moving ProcessPendingRequests() implemen
hajimehoshi
2013/06/21 07:01:44
Done.
| |
727 | |
728 GURL translate_script_url; | |
729 // Check if command-line contains an alternative URL for translate service. | |
730 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | |
731 if (command_line.HasSwitch(switches::kTranslateScriptURL)) { | |
732 translate_script_url = GURL( | |
733 command_line.GetSwitchValueASCII(switches::kTranslateScriptURL)); | |
734 if (!translate_script_url.is_valid() || | |
735 !translate_script_url.query().empty()) { | |
736 LOG(WARNING) << "The following translate URL specified at the " | |
737 << "command-line is invalid: " | |
738 << translate_script_url.spec(); | |
739 translate_script_url = GURL(); | |
740 } | |
741 } | |
742 // Use default URL when command-line argument is not specified, or specified | |
743 // URL is invalid. | |
744 if (translate_script_url.is_empty()) | |
745 translate_script_url = GURL(kTranslateScriptURL); | |
746 | |
747 translate_script_url = net::AppendQueryParameter( | |
748 translate_script_url, | |
749 kCallbackQueryName, | |
750 kCallbackQueryValue); | |
751 | |
752 translate_script_url = | |
753 TranslateURLUtil::AddHostLocaleToUrl(translate_script_url); | |
754 translate_script_url = | |
755 TranslateURLUtil::AddApiKeyToUrl(translate_script_url); | |
756 | |
757 translate_script_request_pending_.reset(net::URLFetcher::Create( | |
758 0, translate_script_url, net::URLFetcher::GET, this)); | |
759 translate_script_request_pending_->SetLoadFlags( | |
760 net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES); | |
761 translate_script_request_pending_->SetRequestContext( | |
762 g_browser_process->system_request_context()); | |
763 translate_script_request_pending_->SetExtraRequestHeaders( | |
764 kTranslateScriptHeader); | |
765 translate_script_request_pending_->Start(); | |
766 } | 699 } |
767 | 700 |
768 // static | 701 // static |
769 std::string TranslateManager::GetTargetLanguage(PrefService* prefs) { | 702 std::string TranslateManager::GetTargetLanguage(PrefService* prefs) { |
770 std::string ui_lang = | 703 std::string ui_lang = |
771 GetLanguageCode(g_browser_process->GetApplicationLocale()); | 704 GetLanguageCode(g_browser_process->GetApplicationLocale()); |
772 if (IsSupportedLanguage(ui_lang)) | 705 if (IsSupportedLanguage(ui_lang)) |
773 return ui_lang; | 706 return ui_lang; |
774 | 707 |
775 // Getting the accepted languages list | 708 // Getting the accepted languages list |
(...skipping 22 matching lines...) Expand all Loading... | |
798 // reason so we are more aggressive showing the shortcuts for never translate. | 731 // reason so we are more aggressive showing the shortcuts for never translate. |
799 #if defined(OS_ANDROID) | 732 #if defined(OS_ANDROID) |
800 config.never_translate_min_count = 1; | 733 config.never_translate_min_count = 1; |
801 #else | 734 #else |
802 config.never_translate_min_count = 3; | 735 config.never_translate_min_count = 3; |
803 #endif // defined(OS_ANDROID) | 736 #endif // defined(OS_ANDROID) |
804 | 737 |
805 config.always_translate_min_count = 3; | 738 config.always_translate_min_count = 3; |
806 return config; | 739 return config; |
807 } | 740 } |
OLD | NEW |