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