OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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_tab_helper.h" | 5 #include "chrome/browser/translate/translate_tab_helper.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
11 #include "base/strings/string_split.h" | 11 #include "base/strings/string_split.h" |
12 #include "chrome/browser/chrome_notification_types.h" | 12 #include "chrome/browser/chrome_notification_types.h" |
13 #include "chrome/browser/infobars/infobar_service.h" | 13 #include "chrome/browser/infobars/infobar_service.h" |
14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
15 #include "chrome/browser/translate/translate_accept_languages_factory.h" | 15 #include "chrome/browser/translate/translate_accept_languages_factory.h" |
16 #include "chrome/browser/translate/translate_infobar_delegate.h" | 16 #include "chrome/browser/translate/translate_infobar_delegate.h" |
17 #include "chrome/browser/translate/translate_service.h" | 17 #include "chrome/browser/translate/translate_service.h" |
18 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
19 #include "chrome/browser/ui/browser_finder.h" | 19 #include "chrome/browser/ui/browser_finder.h" |
20 #include "chrome/browser/ui/browser_tabstrip.h" | 20 #include "chrome/browser/ui/browser_tabstrip.h" |
21 #include "chrome/browser/ui/browser_window.h" | 21 #include "chrome/browser/ui/browser_window.h" |
22 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 22 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
23 #include "chrome/browser/ui/translate/translate_bubble_factory.h" | 23 #include "chrome/browser/ui/translate/translate_bubble_factory.h" |
24 #include "chrome/common/pref_names.h" | 24 #include "chrome/common/pref_names.h" |
25 #include "components/translate/content/common/translate_messages.h" | 25 #include "components/translate/content/common/translate_messages.h" |
26 #include "components/translate/core/browser/language_state.h" | |
27 #include "components/translate/core/browser/page_translated_details.h" | 26 #include "components/translate/core/browser/page_translated_details.h" |
28 #include "components/translate/core/browser/translate_accept_languages.h" | 27 #include "components/translate/core/browser/translate_accept_languages.h" |
29 #include "components/translate/core/browser/translate_download_manager.h" | 28 #include "components/translate/core/browser/translate_download_manager.h" |
30 #include "components/translate/core/browser/translate_manager.h" | 29 #include "components/translate/core/browser/translate_manager.h" |
31 #include "components/translate/core/browser/translate_prefs.h" | 30 #include "components/translate/core/browser/translate_prefs.h" |
32 #include "components/translate/core/common/language_detection_details.h" | 31 #include "components/translate/core/common/language_detection_details.h" |
33 #include "content/public/browser/navigation_details.h" | 32 #include "content/public/browser/navigation_details.h" |
34 #include "content/public/browser/navigation_entry.h" | 33 #include "content/public/browser/navigation_entry.h" |
35 #include "content/public/browser/notification_service.h" | 34 #include "content/public/browser/notification_service.h" |
36 #include "content/public/browser/render_view_host.h" | 35 #include "content/public/browser/render_view_host.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 : content::WebContentsObserver(web_contents), | 73 : content::WebContentsObserver(web_contents), |
75 max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts), | 74 max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts), |
76 translate_driver_(&web_contents->GetController()), | 75 translate_driver_(&web_contents->GetController()), |
77 translate_manager_(new TranslateManager(this, prefs::kAcceptLanguages)), | 76 translate_manager_(new TranslateManager(this, prefs::kAcceptLanguages)), |
78 weak_pointer_factory_(this) {} | 77 weak_pointer_factory_(this) {} |
79 | 78 |
80 TranslateTabHelper::~TranslateTabHelper() { | 79 TranslateTabHelper::~TranslateTabHelper() { |
81 } | 80 } |
82 | 81 |
83 LanguageState& TranslateTabHelper::GetLanguageState() { | 82 LanguageState& TranslateTabHelper::GetLanguageState() { |
84 return translate_manager_->GetLanguageState(); | 83 return translate_driver_.GetLanguageState(); |
85 } | 84 } |
86 | 85 |
87 // static | 86 // static |
88 scoped_ptr<TranslatePrefs> TranslateTabHelper::CreateTranslatePrefs( | 87 scoped_ptr<TranslatePrefs> TranslateTabHelper::CreateTranslatePrefs( |
89 PrefService* prefs) { | 88 PrefService* prefs) { |
90 #if defined(OS_CHROMEOS) | 89 #if defined(OS_CHROMEOS) |
91 const char* preferred_languages_prefs = prefs::kLanguagePreferredLanguages; | 90 const char* preferred_languages_prefs = prefs::kLanguagePreferredLanguages; |
92 #else | 91 #else |
93 const char* preferred_languages_prefs = NULL; | 92 const char* preferred_languages_prefs = NULL; |
94 #endif | 93 #endif |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 } | 260 } |
262 | 261 |
263 // If the navigation happened while offline don't show the translate | 262 // If the navigation happened while offline don't show the translate |
264 // bar since there will be nothing to translate. | 263 // bar since there will be nothing to translate. |
265 if (load_details.http_status_code == 0 || | 264 if (load_details.http_status_code == 0 || |
266 load_details.http_status_code == net::HTTP_INTERNAL_SERVER_ERROR) { | 265 load_details.http_status_code == net::HTTP_INTERNAL_SERVER_ERROR) { |
267 return; | 266 return; |
268 } | 267 } |
269 | 268 |
270 if (!load_details.is_main_frame && | 269 if (!load_details.is_main_frame && |
271 GetLanguageState().translation_declined()) { | 270 translate_driver_.GetLanguageState().translation_declined()) { |
272 // Some sites (such as Google map) may trigger sub-frame navigations | 271 // Some sites (such as Google map) may trigger sub-frame navigations |
273 // when the user interacts with the page. We don't want to show a new | 272 // when the user interacts with the page. We don't want to show a new |
274 // infobar if the user already dismissed one in that case. | 273 // infobar if the user already dismissed one in that case. |
275 return; | 274 return; |
276 } | 275 } |
277 | 276 |
278 // If not a reload, return. | 277 // If not a reload, return. |
279 if (entry->GetTransitionType() != content::PAGE_TRANSITION_RELOAD && | 278 if (entry->GetTransitionType() != content::PAGE_TRANSITION_RELOAD && |
280 load_details.type != content::NAVIGATION_TYPE_SAME_PAGE) { | 279 load_details.type != content::NAVIGATION_TYPE_SAME_PAGE) { |
281 return; | 280 return; |
282 } | 281 } |
283 | 282 |
284 if (!GetLanguageState().page_needs_translation()) | 283 if (!translate_driver_.GetLanguageState().page_needs_translation()) |
285 return; | 284 return; |
286 | 285 |
287 // Note that we delay it as the ordering of the processing of this callback | 286 // Note that we delay it as the ordering of the processing of this callback |
288 // by WebContentsObservers is undefined and might result in the current | 287 // by WebContentsObservers is undefined and might result in the current |
289 // infobars being removed. Since the translation initiation process might add | 288 // infobars being removed. Since the translation initiation process might add |
290 // an infobar, it must be done after that. | 289 // an infobar, it must be done after that. |
291 base::MessageLoop::current()->PostTask( | 290 base::MessageLoop::current()->PostTask( |
292 FROM_HERE, | 291 FROM_HERE, |
293 base::Bind(&TranslateTabHelper::InitiateTranslation, | 292 base::Bind(&TranslateTabHelper::InitiateTranslation, |
294 weak_pointer_factory_.GetWeakPtr(), | 293 weak_pointer_factory_.GetWeakPtr(), |
295 GetLanguageState().original_language(), | 294 translate_driver_.GetLanguageState().original_language(), |
296 0)); | 295 0)); |
297 } | 296 } |
298 | 297 |
299 void TranslateTabHelper::DidNavigateAnyFrame( | 298 void TranslateTabHelper::DidNavigateAnyFrame( |
300 const content::LoadCommittedDetails& details, | 299 const content::LoadCommittedDetails& details, |
301 const content::FrameNavigateParams& params) { | 300 const content::FrameNavigateParams& params) { |
302 // Let the LanguageState clear its state. | 301 // Let the LanguageState clear its state. |
303 const bool reload = | 302 translate_driver_.DidNavigate(details); |
304 details.entry->GetTransitionType() == content::PAGE_TRANSITION_RELOAD || | |
305 details.type == content::NAVIGATION_TYPE_SAME_PAGE; | |
306 GetLanguageState().DidNavigate( | |
307 details.is_in_page, details.is_main_frame, reload); | |
308 } | 303 } |
309 | 304 |
310 void TranslateTabHelper::WebContentsDestroyed() { | 305 void TranslateTabHelper::WebContentsDestroyed() { |
311 // Translation process can be interrupted. | 306 // Translation process can be interrupted. |
312 // Destroying the TranslateManager now guarantees that it never has to deal | 307 // Destroying the TranslateManager now guarantees that it never has to deal |
313 // with NULL WebContents. | 308 // with NULL WebContents. |
314 translate_manager_.reset(); | 309 translate_manager_.reset(); |
315 } | 310 } |
316 | 311 |
317 #if defined(CLD2_DYNAMIC_MODE) | 312 #if defined(CLD2_DYNAMIC_MODE) |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 s_cached_data_offset_ = data_offset; | 438 s_cached_data_offset_ = data_offset; |
444 s_cached_data_length_ = data_length; | 439 s_cached_data_length_ = data_length; |
445 } | 440 } |
446 } | 441 } |
447 } | 442 } |
448 | 443 |
449 #endif // defined(CLD2_DYNAMIC_MODE) | 444 #endif // defined(CLD2_DYNAMIC_MODE) |
450 | 445 |
451 void TranslateTabHelper::InitiateTranslation(const std::string& page_lang, | 446 void TranslateTabHelper::InitiateTranslation(const std::string& page_lang, |
452 int attempt) { | 447 int attempt) { |
453 if (GetLanguageState().translation_pending()) | 448 if (translate_driver_.GetLanguageState().translation_pending()) |
454 return; | 449 return; |
455 | 450 |
456 // During a reload we need web content to be available before the | 451 // During a reload we need web content to be available before the |
457 // translate script is executed. Otherwise we will run the translate script on | 452 // translate script is executed. Otherwise we will run the translate script on |
458 // an empty DOM which will fail. Therefore we wait a bit to see if the page | 453 // an empty DOM which will fail. Therefore we wait a bit to see if the page |
459 // has finished. | 454 // has finished. |
460 if (web_contents()->IsLoading() && attempt < max_reload_check_attempts_) { | 455 if (web_contents()->IsLoading() && attempt < max_reload_check_attempts_) { |
461 int backoff = attempt * kMaxTranslateLoadCheckAttempts; | 456 int backoff = attempt * kMaxTranslateLoadCheckAttempts; |
462 base::MessageLoop::current()->PostDelayedTask( | 457 base::MessageLoop::current()->PostDelayedTask( |
463 FROM_HERE, | 458 FROM_HERE, |
464 base::Bind(&TranslateTabHelper::InitiateTranslation, | 459 base::Bind(&TranslateTabHelper::InitiateTranslation, |
465 weak_pointer_factory_.GetWeakPtr(), | 460 weak_pointer_factory_.GetWeakPtr(), |
466 page_lang, | 461 page_lang, |
467 ++attempt), | 462 ++attempt), |
468 base::TimeDelta::FromMilliseconds(backoff)); | 463 base::TimeDelta::FromMilliseconds(backoff)); |
469 return; | 464 return; |
470 } | 465 } |
471 | 466 |
472 translate_manager_->InitiateTranslation( | 467 translate_manager_->InitiateTranslation( |
473 TranslateDownloadManager::GetLanguageCode(page_lang)); | 468 TranslateDownloadManager::GetLanguageCode(page_lang)); |
474 } | 469 } |
475 | 470 |
476 void TranslateTabHelper::OnLanguageDetermined( | 471 void TranslateTabHelper::OnLanguageDetermined( |
477 const LanguageDetectionDetails& details, | 472 const LanguageDetectionDetails& details, |
478 bool page_needs_translation) { | 473 bool page_needs_translation) { |
479 GetLanguageState().LanguageDetermined( | 474 translate_driver_.GetLanguageState().LanguageDetermined( |
480 details.adopted_language, page_needs_translation); | 475 details.adopted_language, page_needs_translation); |
481 | 476 |
482 if (web_contents()) | 477 if (web_contents()) |
483 translate_manager_->InitiateTranslation(details.adopted_language); | 478 translate_manager_->InitiateTranslation(details.adopted_language); |
484 | 479 |
485 content::NotificationService::current()->Notify( | 480 content::NotificationService::current()->Notify( |
486 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, | 481 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, |
487 content::Source<content::WebContents>(web_contents()), | 482 content::Source<content::WebContents>(web_contents()), |
488 content::Details<const LanguageDetectionDetails>(&details)); | 483 content::Details<const LanguageDetectionDetails>(&details)); |
489 } | 484 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 if (GetLanguageState().InTranslateNavigation()) | 533 if (GetLanguageState().InTranslateNavigation()) |
539 return; | 534 return; |
540 } | 535 } |
541 | 536 |
542 TranslateBubbleFactory::Show( | 537 TranslateBubbleFactory::Show( |
543 browser->window(), web_contents(), step, error_type); | 538 browser->window(), web_contents(), step, error_type); |
544 #else | 539 #else |
545 NOTREACHED(); | 540 NOTREACHED(); |
546 #endif | 541 #endif |
547 } | 542 } |
OLD | NEW |