• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_UI_BROWSER_H_
6 #define CHROME_BROWSER_UI_BROWSER_H_
7 #pragma once
8 
9 #include <map>
10 #include <set>
11 #include <string>
12 #include <vector>
13 
14 #include "base/basictypes.h"
15 #include "base/compiler_specific.h"
16 #include "base/gtest_prod_util.h"
17 #include "base/memory/scoped_ptr.h"
18 #include "base/string16.h"
19 #include "base/task.h"
20 #include "chrome/browser/command_updater.h"
21 #include "chrome/browser/debugger/devtools_toggle_action.h"
22 #include "chrome/browser/instant/instant_delegate.h"
23 #include "chrome/browser/prefs/pref_member.h"
24 #include "chrome/browser/sessions/session_id.h"
25 #include "chrome/browser/sessions/tab_restore_service_observer.h"
26 #include "chrome/browser/sync/profile_sync_service_observer.h"
27 #include "chrome/browser/tabs/tab_handler.h"
28 #include "chrome/browser/tabs/tab_strip_model_delegate.h"  // TODO(beng): remove
29 #include "chrome/browser/tabs/tab_strip_model_observer.h"  // TODO(beng): remove
30 #include "chrome/browser/ui/browser_navigator.h"
31 #include "chrome/browser/ui/search_engines/search_engine_tab_helper_delegate.h"
32 #include "chrome/browser/ui/shell_dialogs.h"
33 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h"
34 #include "chrome/browser/ui/toolbar/toolbar_model.h"
35 #include "chrome/common/extensions/extension_constants.h"
36 #include "content/browser/tab_contents/page_navigator.h"
37 #include "content/browser/tab_contents/tab_contents_delegate.h"
38 #include "content/common/notification_registrar.h"
39 #include "content/common/page_transition_types.h"
40 #include "content/common/page_zoom.h"
41 #include "ui/gfx/rect.h"
42 
43 class BrowserTabRestoreServiceDelegate;
44 class BrowserWindow;
45 class Extension;
46 class FindBarController;
47 class InstantController;
48 class InstantUnloadHandler;
49 class PrefService;
50 class Profile;
51 class SessionStorageNamespace;
52 class SkBitmap;
53 class StatusBubble;
54 class TabNavigation;
55 class TabStripModel;
56 struct WebApplicationInfo;
57 namespace gfx {
58 class Point;
59 }
60 
61 class Browser : public TabHandlerDelegate,
62                 public TabContentsDelegate,
63                 public TabContentsWrapperDelegate,
64                 public SearchEngineTabHelperDelegate,
65                 public PageNavigator,
66                 public CommandUpdater::CommandUpdaterDelegate,
67                 public NotificationObserver,
68                 public SelectFileDialog::Listener,
69                 public TabRestoreServiceObserver,
70                 public ProfileSyncServiceObserver,
71                 public InstantDelegate {
72  public:
73   // SessionService::WindowType mirrors these values.  If you add to this
74   // enum, look at SessionService::WindowType to see if it needs to be
75   // updated.
76   enum Type {
77     TYPE_NORMAL = 1,
78     TYPE_POPUP = 2,
79     // The old-style app created via "Create application shortcuts".
80     // Shortcuts to a URL and shortcuts to an installed application
81     // both have this type.
82     TYPE_APP = 4,
83     TYPE_APP_POPUP = TYPE_APP | TYPE_POPUP,
84     TYPE_DEVTOOLS = TYPE_APP | 8,
85 
86     // TODO(skerner): crbug/56776: Until the panel UI is complete on all
87     // platforms, apps that set app.launch.container = "panel" have type
88     // APP_POPUP. (see Browser::CreateForApp)
89     // NOTE: TYPE_APP_PANEL is a superset of TYPE_APP_POPUP.
90     TYPE_APP_PANEL = TYPE_APP | TYPE_POPUP | 16,
91     TYPE_ANY = TYPE_NORMAL |
92                TYPE_POPUP |
93                TYPE_APP |
94                TYPE_DEVTOOLS |
95                TYPE_APP_PANEL
96   };
97 
98   // Possible elements of the Browser window.
99   enum WindowFeature {
100     FEATURE_NONE = 0,
101     FEATURE_TITLEBAR = 1,
102     FEATURE_TABSTRIP = 2,
103     FEATURE_TOOLBAR = 4,
104     FEATURE_LOCATIONBAR = 8,
105     FEATURE_BOOKMARKBAR = 16,
106     FEATURE_INFOBAR = 32,
107     FEATURE_SIDEBAR = 64,
108     FEATURE_DOWNLOADSHELF = 128
109   };
110 
111   // Maximized state on creation.
112   enum MaximizedState {
113     // The maximized state is set to the default, which varies depending upon
114     // what the user has done.
115     MAXIMIZED_STATE_DEFAULT,
116 
117     // Maximized state is explicitly maximized.
118     MAXIMIZED_STATE_MAXIMIZED,
119 
120     // Maximized state is explicitly not maximized (normal).
121     MAXIMIZED_STATE_UNMAXIMIZED
122   };
123 
124   // Constructors, Creation, Showing //////////////////////////////////////////
125 
126   // Creates a new browser of the given |type| and for the given |profile|. The
127   // Browser has a NULL window after its construction, InitBrowserWindow must
128   // be called after configuration for window() to be valid.
129   // Avoid using this constructor directly if you can use one of the Create*()
130   // methods below. This applies to almost all non-testing code.
131   Browser(Type type, Profile* profile);
132   virtual ~Browser();
133 
134   // Creates a normal tabbed browser with the specified profile. The Browser's
135   // window is created by this function call.
136   static Browser* Create(Profile* profile);
137 
138   // Like Create, but creates a browser of the specified (popup) type, with the
139   // specified contents, in a popup window of the specified size/position.
140   static Browser* CreateForPopup(Type type, Profile* profile,
141                                  TabContents* new_contents,
142                                  const gfx::Rect& initial_bounds);
143 
144   // Like Create, but creates a browser of the specified type.
145   static Browser* CreateForType(Type type, Profile* profile);
146 
147   // Like Create, but creates a toolbar-less "app" window for the specified
148   // app. |app_name| is required and is used to identify the window to the
149   // shell.  If |extension| is set, it is used to determine the size of the
150   // window to open.
151   static Browser* CreateForApp(const std::string& app_name,
152                                const gfx::Size& window_size,
153                                Profile* profile,
154                                bool is_panel);
155 
156   // Like Create, but creates a tabstrip-less and toolbar-less
157   // DevTools "app" window.
158   static Browser* CreateForDevTools(Profile* profile);
159 
160   // Set overrides for the initial window bounds and maximized state.
set_override_bounds(const gfx::Rect & bounds)161   void set_override_bounds(const gfx::Rect& bounds) {
162     override_bounds_ = bounds;
163   }
set_maximized_state(MaximizedState state)164   void set_maximized_state(MaximizedState state) {
165     maximized_state_ = state;
166   }
167   // Return true if the initial window bounds have been overridden.
bounds_overridden()168   bool bounds_overridden() const {
169     return !override_bounds_.IsEmpty();
170   }
171 
172   // Creates the Browser Window. Prefer to use the static helpers above where
173   // possible. This does not show the window. You need to call window()->Show()
174   // to show it.
175   void InitBrowserWindow();
176 
177   // Accessors ////////////////////////////////////////////////////////////////
178 
type()179   Type type() const { return type_; }
app_name()180   const std::string& app_name() const { return app_name_; }
profile()181   Profile* profile() const { return profile_; }
182   const std::vector<std::wstring>& user_data_dir_profiles() const;
override_bounds()183   gfx::Rect override_bounds() const { return override_bounds_; }
184 
185   // Returns the InstantController or NULL if there is no InstantController for
186   // this Browser.
instant()187   InstantController* instant() const { return instant_.get(); }
188 
189 #if defined(UNIT_TEST)
190   // Sets the BrowserWindow. This is intended for testing and generally not
191   // useful outside of testing. Use CreateBrowserWindow outside of testing, or
192   // the static convenience methods that create a BrowserWindow for you.
set_window(BrowserWindow * window)193   void set_window(BrowserWindow* window) {
194     DCHECK(!window_);
195     window_ = window;
196   }
197 #endif
198 
199   // |window()| will return NULL if called before |CreateBrowserWindow()|
200   // is done.
window()201   BrowserWindow* window() const { return window_; }
toolbar_model()202   ToolbarModel* toolbar_model() { return &toolbar_model_; }
session_id()203   const SessionID& session_id() const { return session_id_; }
command_updater()204   CommandUpdater* command_updater() { return &command_updater_; }
block_command_execution()205   bool block_command_execution() const { return block_command_execution_; }
tab_restore_service_delegate()206   BrowserTabRestoreServiceDelegate* tab_restore_service_delegate() {
207     return tab_restore_service_delegate_.get();
208   }
209 
210   // Get the FindBarController for this browser, creating it if it does not
211   // yet exist.
212   FindBarController* GetFindBarController();
213 
214   // Returns true if a FindBarController exists for this browser.
215   bool HasFindBarController() const;
216 
217   // Setters /////////////////////////////////////////////////////////////////
218 
219   void set_user_data_dir_profiles(const std::vector<std::wstring>& profiles);
220 
221   // Browser Creation Helpers /////////////////////////////////////////////////
222 
223   // Opens a new window with the default blank tab.
224   static void OpenEmptyWindow(Profile* profile);
225 
226   // Opens a new window with the tabs from |profile|'s TabRestoreService.
227   static void OpenWindowWithRestoredTabs(Profile* profile);
228 
229   // Opens the specified URL in a new browser window in an incognito session.
230   // If there is already an existing active incognito session for the specified
231   // |profile|, that session is re-used.
232   static void OpenURLOffTheRecord(Profile* profile, const GURL& url);
233 
234   // Open |extension| in |container|, using |existing_tab| if not NULL and if
235   // the correct container type.  Returns the TabContents* that was created or
236   // NULL.
237   static TabContents* OpenApplication(
238       Profile* profile,
239       const Extension* extension,
240       extension_misc::LaunchContainer container,
241       TabContents* existing_tab);
242 
243   // Opens a new application window for the specified url. If |as_panel|
244   // is true, the application will be opened as a Browser::Type::APP_PANEL in
245   // app panel window, otherwise it will be opened as as either
246   // Browser::Type::APP a.k.a. "thin frame" (if |extension| is NULL) or
247   // Browser::Type::EXTENSION_APP (if |extension| is non-NULL).
248   // If |app_browser| is not NULL, it is set to the browser that hosts the
249   // returned tab.
250   static TabContents* OpenApplicationWindow(
251       Profile* profile,
252       const Extension* extension,
253       extension_misc::LaunchContainer container,
254       const GURL& url,
255       Browser** app_browser);
256 
257   // Open |url| in an app shortcut window.  If |update_shortcut| is true,
258   // update the name, description, and favicon of the shortcut.
259   // There are two kinds of app shortcuts: Shortcuts to a URL,
260   // and shortcuts that open an installed application.  This function
261   // is used to open the former.  To open the latter, use
262   // Browser::OpenApplicationWindow().
263   static TabContents* OpenAppShortcutWindow(Profile* profile,
264                                             const GURL& url,
265                                             bool update_shortcut);
266 
267   // Open an application for |extension| in a new application tab, or
268   // |existing_tab| if not NULL.  Returns NULL if there are no appropriate
269   // existing browser windows for |profile|.
270   static TabContents* OpenApplicationTab(Profile* profile,
271                                          const Extension* extension,
272                                          TabContents* existing_tab);
273 
274   // Opens a new window and opens the bookmark manager.
275   static void OpenBookmarkManagerWindow(Profile* profile);
276 
277 #if defined(OS_MACOSX)
278   // Open a new window with history/downloads/help/options (needed on Mac when
279   // there are no windows).
280   static void OpenHistoryWindow(Profile* profile);
281   static void OpenDownloadsWindow(Profile* profile);
282   static void OpenHelpWindow(Profile* profile);
283   static void OpenOptionsWindow(Profile* profile);
284   static void OpenClearBrowingDataDialogWindow(Profile* profile);
285   static void OpenImportSettingsDialogWindow(Profile* profile);
286   static void OpenInstantConfirmDialogWindow(Profile* profile);
287 #endif
288 
289   // Opens a window with the extensions tab in it - needed by long-lived
290   // extensions which may run with no windows open.
291   static void OpenExtensionsWindow(Profile* profile);
292 
293   // State Storage and Retrieval for UI ///////////////////////////////////////
294 
295   // Save and restore the window position.
296   std::string GetWindowPlacementKey() const;
297   bool ShouldSaveWindowPlacement() const;
298   void SaveWindowPlacement(const gfx::Rect& bounds, bool maximized);
299   gfx::Rect GetSavedWindowBounds() const;
300   bool GetSavedMaximizedState() const;
301 
302   // Gets the Favicon of the page in the selected tab.
303   SkBitmap GetCurrentPageIcon() const;
304 
305   // Gets the title of the window based on the selected tab's title.
306   string16 GetWindowTitleForCurrentTab() const;
307 
308   // Prepares a title string for display (removes embedded newlines, etc).
309   static void FormatTitleForDisplay(string16* title);
310 
311   // OnBeforeUnload handling //////////////////////////////////////////////////
312 
313   // Gives beforeunload handlers the chance to cancel the close.
314   bool ShouldCloseWindow();
315 
IsAttemptingToCloseBrowser()316   bool IsAttemptingToCloseBrowser() const {
317     return is_attempting_to_close_browser_;
318   }
319 
320   // Invoked when the window containing us is closing. Performs the necessary
321   // cleanup.
322   void OnWindowClosing();
323 
324   // In-progress download termination handling /////////////////////////////////
325 
326   // Are normal and/or incognito downloads in progress?
327   void CheckDownloadsInProgress(bool* normal_downloads,
328                                 bool* incognito_downloads);
329 
330   // Called when the user has decided whether to proceed or not with the browser
331   // closure.  |cancel_downloads| is true if the downloads should be canceled
332   // and the browser closed, false if the browser should stay open and the
333   // downloads running.
334   void InProgressDownloadResponse(bool cancel_downloads);
335 
336   // TabStripModel pass-thrus /////////////////////////////////////////////////
337 
tabstrip_model()338   TabStripModel* tabstrip_model() const {
339     // TODO(beng): remove this accessor. It violates google style.
340     return tab_handler_->GetTabStripModel();
341   }
342 
343   int tab_count() const;
344   int active_index() const;
345   int GetIndexOfController(const NavigationController* controller) const;
346   TabContentsWrapper* GetSelectedTabContentsWrapper() const;
347   TabContentsWrapper* GetTabContentsWrapperAt(int index) const;
348   // Same as above but correctly handles if GetSelectedTabContents() is NULL
349   // in the model before dereferencing to get the raw TabContents.
350   // TODO(pinkerton): These should really be returning TabContentsWrapper
351   // objects, but that would require changing about 50+ other files. In order
352   // to keep changes localized, the default is to return a TabContents. Note
353   // this differs from the TabStripModel because it has far fewer clients.
354   TabContents* GetSelectedTabContents() const;
355   TabContents* GetTabContentsAt(int index) const;
356   void ActivateTabAt(int index, bool user_gesture);
357   bool IsTabPinned(int index) const;
358   void CloseAllTabs();
359 
360   // Tab adding/showing functions /////////////////////////////////////////////
361 
362   // Returns true if the tab strip is editable (for extensions).
363   bool IsTabStripEditable() const;
364 
365   // Returns the index to insert a tab at during session restore and startup.
366   // |relative_index| gives the index of the url into the number of tabs that
367   // are going to be opened. For example, if three urls are passed in on the
368   // command line this is invoked three times with the values 0, 1 and 2.
369   int GetIndexForInsertionDuringRestore(int relative_index);
370 
371   // Adds a selected tab with the specified URL and transition, returns the
372   // created TabContents.
373   TabContentsWrapper* AddSelectedTabWithURL(
374       const GURL& url,
375       PageTransition::Type transition);
376 
377   // Add a new tab, given a TabContents. A TabContents appropriate to
378   // display the last committed entry is created and returned.
379   TabContents* AddTab(TabContentsWrapper* tab_contents,
380                       PageTransition::Type type);
381 
382   // Add a tab with its session history restored from the SessionRestore
383   // system. If select is true, the tab is selected. |tab_index| gives the index
384   // to insert the tab at. |selected_navigation| is the index of the
385   // TabNavigation in |navigations| to select. If |extension_app_id| is
386   // non-empty the tab is an app tab and |extension_app_id| is the id of the
387   // extension. If |pin| is true and |tab_index|/ is the last pinned tab, then
388   // the newly created tab is pinned. If |from_last_session| is true,
389   // |navigations| are from the previous session.
390   TabContents* AddRestoredTab(const std::vector<TabNavigation>& navigations,
391                               int tab_index,
392                               int selected_navigation,
393                               const std::string& extension_app_id,
394                               bool select,
395                               bool pin,
396                               bool from_last_session,
397                               SessionStorageNamespace* storage_namespace);
398   // Creates a new tab with the already-created TabContents 'new_contents'.
399   // The window for the added contents will be reparented correctly when this
400   // method returns.  If |disposition| is NEW_POPUP, |pos| should hold the
401   // initial position.
402   void AddTabContents(TabContents* new_contents,
403                       WindowOpenDisposition disposition,
404                       const gfx::Rect& initial_pos,
405                       bool user_gesture);
406   void CloseTabContents(TabContents* contents);
407 
408   // Show a dialog with HTML content. |delegate| contains a pointer to the
409   // delegate who knows how to display the dialog (which file URL and JSON
410   // string input to use during initialization). |parent_window| is the window
411   // that should be parent of the dialog, or NULL for the default.
412   void BrowserShowHtmlDialog(HtmlDialogUIDelegate* delegate,
413                              gfx::NativeWindow parent_window);
414 
415   // Called when a popup select is about to be displayed.
416   void BrowserRenderWidgetShowing();
417 
418   // Notification that the bookmark bar has changed size.  We need to resize the
419   // content area and notify our InfoBarContainer.
420   void BookmarkBarSizeChanged(bool is_animating);
421 
422   // Replaces the state of the currently selected tab with the session
423   // history restored from the SessionRestore system.
424   void ReplaceRestoredTab(
425       const std::vector<TabNavigation>& navigations,
426       int selected_navigation,
427       bool from_last_session,
428       const std::string& extension_app_id,
429       SessionStorageNamespace* session_storage_namespace);
430 
431   // Navigate to an index in the tab history, opening a new tab depending on the
432   // disposition.
433   bool NavigateToIndexWithDisposition(int index, WindowOpenDisposition disp);
434 
435   // Show a given a URL. If a tab with the same URL (ignoring the ref) is
436   // already visible in this browser, it becomes selected. Otherwise a new tab
437   // is created.
438   void ShowSingletonTab(const GURL& url);
439 
440   // Update commands whose state depends on whether the window is in fullscreen
441   // mode. This is a public function because on Linux, fullscreen mode is an
442   // async call to X. Once we get the fullscreen callback, the browser window
443   // will call this method.
444   void UpdateCommandsForFullscreenMode(bool is_fullscreen);
445 
446   // Assorted browser commands ////////////////////////////////////////////////
447 
448   // NOTE: Within each of the following sections, the IDs are ordered roughly by
449   // how they appear in the GUI/menus (left to right, top to bottom, etc.).
450 
451   // Navigation commands
452   void GoBack(WindowOpenDisposition disposition);
453   void GoForward(WindowOpenDisposition disposition);
454   void Reload(WindowOpenDisposition disposition);
455   void ReloadIgnoringCache(WindowOpenDisposition disposition);  // Shift-reload.
456   void Home(WindowOpenDisposition disposition);
457   void OpenCurrentURL();
458   void Stop();
459   // Window management commands
460   void NewWindow();
461   void NewIncognitoWindow();
462   void CloseWindow();
463   void NewTab();
464   void CloseTab();
465   void SelectNextTab();
466   void SelectPreviousTab();
467   void OpenTabpose();
468   void MoveTabNext();
469   void MoveTabPrevious();
470   void SelectNumberedTab(int index);
471   void SelectLastTab();
472   void DuplicateTab();
473   void WriteCurrentURLToClipboard();
474   void ConvertPopupToTabbedBrowser();
475   // In kiosk mode, the first toggle is valid, the rest is discarded.
476   void ToggleFullscreenMode();
477   void Exit();
478 #if defined(OS_CHROMEOS)
479   void ToggleCompactNavigationBar();
480   void Search();
481   void ShowKeyboardOverlay();
482 #endif
483 
484   // Page-related commands
485   void BookmarkCurrentPage();
486   void SavePage();
487   void ViewSelectedSource();
488   void ShowFindBar();
489 
490   // Returns true if the Browser supports the specified feature. The value of
491   // this varies during the lifetime of the browser. For example, if the window
492   // is fullscreen this may return a different value. If you only care about
493   // whether or not it's possible for the browser to support a particular
494   // feature use |CanSupportWindowFeature|.
495   bool SupportsWindowFeature(WindowFeature feature) const;
496 
497   // Returns true if the Browser can support the specified feature. See comment
498   // in |SupportsWindowFeature| for details on this.
499   bool CanSupportWindowFeature(WindowFeature feature) const;
500 
501   // TODO(port): port these, and re-merge the two function declaration lists.
502   // Page-related commands.
503   void Print();
504   void EmailPageLocation();
505   void ToggleEncodingAutoDetect();
506   void OverrideEncoding(int encoding_id);
507 
508   // Clipboard commands
509   void Cut();
510   void Copy();
511   void Paste();
512 
513   // Find-in-page
514   void Find();
515   void FindNext();
516   void FindPrevious();
517 
518   // Zoom
519   void Zoom(PageZoom::Function zoom_function);
520 
521   // Focus various bits of UI
522   void FocusToolbar();
523   void FocusLocationBar();  // Also selects any existing text.
524   void FocusSearch();
525   void FocusAppMenu();
526   void FocusBookmarksToolbar();
527   void FocusChromeOSStatus();
528   void FocusNextPane();
529   void FocusPreviousPane();
530 
531   // Show various bits of UI
532   void OpenFile();
533   void OpenCreateShortcutsDialog();
534   void ToggleDevToolsWindow(DevToolsToggleAction action);
535   void OpenTaskManager(bool highlight_background_resources);
536   void OpenBugReportDialog();
537 
538   void ToggleBookmarkBar();
539 
540   void OpenBookmarkManager();
541   void ShowAppMenu();
542   void ShowBookmarkManagerTab();
543   void ShowHistoryTab();
544   void ShowDownloadsTab();
545   void ShowExtensionsTab();
546   void ShowAboutConflictsTab();
547   void ShowBrokenPageTab(TabContents* contents);
548   void ShowOptionsTab(const std::string& sub_page);
549   void OpenClearBrowsingDataDialog();
550   void OpenOptionsDialog();
551   void OpenPasswordManager();
552   void OpenSyncMyBookmarksDialog();
553 #if defined(ENABLE_REMOTING)
554   void OpenRemotingSetupDialog();
555 #endif
556   void OpenImportSettingsDialog();
557   void OpenInstantConfirmDialog();
558   void OpenAboutChromeDialog();
559   void OpenUpdateChromeDialog();
560   void OpenHelpTab();
561   // Used by the "Get themes" link in the options dialog.
562   void OpenThemeGalleryTabAndActivate();
563   void OpenAutofillHelpTabAndActivate();
564   void OpenPrivacyDashboardTabAndActivate();
565   void OpenSearchEngineOptionsDialog();
566 #if defined(OS_CHROMEOS)
567   void OpenFileManager();
568   void OpenSystemOptionsDialog();
569   void OpenInternetOptionsDialog();
570   void OpenLanguageOptionsDialog();
571   void OpenSystemTabAndActivate();
572   void OpenMobilePlanTabAndActivate();
573 #endif
574   void OpenPluginsTabAndActivate();
575 
576   virtual void UpdateDownloadShelfVisibility(bool visible);
577 
578   // Overridden from TabStripModelDelegate:
579   virtual bool UseVerticalTabs() const;
580 
581   /////////////////////////////////////////////////////////////////////////////
582 
583   // Sets the value of homepage related prefs to new values. Since we do not
584   // want to change these values for existing users, we can not change the
585   // default values under RegisterUserPrefs. Also if user already has an
586   // existing profile we do not want to override those preferences so we only
587   // set new values if they have not been set already. This method gets called
588   // during First Run.
589   static void SetNewHomePagePrefs(PrefService* prefs);
590 
591   static void RegisterPrefs(PrefService* prefs);
592   static void RegisterUserPrefs(PrefService* prefs);
593 
594   // Helper function to run unload listeners on a TabContents.
595   static bool RunUnloadEventsHelper(TabContents* contents);
596 
597   // Returns the Browser which contains the tab with the given
598   // NavigationController, also filling in |index| (if valid) with the tab's
599   // index in the tab strip.
600   // Returns NULL if not found.
601   // This call is O(N) in the number of tabs.
602   static Browser* GetBrowserForController(
603       const NavigationController* controller, int* index);
604 
605   // Retrieve the last active tabbed browser with a profile matching |profile|.
606   static Browser* GetTabbedBrowser(Profile* profile, bool match_incognito);
607 
608   // Retrieve the last active tabbed browser with a profile matching |profile|.
609   // Creates a new Browser if none are available.
610   static Browser* GetOrCreateTabbedBrowser(Profile* profile);
611 
612   // Calls ExecuteCommandWithDisposition with the given disposition.
613   void ExecuteCommandWithDisposition(int id, WindowOpenDisposition);
614 
615   // Executes a command if it's enabled.
616   // Returns true if the command is executed.
617   bool ExecuteCommandIfEnabled(int id);
618 
619   // Returns true if |command_id| is a reserved command whose keyboard shortcuts
620   // should not be sent to the renderer or |event| was triggered by a key that
621   // we never want to send to the renderer.
622   bool IsReservedCommandOrKey(int command_id,
623                               const NativeWebKeyboardEvent& event);
624 
625   // Sets if command execution shall be blocked. If |block| is true then
626   // following calls to ExecuteCommand() or ExecuteCommandWithDisposition()
627   // method will not execute the command, and the last blocked command will be
628   // recorded for retrieval.
629   void SetBlockCommandExecution(bool block);
630 
631   // Gets the last blocked command after calling SetBlockCommandExecution(true).
632   // Returns the command id or -1 if there is no command blocked. The
633   // disposition type of the command will be stored in |*disposition| if it's
634   // not null.
635   int GetLastBlockedCommand(WindowOpenDisposition* disposition);
636 
637   // Called by browser::Navigate() when a navigation has occurred in a tab in
638   // this Browser. Updates the UI for the start of this navigation.
639   void UpdateUIForNavigationInTab(TabContentsWrapper* contents,
640                                   PageTransition::Type transition,
641                                   bool user_initiated);
642 
643   // Called by browser::Navigate() to retrieve the home page if no URL is
644   // specified.
645   GURL GetHomePage() const;
646 
647   // Interface implementations ////////////////////////////////////////////////
648 
649   // Overridden from PageNavigator:
650   virtual void OpenURL(const GURL& url, const GURL& referrer,
651                        WindowOpenDisposition disposition,
652                        PageTransition::Type transition);
653 
654   // Overridden from CommandUpdater::CommandUpdaterDelegate:
655   virtual void ExecuteCommand(int id);
656 
657   // Overridden from TabRestoreServiceObserver:
658   virtual void TabRestoreServiceChanged(TabRestoreService* service);
659   virtual void TabRestoreServiceDestroyed(TabRestoreService* service);
660 
661   // Centralized method for creating a TabContents, configuring and installing
662   // all its supporting objects and observers.
663   static TabContentsWrapper*
664       TabContentsFactory(Profile* profile,
665                          SiteInstance* site_instance,
666                          int routing_id,
667                          const TabContents* base_tab_contents,
668                          SessionStorageNamespace* session_storage_namespace);
669 
670   // Overridden from TabHandlerDelegate:
671   virtual Profile* GetProfile() const;
672   virtual Browser* AsBrowser();
673 
674   // Overridden from TabStripModelDelegate:
675   virtual TabContentsWrapper* AddBlankTab(bool foreground);
676   virtual TabContentsWrapper* AddBlankTabAt(int index, bool foreground);
677   virtual Browser* CreateNewStripWithContents(
678       TabContentsWrapper* detached_contents,
679       const gfx::Rect& window_bounds,
680       const DockInfo& dock_info,
681       bool maximize);
682   virtual int GetDragActions() const;
683   // Construct a TabContents for a given URL, profile and transition type.
684   // If instance is not null, its process will be used to render the tab.
685   virtual TabContentsWrapper* CreateTabContentsForURL(const GURL& url,
686                                                const GURL& referrer,
687                                                Profile* profile,
688                                                PageTransition::Type transition,
689                                                bool defer_load,
690                                                SiteInstance* instance) const;
691   virtual bool CanDuplicateContentsAt(int index);
692   virtual void DuplicateContentsAt(int index);
693   virtual void CloseFrameAfterDragSession();
694   virtual void CreateHistoricalTab(TabContentsWrapper* contents);
695   virtual bool RunUnloadListenerBeforeClosing(TabContentsWrapper* contents);
696   virtual bool CanCloseContentsAt(int index);
697   virtual bool CanBookmarkAllTabs() const;
698   virtual void BookmarkAllTabs();
699   virtual bool CanCloseTab() const;
700   virtual void ToggleUseVerticalTabs();
701   virtual bool CanRestoreTab();
702   virtual void RestoreTab();
703   virtual bool LargeIconsPermitted() const;
704 
705   // Overridden from TabStripModelObserver:
706   virtual void TabInsertedAt(TabContentsWrapper* contents,
707                              int index,
708                              bool foreground);
709   virtual void TabClosingAt(TabStripModel* tab_strip_model,
710                             TabContentsWrapper* contents,
711                             int index);
712   virtual void TabDetachedAt(TabContentsWrapper* contents, int index);
713   virtual void TabDeselected(TabContentsWrapper* contents);
714   virtual void TabSelectedAt(TabContentsWrapper* old_contents,
715                              TabContentsWrapper* new_contents,
716                              int index,
717                              bool user_gesture);
718   virtual void TabMoved(TabContentsWrapper* contents,
719                         int from_index,
720                         int to_index);
721   virtual void TabReplacedAt(TabStripModel* tab_strip_model,
722                              TabContentsWrapper* old_contents,
723                              TabContentsWrapper* new_contents,
724                              int index);
725   virtual void TabPinnedStateChanged(TabContentsWrapper* contents, int index);
726   virtual void TabStripEmpty();
727 
728   // Figure out if there are tabs that have beforeunload handlers.
729   bool TabsNeedBeforeUnloadFired();
730 
731  protected:
732   // Wrapper for the factory method in BrowserWindow. This allows subclasses to
733   // set their own window.
734   virtual BrowserWindow* CreateBrowserWindow();
735 
736  private:
737   FRIEND_TEST_ALL_PREFIXES(BrowserTest, NoTabsInPopups);
738   FRIEND_TEST_ALL_PREFIXES(BrowserTest, ConvertTabToAppShortcut);
739   FRIEND_TEST_ALL_PREFIXES(BrowserTest, OpenAppWindowLikeNtp);
740   FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
741   FRIEND_TEST_ALL_PREFIXES(BrowserInitTest, OpenAppShortcutNoPref);
742   FRIEND_TEST_ALL_PREFIXES(BrowserInitTest, OpenAppShortcutWindowPref);
743   FRIEND_TEST_ALL_PREFIXES(BrowserInitTest, OpenAppShortcutTabPref);
744   FRIEND_TEST_ALL_PREFIXES(BrowserInitTest, OpenAppShortcutPanel);
745 
746   // Used to describe why a tab is being detached. This is used by
747   // TabDetachedAtImpl.
748   enum DetachType {
749     // Result of TabDetachedAt.
750     DETACH_TYPE_DETACH,
751 
752     // Result of TabReplacedAt.
753     DETACH_TYPE_REPLACE,
754 
755     // Result of the tab strip not having any significant tabs.
756     DETACH_TYPE_EMPTY
757   };
758 
759   // Overridden from TabContentsDelegate:
760   virtual void OpenURLFromTab(TabContents* source,
761                               const GURL& url,
762                               const GURL& referrer,
763                               WindowOpenDisposition disposition,
764                               PageTransition::Type transition);
765   virtual void NavigationStateChanged(const TabContents* source,
766                                       unsigned changed_flags);
767   virtual void AddNewContents(TabContents* source,
768                               TabContents* new_contents,
769                               WindowOpenDisposition disposition,
770                               const gfx::Rect& initial_pos,
771                               bool user_gesture);
772   virtual void ActivateContents(TabContents* contents);
773   virtual void DeactivateContents(TabContents* contents);
774   virtual void LoadingStateChanged(TabContents* source);
775   virtual void CloseContents(TabContents* source);
776   virtual void MoveContents(TabContents* source, const gfx::Rect& pos);
777   virtual void DetachContents(TabContents* source);
778   virtual bool IsPopup(const TabContents* source) const;
779   virtual bool CanReloadContents(TabContents* source) const;
780   virtual void UpdateTargetURL(TabContents* source, const GURL& url);
781   virtual void ContentsMouseEvent(
782       TabContents* source, const gfx::Point& location, bool motion);
783   virtual void ContentsZoomChange(bool zoom_in);
784   virtual void OnContentSettingsChange(TabContents* source);
785   virtual void SetTabContentBlocked(TabContents* contents, bool blocked);
786   virtual void TabContentsFocused(TabContents* tab_content);
787   virtual bool TakeFocus(bool reverse);
788   virtual bool IsApplication() const;
789   virtual void ConvertContentsToApplication(TabContents* source);
790   virtual bool ShouldDisplayURLField();
791   virtual void ShowHtmlDialog(HtmlDialogUIDelegate* delegate,
792                               gfx::NativeWindow parent_window);
793   virtual void BeforeUnloadFired(TabContents* source,
794                                  bool proceed,
795                                  bool* proceed_to_fire_unload);
796   virtual void SetFocusToLocationBar(bool select_all);
797   virtual void RenderWidgetShowing();
798   virtual int GetExtraRenderViewHeight() const;
799   virtual void OnStartDownload(DownloadItem* download, TabContents* tab);
800   virtual void ShowPageInfo(Profile* profile,
801                             const GURL& url,
802                             const NavigationEntry::SSLStatus& ssl,
803                             bool show_history);
804   virtual void ViewSourceForTab(TabContents* source, const GURL& page_url);
805   virtual void ViewSourceForFrame(TabContents* source,
806                                   const GURL& frame_url,
807                                   const std::string& frame_content_state);
808   virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
809                                         bool* is_keyboard_shortcut);
810   virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event);
811   virtual void ShowRepostFormWarningDialog(TabContents* tab_contents);
812   virtual void ShowContentSettingsPage(ContentSettingsType content_type);
813   virtual void ShowCollectedCookiesDialog(TabContents* tab_contents);
814   virtual bool ShouldAddNavigationToHistory(
815       const history::HistoryAddPageArgs& add_page_args,
816       NavigationType::Type navigation_type);
817   virtual void ContentRestrictionsChanged(TabContents* source);
818   virtual void WorkerCrashed();
819 
820   // Overridden from TabContentsWrapperDelegate:
821   virtual void URLStarredChanged(TabContentsWrapper* source,
822                                  bool starred) OVERRIDE;
823   virtual void OnDidGetApplicationInfo(TabContentsWrapper* source,
824                                        int32 page_id) OVERRIDE;
825   virtual void OnInstallApplication(
826       TabContentsWrapper* source,
827       const WebApplicationInfo& app_info) OVERRIDE;
828 
829   // Overridden from SearchEngineTabHelperDelegate:
830   virtual void ConfirmSetDefaultSearchProvider(
831       TabContents* tab_contents,
832       TemplateURL* template_url,
833       TemplateURLModel* template_url_model) OVERRIDE;
834   virtual void ConfirmAddSearchProvider(const TemplateURL* template_url,
835                                         Profile* profile) OVERRIDE;
836 
837   // Overridden from SelectFileDialog::Listener:
838   virtual void FileSelected(const FilePath& path, int index, void* params);
839 
840   // Overridden from NotificationObserver:
841   virtual void Observe(NotificationType type,
842                        const NotificationSource& source,
843                        const NotificationDetails& details);
844 
845   // Overridden from ProfileSyncServiceObserver:
846   virtual void OnStateChanged();
847 
848   // Overriden from InstantDelegate:
849   virtual void PrepareForInstant() OVERRIDE;
850   virtual void ShowInstant(TabContentsWrapper* preview_contents) OVERRIDE;
851   virtual void HideInstant() OVERRIDE;
852   virtual void CommitInstant(TabContentsWrapper* preview_contents) OVERRIDE;
853   virtual void SetSuggestedText(const string16& text,
854                                 InstantCompleteBehavior behavior) OVERRIDE;
855   virtual gfx::Rect GetInstantBounds() OVERRIDE;
856 
857   // Command and state updating ///////////////////////////////////////////////
858 
859   // Initialize state for all browser commands.
860   void InitCommandState();
861 
862   // Update commands whose state depends on the tab's state.
863   void UpdateCommandsForTabState();
864 
865   // Updates commands when the content's restrictions change.
866   void UpdateCommandsForContentRestrictionState();
867 
868   // Updates commands for enabling developer tools.
869   void UpdateCommandsForDevTools();
870 
871   // Updates commands for bookmark editing.
872   void UpdateCommandsForBookmarkEditing();
873 
874   // Updates the printing command state.
875   void UpdatePrintingState(int content_restrictions);
876 
877   // Ask the Reload/Stop button to change its icon, and update the Stop command
878   // state.  |is_loading| is true if the current TabContents is loading.
879   // |force| is true if the button should change its icon immediately.
880   void UpdateReloadStopState(bool is_loading, bool force);
881 
882   // UI update coalescing and handling ////////////////////////////////////////
883 
884   // Asks the toolbar (and as such the location bar) to update its state to
885   // reflect the current tab's current URL, security state, etc.
886   // If |should_restore_state| is true, we're switching (back?) to this tab and
887   // should restore any previous location bar state (such as user editing) as
888   // well.
889   void UpdateToolbar(bool should_restore_state);
890 
891   // Does one or both of the following for each bit in |changed_flags|:
892   // . If the update should be processed immediately, it is.
893   // . If the update should processed asynchronously (to avoid lots of ui
894   //   updates), then scheduled_updates_ is updated for the |source| and update
895   //   pair and a task is scheduled (assuming it isn't running already)
896   //   that invokes ProcessPendingUIUpdates.
897   void ScheduleUIUpdate(const TabContents* source, unsigned changed_flags);
898 
899   // Processes all pending updates to the UI that have been scheduled by
900   // ScheduleUIUpdate in scheduled_updates_.
901   void ProcessPendingUIUpdates();
902 
903   // Removes all entries from scheduled_updates_ whose source is contents.
904   void RemoveScheduledUpdatesFor(TabContents* contents);
905 
906   // Getters for UI ///////////////////////////////////////////////////////////
907 
908   // TODO(beng): remove, and provide AutomationProvider a better way to access
909   //             the LocationBarView's edit.
910   friend class AutomationProvider;
911   friend class TestingAutomationProvider;
912 
913   // Returns the StatusBubble from the current toolbar. It is possible for
914   // this to return NULL if called before the toolbar has initialized.
915   // TODO(beng): remove this.
916   StatusBubble* GetStatusBubble();
917 
918   // Session restore functions ////////////////////////////////////////////////
919 
920   // Notifies the history database of the index for all tabs whose index is
921   // >= index.
922   void SyncHistoryWithTabs(int index);
923 
924   // OnBeforeUnload handling //////////////////////////////////////////////////
925 
926   typedef std::set<TabContents*> UnloadListenerSet;
927 
928   // Processes the next tab that needs it's beforeunload/unload event fired.
929   void ProcessPendingTabs();
930 
931   // Whether we've completed firing all the tabs' beforeunload/unload events.
932   bool HasCompletedUnloadProcessing() const;
933 
934   // Clears all the state associated with processing tabs' beforeunload/unload
935   // events since the user cancelled closing the window.
936   void CancelWindowClose();
937 
938   // Removes |tab| from the passed |set|.
939   // Returns whether the tab was in the set in the first place.
940   // TODO(beng): this method needs a better name!
941   bool RemoveFromSet(UnloadListenerSet* set, TabContents* tab);
942 
943   // Cleans up state appropriately when we are trying to close the browser and
944   // the tab has finished firing its unload handler. We also use this in the
945   // cases where a tab crashes or hangs even if the beforeunload/unload haven't
946   // successfully fired. If |process_now| is true |ProcessPendingTabs| is
947   // invoked immediately, otherwise it is invoked after a delay (PostTask).
948   //
949   // Typically you'll want to pass in true for |process_now|. Passing in true
950   // may result in deleting |tab|. If you know that shouldn't happen (because of
951   // the state of the stack), pass in false.
952   void ClearUnloadState(TabContents* tab, bool process_now);
953 
954   // In-progress download termination handling /////////////////////////////////
955 
956   // Called when the window is closing to check if potential in-progress
957   // downloads should prevent it from closing.
958   // Returns true if the window can close, false otherwise.
959   bool CanCloseWithInProgressDownloads();
960 
961   // Assorted utility functions ///////////////////////////////////////////////
962 
963   // Sets the delegate of all the parts of the |TabContentsWrapper| that
964   // are needed.
965   void SetAsDelegate(TabContentsWrapper* tab, Browser* delegate);
966 
967   // Shows the Find Bar, optionally selecting the next entry that matches the
968   // existing search string for that Tab. |forward_direction| controls the
969   // search direction.
970   void FindInPage(bool find_next, bool forward_direction);
971 
972   // Closes the frame.
973   // TODO(beng): figure out if we need this now that the frame itself closes
974   //             after a return to the message loop.
975   void CloseFrame();
976 
977   void TabDetachedAtImpl(TabContentsWrapper* contents,
978       int index, DetachType type);
979 
980   // Create a preference dictionary for the provided application name, in the
981   // given user profile. This is done only once per application name / per
982   // session / per user profile.
983   static void RegisterAppPrefs(const std::string& app_name, Profile* profile);
984 
985   // Shared code between Reload() and ReloadIgnoringCache().
986   void ReloadInternal(WindowOpenDisposition disposition, bool ignore_cache);
987 
988   // Return true if the window dispositions means opening a new tab.
989   bool ShouldOpenNewTabForWindowDisposition(WindowOpenDisposition disposition);
990 
991   // Depending on the disposition, return the current tab or a clone of the
992   // current tab.
993   TabContents* GetOrCloneTabForDisposition(WindowOpenDisposition disposition);
994 
995   // Sets the insertion policy of the tabstrip based on whether vertical tabs
996   // are enabled.
997   void UpdateTabStripModelInsertionPolicy();
998 
999   // Invoked when the use vertical tabs preference changes. Resets the insertion
1000   // policy of the tab strip model and notifies the window.
1001   void UseVerticalTabsChanged();
1002 
1003   // Implementation of SupportsWindowFeature and CanSupportWindowFeature. If
1004   // |check_fullscreen| is true, the set of features reflect the actual state of
1005   // the browser, otherwise the set of features reflect the possible state of
1006   // the browser.
1007   bool SupportsWindowFeatureImpl(WindowFeature feature,
1008                                  bool check_fullscreen) const;
1009 
1010   // Determines if closing of browser can really be permitted after normal
1011   // sequence of downloads and unload handlers have given the go-ahead to close.
1012   // It is called from ShouldCloseWindow.  It checks with
1013   // TabCloseableStateWatcher to confirm if browser can really be closed.
1014   // Appropriate action is taken by watcher as it sees fit.
1015   // If watcher denies closing of browser, CancelWindowClose is called to
1016   // cancel closing of window.
1017   bool IsClosingPermitted();
1018 
1019   // Commits the current instant, returning true on success. This is intended
1020   // for use from OpenCurrentURL.
1021   bool OpenInstant(WindowOpenDisposition disposition);
1022 
1023   // If this browser should have instant one is created, otherwise does nothing.
1024   void CreateInstantIfNecessary();
1025 
1026   // Opens view-source tab for given tab contents.
1027   void ViewSource(TabContentsWrapper* tab);
1028 
1029   // Creates a NavigateParams struct for a singleton tab navigation.
1030   browser::NavigateParams GetSingletonTabNavigateParams(const GURL& url);
1031 
1032   // Opens view-source tab for any frame within given tab contents.
1033   void ViewSource(TabContentsWrapper* tab,
1034                   const GURL& url,
1035                   const std::string& content_state);
1036 
1037   // Data members /////////////////////////////////////////////////////////////
1038 
1039   NotificationRegistrar registrar_;
1040 
1041   // This Browser's type.
1042   const Type type_;
1043 
1044   // This Browser's profile.
1045   Profile* const profile_;
1046 
1047   // This Browser's window.
1048   BrowserWindow* window_;
1049 
1050   // This Browser's current TabHandler.
1051   scoped_ptr<TabHandler> tab_handler_;
1052 
1053   // The CommandUpdater that manages the browser window commands.
1054   CommandUpdater command_updater_;
1055 
1056   // An optional application name which is used to retrieve and save window
1057   // positions.
1058   std::string app_name_;
1059 
1060   // Unique identifier of this browser for session restore. This id is only
1061   // unique within the current session, and is not guaranteed to be unique
1062   // across sessions.
1063   const SessionID session_id_;
1064 
1065   // The model for the toolbar view.
1066   ToolbarModel toolbar_model_;
1067 
1068   // UI update coalescing and handling ////////////////////////////////////////
1069 
1070   typedef std::map<const TabContents*, int> UpdateMap;
1071 
1072   // Maps from TabContents to pending UI updates that need to be processed.
1073   // We don't update things like the URL or tab title right away to avoid
1074   // flickering and extra painting.
1075   // See ScheduleUIUpdate and ProcessPendingUIUpdates.
1076   UpdateMap scheduled_updates_;
1077 
1078   // The following factory is used for chrome update coalescing.
1079   ScopedRunnableMethodFactory<Browser> chrome_updater_factory_;
1080 
1081   // OnBeforeUnload handling //////////////////////////////////////////////////
1082 
1083   // Tracks tabs that need there beforeunload event fired before we can
1084   // close the browser. Only gets populated when we try to close the browser.
1085   UnloadListenerSet tabs_needing_before_unload_fired_;
1086 
1087   // Tracks tabs that need there unload event fired before we can
1088   // close the browser. Only gets populated when we try to close the browser.
1089   UnloadListenerSet tabs_needing_unload_fired_;
1090 
1091   // Whether we are processing the beforeunload and unload events of each tab
1092   // in preparation for closing the browser.
1093   bool is_attempting_to_close_browser_;
1094 
1095   // In-progress download termination handling /////////////////////////////////
1096 
1097   enum CancelDownloadConfirmationState {
1098     NOT_PROMPTED,          // We have not asked the user.
1099     WAITING_FOR_RESPONSE,  // We have asked the user and have not received a
1100                            // reponse yet.
1101     RESPONSE_RECEIVED      // The user was prompted and made a decision already.
1102   };
1103 
1104   // State used to figure-out whether we should prompt the user for confirmation
1105   // when the browser is closed with in-progress downloads.
1106   CancelDownloadConfirmationState cancel_download_confirmation_state_;
1107 
1108   /////////////////////////////////////////////////////////////////////////////
1109 
1110   // Override values for the bounds of the window and its maximized state.
1111   // These are supplied by callers that don't want to use the default values.
1112   // The default values are typically loaded from local state (last session),
1113   // obtained from the last window of the same type, or obtained from the
1114   // shell shortcut's startup info.
1115   gfx::Rect override_bounds_;
1116   MaximizedState maximized_state_;
1117 
1118   // The following factory is used to close the frame at a later time.
1119   ScopedRunnableMethodFactory<Browser> method_factory_;
1120 
1121   // The Find Bar. This may be NULL if there is no Find Bar, and if it is
1122   // non-NULL, it may or may not be visible.
1123   scoped_ptr<FindBarController> find_bar_controller_;
1124 
1125   // Dialog box used for opening and saving files.
1126   scoped_refptr<SelectFileDialog> select_file_dialog_;
1127 
1128   // Keep track of the encoding auto detect pref.
1129   BooleanPrefMember encoding_auto_detect_;
1130 
1131   // Keep track of the printing enabled pref.
1132   BooleanPrefMember printing_enabled_;
1133 
1134   // Keep track of the development tools disabled pref.
1135   BooleanPrefMember dev_tools_disabled_;
1136 
1137   // Keep track of when instant enabled changes.
1138   BooleanPrefMember instant_enabled_;
1139 
1140   // Tracks the preference that controls whether incognito mode is allowed.
1141   BooleanPrefMember incognito_mode_allowed_;
1142 
1143   // Tracks whether bookmarks can be modified.
1144   BooleanPrefMember edit_bookmarks_enabled_;
1145 
1146   // Indicates if command execution is blocked.
1147   bool block_command_execution_;
1148 
1149   // Stores the last blocked command id when |block_command_execution_| is true.
1150   int last_blocked_command_id_;
1151 
1152   // Stores the disposition type of the last blocked command.
1153   WindowOpenDisposition last_blocked_command_disposition_;
1154 
1155   // Different types of action when web app info is available.
1156   // OnDidGetApplicationInfo uses this to dispatch calls.
1157   enum WebAppAction {
1158     NONE,             // No action at all.
1159     CREATE_SHORTCUT,  // Bring up create application shortcut dialog.
1160     UPDATE_SHORTCUT   // Update icon for app shortcut.
1161   };
1162 
1163   // Which deferred action to perform when OnDidGetApplicationInfo is notified
1164   // from a TabContents. Currently, only one pending action is allowed.
1165   WebAppAction pending_web_app_action_;
1166 
1167   // Tracks the display mode of the tabstrip.
1168   mutable BooleanPrefMember use_vertical_tabs_;
1169 
1170   // The profile's tab restore service. The service is owned by the profile,
1171   // and we install ourselves as an observer.
1172   TabRestoreService* tab_restore_service_;
1173 
1174   // Helper which implements the TabRestoreServiceDelegate interface.
1175   scoped_ptr<BrowserTabRestoreServiceDelegate> tab_restore_service_delegate_;
1176 
1177   scoped_ptr<InstantController> instant_;
1178   scoped_ptr<InstantUnloadHandler> instant_unload_handler_;
1179 
1180   DISALLOW_COPY_AND_ASSIGN(Browser);
1181 };
1182 
1183 #endif  // CHROME_BROWSER_UI_BROWSER_H_
1184