• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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