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

Side by Side Diff: trunk/src/chrome/browser/translate/translate_tab_helper.cc

Issue 296003014: Revert 272217 "LanguageState should be owned by TranslateManager" (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « trunk/src/chrome/browser/translate/translate_tab_helper.h ('k') | trunk/src/chrome/browser/ui/browser_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698