1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/tab_contents/language_state.h" 6 7 #include "content/public/browser/navigation_controller.h" 8 #include "content/public/browser/navigation_details.h" 9 #include "content/public/browser/navigation_entry.h" 10 11 using content::NavigationController; 12 13 LanguageState::LanguageState(NavigationController* nav_controller) 14 : navigation_controller_(nav_controller), 15 page_needs_translation_(false), 16 translation_pending_(false), 17 translation_declined_(false), 18 in_page_navigation_(false) { 19 } 20 21 LanguageState::~LanguageState() { 22 } 23 24 void LanguageState::DidNavigate( 25 const content::LoadCommittedDetails& details) { 26 in_page_navigation_ = details.is_in_page; 27 if (in_page_navigation_ || !details.is_main_frame) 28 return; // Don't reset our states, the page has not changed. 29 30 bool reload = 31 details.entry->GetTransitionType() == content::PAGE_TRANSITION_RELOAD || 32 details.type == content::NAVIGATION_TYPE_SAME_PAGE; 33 if (reload) { 34 // We might not get a LanguageDetermined notifications on reloads. Make sure 35 // to keep the original language and to set current_lang_ so 36 // IsPageTranslated() returns false. 37 current_lang_ = original_lang_; 38 } else { 39 prev_original_lang_ = original_lang_; 40 prev_current_lang_ = current_lang_; 41 original_lang_.clear(); 42 current_lang_.clear(); 43 } 44 45 translation_pending_ = false; 46 translation_declined_ = false; 47 } 48 49 void LanguageState::LanguageDetermined(const std::string& page_language, 50 bool page_needs_translation) { 51 if (in_page_navigation_ && !original_lang_.empty()) { 52 // In-page navigation, we don't expect our states to change. 53 // Note that we'll set the languages if original_lang_ is empty. This might 54 // happen if the we did not get called on the top-page. 55 return; 56 } 57 page_needs_translation_ = page_needs_translation; 58 original_lang_ = page_language; 59 current_lang_ = page_language; 60 } 61 62 bool LanguageState::InTranslateNavigation() const { 63 // The user is in the same translate session if 64 // - no translation is pending 65 // - this page is in the same language as the previous page 66 // - the previous page had been translated 67 // - the new page was navigated through a link. 68 return 69 !translation_pending_ && 70 prev_original_lang_ == original_lang_ && 71 prev_original_lang_ != prev_current_lang_ && 72 navigation_controller_->GetActiveEntry() && 73 navigation_controller_->GetActiveEntry()->GetTransitionType() == 74 content::PAGE_TRANSITION_LINK; 75 } 76 77 78 std::string LanguageState::AutoTranslateTo() const { 79 if (InTranslateNavigation() && 80 // The page is not yet translated. 81 original_lang_ == current_lang_ ) { 82 return prev_current_lang_; 83 } 84 85 return std::string(); 86 } 87