1 // Copyright 2014 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 "components/translate/core/browser/language_state.h" 6 7 #include "base/logging.h" 8 #include "components/translate/core/browser/translate_driver.h" 9 10 namespace translate { 11 12 LanguageState::LanguageState(TranslateDriver* driver) 13 : is_page_translated_(false), 14 translate_driver_(driver), 15 page_needs_translation_(false), 16 translation_pending_(false), 17 translation_declined_(false), 18 in_page_navigation_(false), 19 translate_enabled_(false) { 20 DCHECK(translate_driver_); 21 } 22 23 LanguageState::~LanguageState() { 24 } 25 26 void LanguageState::DidNavigate(bool in_page_navigation, 27 bool is_main_frame, 28 bool reload) { 29 in_page_navigation_ = in_page_navigation; 30 if (in_page_navigation_ || !is_main_frame) 31 return; // Don't reset our states, the page has not changed. 32 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 SetIsPageTranslated(false); 46 47 translation_pending_ = false; 48 translation_declined_ = false; 49 50 SetTranslateEnabled(false); 51 } 52 53 void LanguageState::LanguageDetermined(const std::string& page_language, 54 bool page_needs_translation) { 55 if (in_page_navigation_ && !original_lang_.empty()) { 56 // In-page navigation, we don't expect our states to change. 57 // Note that we'll set the languages if original_lang_ is empty. This might 58 // happen if the we did not get called on the top-page. 59 return; 60 } 61 page_needs_translation_ = page_needs_translation; 62 original_lang_ = page_language; 63 current_lang_ = page_language; 64 SetIsPageTranslated(false); 65 } 66 67 bool LanguageState::InTranslateNavigation() const { 68 // The user is in the same translate session if 69 // - no translation is pending 70 // - this page is in the same language as the previous page 71 // - the previous page had been translated 72 // - the new page was navigated through a link. 73 return 74 !translation_pending_ && 75 prev_original_lang_ == original_lang_ && 76 prev_original_lang_ != prev_current_lang_ && 77 translate_driver_->IsLinkNavigation(); 78 } 79 80 void LanguageState::SetCurrentLanguage(const std::string& language) { 81 current_lang_ = language; 82 SetIsPageTranslated(current_lang_ != original_lang_); 83 } 84 85 std::string LanguageState::AutoTranslateTo() const { 86 if (InTranslateNavigation() && !is_page_translated_) 87 return prev_current_lang_; 88 89 return std::string(); 90 } 91 92 void LanguageState::SetTranslateEnabled(bool value) { 93 if (translate_enabled_ == value) 94 return; 95 96 translate_enabled_ = value; 97 translate_driver_->OnTranslateEnabledChanged(); 98 } 99 100 bool LanguageState::HasLanguageChanged() const { 101 return original_lang_ != prev_original_lang_; 102 } 103 104 void LanguageState::SetIsPageTranslated(bool value) { 105 if (is_page_translated_ == value) 106 return; 107 108 is_page_translated_ = value; 109 translate_driver_->OnIsPageTranslatedChanged(); 110 111 // With the translation done, the translate feature must be enabled. 112 if (is_page_translated_) 113 SetTranslateEnabled(true); 114 } 115 116 } // namespace translate 117