15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/command_updater_delegate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_observer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserWindow;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NativeWebKeyboardEvent;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserCommandController : public CommandUpdaterDelegate,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 public TabStripModelObserver,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 public TabRestoreServiceObserver {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit BrowserCommandController(Browser* browser);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserCommandController();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater() { return &command_updater_; }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool block_command_execution() const { return block_command_execution_; }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if |command_id| is a reserved command whose keyboard shortcuts
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should not be sent to the renderer or |event| was triggered by a key that
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we never want to send to the renderer.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsReservedCommandOrKey(int command_id,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const content::NativeWebKeyboardEvent& event);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets if command execution shall be blocked. If |block| is true then
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // following calls to ExecuteCommand() or ExecuteCommandWithDisposition()
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method will not execute the command, and the last blocked command will be
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recorded for retrieval.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBlockCommandExecution(bool block);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the last blocked command after calling SetBlockCommandExecution(true).
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the command id or -1 if there is no command blocked. The
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition type of the command will be stored in |*disposition| if it's
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not NULL.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetLastBlockedCommand(WindowOpenDisposition* disposition);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the controller that state has changed in one of the following
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // areas and it should update command states.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TabStateChanged();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ContentRestrictionsChanged();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FullscreenStateChanged();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintingStateChanged();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadingStateChanged(bool is_loading, bool force);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shared state updating: these functions are static and public to share with
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // outside code.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the open-file state.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void UpdateOpenFileState(CommandUpdater* command_updater);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update commands whose state depends on incognito mode availability and that
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // only depend on the profile.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void UpdateSharedCommandsForIncognitoAvailability(
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CommandUpdater* command_updater,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile* profile);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class InterstitialObserver;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from CommandUpdaterDelegate:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExecuteCommandWithDisposition(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int id,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WindowOpenDisposition disposition) OVERRIDE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from TabStripModelObserver:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabInsertedAt(content::WebContents* contents,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int index,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool foreground) OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabDetachedAt(content::WebContents* contents,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int index) OVERRIDE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabReplacedAt(TabStripModel* tab_strip_model,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             content::WebContents* old_contents,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             content::WebContents* new_contents,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int index) OVERRIDE;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TabBlockedStateChanged(content::WebContents* contents,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      int index) OVERRIDE;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from TabRestoreServiceObserver:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the regular Chrome UI (not the fullscreen one and
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not the single-tab one) is shown. Used for updating window command states
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only. Consider using SupportsWindowFeature if you need the mentioned
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // functionality anywhere else.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsShowingMainUI();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize state for all browser commands.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitCommandState();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update commands whose state depends on incognito mode availability.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCommandsForIncognitoAvailability();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update commands whose state depends on the tab's state.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCommandsForTabState();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates commands when the content's restrictions change.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCommandsForContentRestrictionState();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates commands for enabling developer tools.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCommandsForDevTools();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates commands for bookmark editing.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCommandsForBookmarkEditing();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates commands that affect the bookmark bar.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCommandsForBookmarkBar();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates commands that affect file selection dialogs in aggregate,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // namely the save-page-as state and the open-file state.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateCommandsForFileSelectionDialogs();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update commands whose state depends on the type of fullscreen mode the
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window is in.
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void UpdateCommandsForFullscreenMode();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the printing command state.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdatePrintingState();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the SHOW_SYNC_SETUP menu entry.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSigninAllowedPrefChange();
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the save-page-as command state.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateSaveAsState();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the show-sync command state.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateShowSyncState(bool show_main_ui);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ask the Reload/Stop button to change its icon, and update the Stop command
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state.  |is_loading| is true if the current WebContents is loading.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |force| is true if the button should change its icon immediately.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateReloadStopState(bool is_loading, bool force);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates commands for find.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateCommandsForFind();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add/remove observers for interstitial attachment/detachment from
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |contents|.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddInterstitialObservers(content::WebContents* contents);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveInterstitialObservers(content::WebContents* contents);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline BrowserWindow* window();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline Profile* profile();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The CommandUpdater that manages the browser window commands.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater command_updater_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates if command execution is blocked.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool block_command_execution_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores the last blocked command id when |block_command_execution_| is true.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int last_blocked_command_id_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores the disposition type of the last blocked command.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition last_blocked_command_disposition_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<InterstitialObserver*> interstitial_observers_;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefChangeRegistrar profile_pref_registrar_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefChangeRegistrar local_pref_registrar_;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BooleanPrefMember pref_signin_allowed_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserCommandController);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
190