Home | History | Annotate | Download | only in startup
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_IMPL_H_
      6 #define CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_IMPL_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/files/file_path.h"
     12 #include "base/gtest_prod_util.h"
     13 #include "chrome/browser/ui/host_desktop.h"
     14 #include "chrome/browser/ui/startup/startup_tab.h"
     15 #include "chrome/browser/ui/startup/startup_types.h"
     16 #include "url/gurl.h"
     17 
     18 class Browser;
     19 class Profile;
     20 class StartupBrowserCreator;
     21 
     22 namespace base {
     23 class CommandLine;
     24 class FilePath;
     25 }
     26 
     27 namespace content {
     28 class WebContents;
     29 }
     30 
     31 namespace internals {
     32 GURL GetWelcomePageURL();
     33 }
     34 
     35 // Assists launching the application and appending the initial tabs for a
     36 // browser window.
     37 class StartupBrowserCreatorImpl {
     38  public:
     39   // There are two ctors. The first one implies a NULL browser_creator object
     40   // and thus no access to distribution-specific first-run behaviors. The
     41   // second one is always called when the browser starts even if it is not
     42   // the first run.  |is_first_run| indicates that this is a new profile.
     43   StartupBrowserCreatorImpl(const base::FilePath& cur_dir,
     44                             const base::CommandLine& command_line,
     45                             chrome::startup::IsFirstRun is_first_run);
     46   StartupBrowserCreatorImpl(const base::FilePath& cur_dir,
     47                             const base::CommandLine& command_line,
     48                             StartupBrowserCreator* browser_creator,
     49                             chrome::startup::IsFirstRun is_first_run);
     50   ~StartupBrowserCreatorImpl();
     51 
     52   // Creates the necessary windows for startup. Returns true on success,
     53   // false on failure. process_startup is true if Chrome is just
     54   // starting up. If process_startup is false, it indicates Chrome was
     55   // already running and the user wants to launch another instance.
     56   bool Launch(Profile* profile,
     57               const std::vector<GURL>& urls_to_open,
     58               bool process_startup,
     59               chrome::HostDesktopType desktop_type);
     60 
     61   // Convenience for OpenTabsInBrowser that converts |urls| into a set of
     62   // Tabs.
     63   Browser* OpenURLsInBrowser(Browser* browser,
     64                              bool process_startup,
     65                              const std::vector<GURL>& urls,
     66                              chrome::HostDesktopType desktop_type);
     67 
     68   // Creates a tab for each of the Tabs in |tabs|. If browser is non-null
     69   // and a tabbed browser, the tabs are added to it. Otherwise a new tabbed
     70   // browser is created and the tabs are added to it. The browser the tabs
     71   // are added to is returned, which is either |browser| or the newly created
     72   // browser.
     73   Browser* OpenTabsInBrowser(Browser* browser,
     74                              bool process_startup,
     75                              const StartupTabs& tabs,
     76                              chrome::HostDesktopType desktop_type);
     77 
     78  private:
     79   FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs);
     80   FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
     81 
     82   // If the process was launched with the web application command line flags,
     83   // e.g. --app=http://www.google.com/ or --app_id=... return true.
     84   // In this case |app_url| or |app_id| are populated if they're non-null.
     85   bool IsAppLaunch(std::string* app_url, std::string* app_id);
     86 
     87   // If IsAppLaunch is true, tries to open an application window.
     88   // If the app is specified to start in a tab, or IsAppLaunch is false,
     89   // returns false to specify default processing. |out_app_contents| is an
     90   // optional argument to receive the created WebContents for the app.
     91   bool OpenApplicationWindow(Profile* profile,
     92                              content::WebContents** out_app_contents);
     93 
     94   // If IsAppLaunch is true and the user set a pref indicating that the app
     95   // should open in a tab, do so.
     96   bool OpenApplicationTab(Profile* profile);
     97 
     98   // Invoked from Launch to handle processing of urls. This may do any of the
     99   // following:
    100   // . Invoke ProcessStartupURLs if |process_startup| is true.
    101   // . If |process_startup| is false, restore the last session if necessary,
    102   //   or invoke ProcessSpecifiedURLs.
    103   // . Open the urls directly.
    104   void ProcessLaunchURLs(bool process_startup,
    105                          const std::vector<GURL>& urls_to_open,
    106                          chrome::HostDesktopType desktop_type);
    107 
    108   // Does the following:
    109   // . If the user's startup pref is to restore the last session (or the
    110   //   command line flag is present to force using last session), it is
    111   //   restored.
    112   // . Otherwise invoke ProcessSpecifiedURLs
    113   // If a browser was created, true is returned.  Otherwise returns false and
    114   // the caller must create a new browser.
    115   bool ProcessStartupURLs(const std::vector<GURL>& urls_to_open,
    116                           chrome::HostDesktopType desktop_type);
    117 
    118   // Invoked from either ProcessLaunchURLs or ProcessStartupURLs to handle
    119   // processing of URLs where the behavior is common between process startup
    120   // and launch via an existing process (i.e. those explicitly specified by
    121   // the user somehow).  Does the following:
    122   // . Attempts to restore any pinned tabs from last run of chrome.
    123   // . If urls_to_open is non-empty, they are opened.
    124   // . If the user's startup pref is to launch a specific set of URLs they
    125   //   are opened.
    126   //
    127   // If any tabs were opened, the Browser which was created is returned.
    128   // Otherwise null is returned and the caller must create a new browser.
    129   Browser* ProcessSpecifiedURLs(const std::vector<GURL>& urls_to_open,
    130                                 chrome::HostDesktopType desktop_type);
    131 
    132   // Adds a Tab to |tabs| for each url in |urls| that doesn't already exist
    133   // in |tabs|.
    134   void AddUniqueURLs(const std::vector<GURL>& urls, StartupTabs* tabs);
    135 
    136   // Adds any startup infobars to the selected tab of the given browser.
    137   void AddInfoBarsIfNecessary(
    138       Browser* browser,
    139       chrome::startup::IsProcessStartup is_process_startup);
    140 
    141   // Adds additional startup URLs to the specified vector.
    142   void AddStartupURLs(std::vector<GURL>* startup_urls) const;
    143 
    144   // Checks whether the Preferences backup is invalid and notifies user in
    145   // that case.
    146   void CheckPreferencesBackup(Profile* profile);
    147 
    148   const base::FilePath cur_dir_;
    149   const base::CommandLine& command_line_;
    150   Profile* profile_;
    151   StartupBrowserCreator* browser_creator_;
    152   bool is_first_run_;
    153   DISALLOW_COPY_AND_ASSIGN(StartupBrowserCreatorImpl);
    154 };
    155 
    156 #endif  // CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_IMPL_H_
    157