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 #ifndef CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_H_
      6 #define CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 
     12 class LanguageStateObserver;
     13 
     14 namespace content {
     15 struct LoadCommittedDetails;
     16 class NavigationController;
     17 class WebContents;
     18 }
     19 
     20 // This class holds the language state of the current page.
     21 // There is one LanguageState instance per WebContents.
     22 // It is used to determine when navigating to a new page whether it should
     23 // automatically be translated.
     24 // This auto-translate behavior is the expected behavior when:
     25 // - user is on page in language A that they had translated to language B.
     26 // - user clicks a link in that page that takes them to a page also in language
     27 //   A.
     28 
     29 class LanguageState {
     30  public:
     31   explicit LanguageState(content::NavigationController* nav_controller);
     32   ~LanguageState();
     33 
     34   // Should be called when the page did a new navigation (whether it is a main
     35   // frame or sub-frame navigation).
     36   void DidNavigate(const content::LoadCommittedDetails& details);
     37 
     38   // Should be called when the language of the page has been determined.
     39   // |page_needs_translation| when false indicates that the browser should not
     40   // offer to translate the page.
     41   void LanguageDetermined(const std::string& page_language,
     42                           bool page_needs_translation);
     43 
     44   // Returns the language the current page should be translated to, based on the
     45   // previous page languages and the transition.  This should be called after
     46   // the language page has been determined.
     47   // Returns an empty string if the page should not be auto-translated.
     48   std::string AutoTranslateTo() const;
     49 
     50   // Returns true if the user is navigating through translated links.
     51   bool InTranslateNavigation() const;
     52 
     53   // Returns true if the current page in the associated tab has been translated.
     54   bool IsPageTranslated() const { return original_lang_ != current_lang_; }
     55 
     56   const std::string& original_language() const { return original_lang_; }
     57 
     58   void SetCurrentLanguage(const std::string& language);
     59   const std::string& current_language() const { return current_lang_; }
     60 
     61   bool page_needs_translation() const { return page_needs_translation_; }
     62 
     63   // Whether the page is currently in the process of being translated.
     64   bool translation_pending() const { return translation_pending_; }
     65   void set_translation_pending(bool value) { translation_pending_ = value; }
     66 
     67   // Whether the user has already declined to translate the page.
     68   bool translation_declined() const { return translation_declined_; }
     69   void set_translation_declined(bool value) { translation_declined_ = value; }
     70 
     71   // Whether the current page was navigated through an in-page (fragment)
     72   // navigation.
     73   bool in_page_navigation() const { return in_page_navigation_; }
     74 
     75   // Whether the translate is enabled. This value is supposed to be used for the
     76   // Translate icon on the Omnibox.
     77   bool translate_enabled() const { return translate_enabled_; }
     78   void SetTranslateEnabled(bool value);
     79 
     80   // Whether the current page's language is different from the previous
     81   // language.
     82   bool HasLanguageChanged() const;
     83 
     84   void set_observer(LanguageStateObserver* observer) { observer_ = observer; }
     85 
     86  private:
     87   void SetIsPageTranslated(bool value);
     88 
     89   // Whether the page is translated or not.
     90   bool is_page_translated_;
     91 
     92   // The languages this page is in. Note that current_lang_ is different from
     93   // original_lang_ when the page has been translated.
     94   // Note that these might be empty if the page language has not been determined
     95   // yet.
     96   std::string original_lang_;
     97   std::string current_lang_;
     98 
     99   // Same as above but for the previous page.
    100   std::string prev_original_lang_;
    101   std::string prev_current_lang_;
    102 
    103   // The navigation controller of the tab we are associated with.
    104   content::NavigationController* navigation_controller_;
    105 
    106   // Whether it is OK to offer to translate the page.  Some pages explictly
    107   // specify that they should not be translated by the browser (this is the case
    108   // for GMail for example, which provides its own translation features).
    109   bool page_needs_translation_;
    110 
    111   // Whether a translation is currently pending (WebContents waiting for the
    112   // PAGE_TRANSLATED notification).  This is needed to avoid sending duplicate
    113   // translate requests to a page.  TranslateManager initiates translations
    114   // when it received the LANGUAGE_DETERMINED notification.  This is sent by
    115   // the renderer with the page contents, every time the load stops for the
    116   // main frame, so we may get several.
    117   // TODO(jcampan): make the renderer send the language just once per navigation
    118   //                then we can get rid of that state.
    119   bool translation_pending_;
    120 
    121   // Whether the user has declined to translate the page (by closing the infobar
    122   // for example).  This is necessary as a new infobar could be shown if a new
    123   // load happens in the page after the user closed the infobar.
    124   bool translation_declined_;
    125 
    126   // Whether the current navigation is a fragment navigation (in page).
    127   bool in_page_navigation_;
    128 
    129   // Whether the Translate is enabled.
    130   bool translate_enabled_;
    131 
    132   LanguageStateObserver* observer_;
    133 
    134   DISALLOW_COPY_AND_ASSIGN(LanguageState);
    135 };
    136 
    137 #endif  // CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_H_
    138