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