Home | History | Annotate | Download | only in tab_contents
      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 "chrome/browser/tab_contents/language_state_observer.h"
      8 #include "content/public/browser/navigation_controller.h"
      9 #include "content/public/browser/navigation_details.h"
     10 #include "content/public/browser/navigation_entry.h"
     11 #include "content/public/browser/web_contents.h"
     12 
     13 using content::NavigationController;
     14 
     15 LanguageState::LanguageState(NavigationController* nav_controller)
     16     : is_page_translated_(false),
     17       navigation_controller_(nav_controller),
     18       page_needs_translation_(false),
     19       translation_pending_(false),
     20       translation_declined_(false),
     21       in_page_navigation_(false),
     22       translate_enabled_(false),
     23       observer_(NULL) {
     24 }
     25 
     26 LanguageState::~LanguageState() {
     27 }
     28 
     29 void LanguageState::DidNavigate(
     30     const content::LoadCommittedDetails& details) {
     31   in_page_navigation_ = details.is_in_page;
     32   if (in_page_navigation_ || !details.is_main_frame)
     33     return;  // Don't reset our states, the page has not changed.
     34 
     35   bool reload =
     36       details.entry->GetTransitionType() == content::PAGE_TRANSITION_RELOAD ||
     37       details.type == content::NAVIGATION_TYPE_SAME_PAGE;
     38   if (reload) {
     39     // We might not get a LanguageDetermined notifications on reloads. Make sure
     40     // to keep the original language and to set current_lang_ so
     41     // IsPageTranslated() returns false.
     42     current_lang_ = original_lang_;
     43   } else {
     44     prev_original_lang_ = original_lang_;
     45     prev_current_lang_ = current_lang_;
     46     original_lang_.clear();
     47     current_lang_.clear();
     48   }
     49 
     50   SetIsPageTranslated(false);
     51 
     52   translation_pending_ = false;
     53   translation_declined_ = false;
     54 
     55   SetTranslateEnabled(false);
     56 }
     57 
     58 void LanguageState::LanguageDetermined(const std::string& page_language,
     59                                        bool page_needs_translation) {
     60   if (in_page_navigation_ && !original_lang_.empty()) {
     61     // In-page navigation, we don't expect our states to change.
     62     // Note that we'll set the languages if original_lang_ is empty.  This might
     63     // happen if the we did not get called on the top-page.
     64     return;
     65   }
     66   page_needs_translation_ = page_needs_translation;
     67   original_lang_ = page_language;
     68   current_lang_ = page_language;
     69   SetIsPageTranslated(false);
     70 }
     71 
     72 bool LanguageState::InTranslateNavigation() const {
     73   // The user is in the same translate session if
     74   //   - no translation is pending
     75   //   - this page is in the same language as the previous page
     76   //   - the previous page had been translated
     77   //   - the new page was navigated through a link.
     78   return
     79       !translation_pending_ &&
     80       prev_original_lang_ == original_lang_ &&
     81       prev_original_lang_ != prev_current_lang_ &&
     82       navigation_controller_ &&
     83       navigation_controller_->GetActiveEntry() &&
     84       navigation_controller_->GetActiveEntry()->GetTransitionType() ==
     85           content::PAGE_TRANSITION_LINK;
     86 }
     87 
     88 void LanguageState::SetCurrentLanguage(const std::string& language) {
     89   current_lang_ = language;
     90   SetIsPageTranslated(current_lang_ != original_lang_);
     91 }
     92 
     93 std::string LanguageState::AutoTranslateTo() const {
     94   if (InTranslateNavigation() && !is_page_translated_)
     95     return prev_current_lang_;
     96 
     97   return std::string();
     98 }
     99 
    100 void LanguageState::SetTranslateEnabled(bool value) {
    101   if (translate_enabled_ == value)
    102     return;
    103 
    104   translate_enabled_ = value;
    105   if (observer_) {
    106     content::WebContents* web_contents =
    107         navigation_controller_->GetWebContents();
    108     observer_->OnTranslateEnabledChanged(web_contents);
    109   }
    110 }
    111 
    112 bool LanguageState::HasLanguageChanged() const {
    113   return original_lang_ != prev_original_lang_;
    114 }
    115 
    116 void LanguageState::SetIsPageTranslated(bool value) {
    117   if (is_page_translated_ == value)
    118     return;
    119 
    120   is_page_translated_ = value;
    121   if (observer_) {
    122     content::WebContents* web_contents =
    123         navigation_controller_->GetWebContents();
    124     observer_->OnIsPageTranslatedChanged(web_contents);
    125   }
    126 
    127   // With the translation done, the translate feature must be enabled.
    128   if (is_page_translated_)
    129     SetTranslateEnabled(true);
    130 }
    131