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
18class Browser;
19class Profile;
20class StartupBrowserCreator;
21
22namespace base {
23class CommandLine;
24class FilePath;
25}
26
27namespace content {
28class WebContents;
29}
30
31namespace internals {
32GURL GetWelcomePageURL();
33}
34
35// Assists launching the application and appending the initial tabs for a
36// browser window.
37class 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