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 "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