• 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_INIT_H_
6 #define CHROME_BROWSER_UI_BROWSER_INIT_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/basictypes.h"
13 #include "base/file_path.h"
14 #include "base/gtest_prod_util.h"
15 #include "googleurl/src/gurl.h"
16 
17 class Browser;
18 class CommandLine;
19 class GURL;
20 class Profile;
21 class TabContents;
22 
23 // class containing helpers for BrowserMain to spin up a new instance and
24 // initialize the profile.
25 class BrowserInit {
26  public:
27   BrowserInit();
28   ~BrowserInit();
29 
30   // Adds a url to be opened during first run. This overrides the standard
31   // tabs shown at first run.
32   void AddFirstRunTab(const GURL& url);
33 
34   // This function is equivalent to ProcessCommandLine but should only be
35   // called during actual process startup.
Start(const CommandLine & cmd_line,const FilePath & cur_dir,Profile * profile,int * return_code)36   bool Start(const CommandLine& cmd_line, const FilePath& cur_dir,
37              Profile* profile, int* return_code) {
38     return ProcessCmdLineImpl(cmd_line, cur_dir, true, profile, return_code,
39                               this);
40   }
41 
42   // This function performs command-line handling and is invoked when process
43   // starts as well as when we get a start request from another process (via the
44   // WM_COPYDATA message). |command_line| holds the command line we need to
45   // process - either from this process or from some other one (if
46   // |process_startup| is true and we are being called from
47   // ProcessSingleton::OnCopyData).
ProcessCommandLine(const CommandLine & cmd_line,const FilePath & cur_dir,bool process_startup,Profile * profile,int * return_code)48   static bool ProcessCommandLine(const CommandLine& cmd_line,
49                                  const FilePath& cur_dir, bool process_startup,
50                                  Profile* profile, int* return_code) {
51     return ProcessCmdLineImpl(cmd_line, cur_dir, process_startup, profile,
52                               return_code, NULL);
53   }
54 
55   template <class AutomationProviderClass>
56   static bool CreateAutomationProvider(const std::string& channel_id,
57                                        Profile* profile,
58                                        size_t expected_tabs);
59 
60   // Returns true if the browser is coming up.
61   static bool InProcessStartup();
62 
63   // Launches a browser window associated with |profile|. |command_line| should
64   // be the command line passed to this process. |cur_dir| can be empty, which
65   // implies that the directory of the executable should be used.
66   // |process_startup| indicates whether this is the first browser.
67   bool LaunchBrowser(const CommandLine& command_line, Profile* profile,
68                      const FilePath& cur_dir, bool process_startup,
69                      int* return_code);
70 
71   // LaunchWithProfile ---------------------------------------------------------
72   //
73   // Assists launching the application and appending the initial tabs for a
74   // browser window.
75 
76   class LaunchWithProfile {
77    public:
78     // Used by OpenTabsInBrowser.
79     struct Tab {
80       Tab();
81       ~Tab();
82 
83       // The url to load.
84       GURL url;
85 
86       // If true, the tab corresponds to an app an |app_id| gives the id of the
87       // app.
88       bool is_app;
89 
90       // True if the is tab pinned.
91       bool is_pinned;
92 
93       // Id of the app.
94       std::string app_id;
95     };
96 
97     // There are two ctors. The first one implies a NULL browser_init object
98     // and thus no access to distribution-specific first-run behaviors. The
99     // second one is always called when the browser starts even if it is not
100     // the first run.
101     LaunchWithProfile(const FilePath& cur_dir, const CommandLine& command_line);
102     LaunchWithProfile(const FilePath& cur_dir, const CommandLine& command_line,
103                       BrowserInit* browser_init);
104     ~LaunchWithProfile();
105 
106     // Creates the necessary windows for startup. Returns true on success,
107     // false on failure. process_startup is true if Chrome is just
108     // starting up. If process_startup is false, it indicates Chrome was
109     // already running and the user wants to launch another instance.
110     bool Launch(Profile* profile,
111                 const std::vector<GURL>& urls_to_open,
112                 bool process_startup);
113 
114     // Convenience for OpenTabsInBrowser that converts |urls| into a set of
115     // Tabs.
116     Browser* OpenURLsInBrowser(Browser* browser,
117                                bool process_startup,
118                                const std::vector<GURL>& urls);
119 
120     // Creates a tab for each of the Tabs in |tabs|. If browser is non-null
121     // and a tabbed browser, the tabs are added to it. Otherwise a new tabbed
122     // browser is created and the tabs are added to it. The browser the tabs
123     // are added to is returned, which is either |browser| or the newly created
124     // browser.
125     Browser* OpenTabsInBrowser(Browser* browser,
126                                bool process_startup,
127                                const std::vector<Tab>& tabs);
128 
129    private:
130     FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs);
131     FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
132 
133     // If the process was launched with the web application command line flags,
134     // e.g. --app=http://www.google.com/ or --app_id=... return true.
135     // In this case |app_url| or |app_id| are populated if they're non-null.
136     bool IsAppLaunch(std::string* app_url, std::string* app_id);
137 
138     // If IsAppLaunch is true, tries to open an application window.
139     // If the app is specified to start in a tab, or IsAppLaunch is false,
140     // returns false to specify default processing.
141     bool OpenApplicationWindow(Profile* profile);
142 
143     // If IsAppLaunch is true and the user set a pref indicating that the app
144     // should open in a tab, do so.
145     bool OpenApplicationTab(Profile* profile);
146 
147     // Invoked from OpenURLsInBrowser to handle processing of urls. This may
148     // do any of the following:
149     // . Invoke ProcessStartupURLs if |process_startup| is true.
150     // . Restore the last session if necessary.
151     // . Open the urls directly.
152     void ProcessLaunchURLs(bool process_startup,
153                            const std::vector<GURL>& urls_to_open);
154 
155     // Does the following:
156     // . If the user's startup pref is to restore the last session (or the
157     //   command line flag is present to force using last session), it is
158     //   restored, and true is returned.
159     // . Attempts to restore any pinned tabs from last run of chrome and:
160     //   . If urls_to_open is non-empty, they are opened and true is returned.
161     //   . If the user's startup pref is to launch a specific set of URLs they
162     //     are opened.
163     //
164     // Otherwise false is returned, which indicates the caller must create a
165     // new browser.
166     bool ProcessStartupURLs(const std::vector<GURL>& urls_to_open);
167 
168     // Adds a Tab to |tabs| for each url in |urls| that doesn't already exist
169     // in |tabs|.
170     void AddUniqueURLs(const std::vector<GURL>& urls,
171                        std::vector<Tab>* tabs);
172 
173     // Adds any startup infobars to the selected tab of the given browser.
174     void AddInfoBarsIfNecessary(Browser* browser);
175 
176     // If the last session didn't exit cleanly and tab is a web contents tab,
177     // an infobar is added allowing the user to restore the last session.
178     void AddCrashedInfoBarIfNecessary(TabContents* tab);
179 
180     // If we have been started with unsupported flags like --single-process,
181     // politely nag the user about it.
182     void AddBadFlagsInfoBarIfNecessary(TabContents* tab);
183 
184     // If DNS based certificate checking has been enabled then we show a
185     // warning infobar.
186     void AddDNSCertProvenanceCheckingWarningInfoBarIfNecessary(
187         TabContents* tab);
188 
189     // If the user is using an operating system that we have deprecated
190     // support for and will no longer provide updates, warn the user
191     // about it.
192     void AddObsoleteSystemInfoBarIfNecessary(TabContents* tab);
193 
194     // Adds additional startup URLs to the specified vector.
195     void AddStartupURLs(std::vector<GURL>* startup_urls) const;
196 
197     // Checks whether Chrome is still the default browser (unless the user
198     // previously instructed not to do so) and warns the user if it is not.
199     void CheckDefaultBrowser(Profile* profile);
200 
201     const FilePath cur_dir_;
202     const CommandLine& command_line_;
203     Profile* profile_;
204     BrowserInit* browser_init_;
205     DISALLOW_COPY_AND_ASSIGN(LaunchWithProfile);
206   };
207 
208  private:
209   // Returns the list of URLs to open from the command line. The returned
210   // vector is empty if the user didn't specify any URLs on the command line.
211   static std::vector<GURL> GetURLsFromCommandLine(
212       const CommandLine& command_line,
213       const FilePath& cur_dir,
214       Profile* profile);
215 
216   static bool ProcessCmdLineImpl(const CommandLine& command_line,
217                                  const FilePath& cur_dir, bool process_startup,
218                                  Profile* profile, int* return_code,
219                                  BrowserInit* browser_init);
220 
221   // Additional tabs to open during first run.
222   std::vector<GURL> first_run_tabs_;
223 
224   DISALLOW_COPY_AND_ASSIGN(BrowserInit);
225 };
226 
227 #endif  // CHROME_BROWSER_UI_BROWSER_INIT_H_
228