Home | History | Annotate | Download | only in ui
      1 // Copyright (c) 2012 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_UI_BROWSER_COMMAND_CONTROLLER_H_
      6 #define CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/prefs/pref_change_registrar.h"
     11 #include "base/prefs/pref_member.h"
     12 #include "chrome/browser/command_updater.h"
     13 #include "chrome/browser/command_updater_delegate.h"
     14 #include "chrome/browser/sessions/tab_restore_service_observer.h"
     15 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
     16 #include "ui/base/window_open_disposition.h"
     17 
     18 class Browser;
     19 class BrowserWindow;
     20 class Profile;
     21 
     22 namespace content {
     23 struct NativeWebKeyboardEvent;
     24 }
     25 
     26 namespace chrome {
     27 
     28 class BrowserCommandController : public CommandUpdaterDelegate,
     29                                  public TabStripModelObserver,
     30                                  public TabRestoreServiceObserver {
     31  public:
     32   explicit BrowserCommandController(Browser* browser);
     33   virtual ~BrowserCommandController();
     34 
     35   CommandUpdater* command_updater() { return &command_updater_; }
     36   bool block_command_execution() const { return block_command_execution_; }
     37 
     38   // Returns true if |command_id| is a reserved command whose keyboard shortcuts
     39   // should not be sent to the renderer or |event| was triggered by a key that
     40   // we never want to send to the renderer.
     41   bool IsReservedCommandOrKey(int command_id,
     42                               const content::NativeWebKeyboardEvent& event);
     43 
     44   // Sets if command execution shall be blocked. If |block| is true then
     45   // following calls to ExecuteCommand() or ExecuteCommandWithDisposition()
     46   // method will not execute the command, and the last blocked command will be
     47   // recorded for retrieval.
     48   void SetBlockCommandExecution(bool block);
     49 
     50   // Gets the last blocked command after calling SetBlockCommandExecution(true).
     51   // Returns the command id or -1 if there is no command blocked. The
     52   // disposition type of the command will be stored in |*disposition| if it's
     53   // not NULL.
     54   int GetLastBlockedCommand(WindowOpenDisposition* disposition);
     55 
     56   // Notifies the controller that state has changed in one of the following
     57   // areas and it should update command states.
     58   void TabStateChanged();
     59   void ContentRestrictionsChanged();
     60   void FullscreenStateChanged();
     61   void PrintingStateChanged();
     62   void LoadingStateChanged(bool is_loading, bool force);
     63 
     64   // Shared state updating: these functions are static and public to share with
     65   // outside code.
     66 
     67   // Updates the open-file state.
     68   static void UpdateOpenFileState(CommandUpdater* command_updater);
     69 
     70   // Update commands whose state depends on incognito mode availability and that
     71   // only depend on the profile.
     72   static void UpdateSharedCommandsForIncognitoAvailability(
     73       CommandUpdater* command_updater,
     74       Profile* profile);
     75 
     76  private:
     77   class InterstitialObserver;
     78 
     79   // Overridden from CommandUpdaterDelegate:
     80   virtual void ExecuteCommandWithDisposition(
     81       int id,
     82       WindowOpenDisposition disposition) OVERRIDE;
     83 
     84   // Overridden from TabStripModelObserver:
     85   virtual void TabInsertedAt(content::WebContents* contents,
     86                              int index,
     87                              bool foreground) OVERRIDE;
     88   virtual void TabDetachedAt(content::WebContents* contents,
     89                              int index) OVERRIDE;
     90   virtual void TabReplacedAt(TabStripModel* tab_strip_model,
     91                              content::WebContents* old_contents,
     92                              content::WebContents* new_contents,
     93                              int index) OVERRIDE;
     94   virtual void TabBlockedStateChanged(content::WebContents* contents,
     95                                       int index) OVERRIDE;
     96 
     97   // Overridden from TabRestoreServiceObserver:
     98   virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE;
     99   virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE;
    100 
    101   // Returns true if the regular Chrome UI (not the fullscreen one and
    102   // not the single-tab one) is shown. Used for updating window command states
    103   // only. Consider using SupportsWindowFeature if you need the mentioned
    104   // functionality anywhere else.
    105   bool IsShowingMainUI();
    106 
    107   // Initialize state for all browser commands.
    108   void InitCommandState();
    109 
    110   // Update commands whose state depends on incognito mode availability.
    111   void UpdateCommandsForIncognitoAvailability();
    112 
    113   // Update commands whose state depends on the tab's state.
    114   void UpdateCommandsForTabState();
    115 
    116   // Updates commands when the content's restrictions change.
    117   void UpdateCommandsForContentRestrictionState();
    118 
    119   // Updates commands for enabling developer tools.
    120   void UpdateCommandsForDevTools();
    121 
    122   // Updates commands for bookmark editing.
    123   void UpdateCommandsForBookmarkEditing();
    124 
    125   // Updates commands that affect the bookmark bar.
    126   void UpdateCommandsForBookmarkBar();
    127 
    128   // Updates commands that affect file selection dialogs in aggregate,
    129   // namely the save-page-as state and the open-file state.
    130   void UpdateCommandsForFileSelectionDialogs();
    131 
    132   // Update commands whose state depends on the type of fullscreen mode the
    133   // window is in.
    134   void UpdateCommandsForFullscreenMode();
    135 
    136   // Updates the printing command state.
    137   void UpdatePrintingState();
    138 
    139   // Updates the SHOW_SYNC_SETUP menu entry.
    140   void OnSigninAllowedPrefChange();
    141 
    142   // Updates the save-page-as command state.
    143   void UpdateSaveAsState();
    144 
    145   // Updates the show-sync command state.
    146   void UpdateShowSyncState(bool show_main_ui);
    147 
    148   // Ask the Reload/Stop button to change its icon, and update the Stop command
    149   // state.  |is_loading| is true if the current WebContents is loading.
    150   // |force| is true if the button should change its icon immediately.
    151   void UpdateReloadStopState(bool is_loading, bool force);
    152 
    153   // Updates commands for find.
    154   void UpdateCommandsForFind();
    155 
    156   // Add/remove observers for interstitial attachment/detachment from
    157   // |contents|.
    158   void AddInterstitialObservers(content::WebContents* contents);
    159   void RemoveInterstitialObservers(content::WebContents* contents);
    160 
    161   inline BrowserWindow* window();
    162   inline Profile* profile();
    163 
    164   Browser* browser_;
    165 
    166   // The CommandUpdater that manages the browser window commands.
    167   CommandUpdater command_updater_;
    168 
    169   // Indicates if command execution is blocked.
    170   bool block_command_execution_;
    171 
    172   // Stores the last blocked command id when |block_command_execution_| is true.
    173   int last_blocked_command_id_;
    174 
    175   // Stores the disposition type of the last blocked command.
    176   WindowOpenDisposition last_blocked_command_disposition_;
    177 
    178   std::vector<InterstitialObserver*> interstitial_observers_;
    179 
    180   PrefChangeRegistrar profile_pref_registrar_;
    181   PrefChangeRegistrar local_pref_registrar_;
    182   BooleanPrefMember pref_signin_allowed_;
    183 
    184   DISALLOW_COPY_AND_ASSIGN(BrowserCommandController);
    185 };
    186 
    187 }  // namespace chrome
    188 
    189 #endif  // CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
    190