15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_IMPL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_tab.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_types.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StartupBrowserCreator;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internals {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetWelcomePageURL();
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assists launching the application and appending the initial tabs for a
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser window.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StartupBrowserCreatorImpl {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There are two ctors. The first one implies a NULL browser_creator object
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and thus no access to distribution-specific first-run behaviors. The
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // second one is always called when the browser starts even if it is not
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the first run.  |is_first_run| indicates that this is a new profile.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl(const base::FilePath& cur_dir,
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const base::CommandLine& command_line,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            chrome::startup::IsFirstRun is_first_run);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl(const base::FilePath& cur_dir,
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const base::CommandLine& command_line,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            StartupBrowserCreator* browser_creator,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            chrome::startup::IsFirstRun is_first_run);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~StartupBrowserCreatorImpl();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the necessary windows for startup. Returns true on success,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // false on failure. process_startup is true if Chrome is just
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // starting up. If process_startup is false, it indicates Chrome was
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // already running and the user wants to launch another instance.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Launch(Profile* profile,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const std::vector<GURL>& urls_to_open,
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              bool process_startup,
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              chrome::HostDesktopType desktop_type);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convenience for OpenTabsInBrowser that converts |urls| into a set of
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tabs.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* OpenURLsInBrowser(Browser* browser,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool process_startup,
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const std::vector<GURL>& urls,
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             chrome::HostDesktopType desktop_type);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a tab for each of the Tabs in |tabs|. If browser is non-null
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and a tabbed browser, the tabs are added to it. Otherwise a new tabbed
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser is created and the tabs are added to it. The browser the tabs
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are added to is returned, which is either |browser| or the newly created
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* OpenTabsInBrowser(Browser* browser,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool process_startup,
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const StartupTabs& tabs,
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             chrome::HostDesktopType desktop_type);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the process was launched with the web application command line flags,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // e.g. --app=http://www.google.com/ or --app_id=... return true.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In this case |app_url| or |app_id| are populated if they're non-null.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsAppLaunch(std::string* app_url, std::string* app_id);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If IsAppLaunch is true, tries to open an application window.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the app is specified to start in a tab, or IsAppLaunch is false,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns false to specify default processing. |out_app_contents| is an
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // optional argument to receive the created WebContents for the app.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OpenApplicationWindow(Profile* profile,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             content::WebContents** out_app_contents);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If IsAppLaunch is true and the user set a pref indicating that the app
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should open in a tab, do so.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OpenApplicationTab(Profile* profile);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked from Launch to handle processing of urls. This may do any of the
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // following:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . Invoke ProcessStartupURLs if |process_startup| is true.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . If |process_startup| is false, restore the last session if necessary,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   or invoke ProcessSpecifiedURLs.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . Open the urls directly.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessLaunchURLs(bool process_startup,
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         const std::vector<GURL>& urls_to_open,
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         chrome::HostDesktopType desktop_type);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does the following:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . If the user's startup pref is to restore the last session (or the
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   command line flag is present to force using last session), it is
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   restored.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . Otherwise invoke ProcessSpecifiedURLs
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a browser was created, true is returned.  Otherwise returns false and
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the caller must create a new browser.
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool ProcessStartupURLs(const std::vector<GURL>& urls_to_open,
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                          chrome::HostDesktopType desktop_type);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked from either ProcessLaunchURLs or ProcessStartupURLs to handle
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processing of URLs where the behavior is common between process startup
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and launch via an existing process (i.e. those explicitly specified by
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the user somehow).  Does the following:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . Attempts to restore any pinned tabs from last run of chrome.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . If urls_to_open is non-empty, they are opened.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . If the user's startup pref is to launch a specific set of URLs they
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   are opened.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If any tabs were opened, the Browser which was created is returned.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise null is returned and the caller must create a new browser.
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Browser* ProcessSpecifiedURLs(const std::vector<GURL>& urls_to_open,
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                chrome::HostDesktopType desktop_type);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a Tab to |tabs| for each url in |urls| that doesn't already exist
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in |tabs|.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddUniqueURLs(const std::vector<GURL>& urls, StartupTabs* tabs);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds any startup infobars to the selected tab of the given browser.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddInfoBarsIfNecessary(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IsProcessStartup is_process_startup);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds additional startup URLs to the specified vector.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddStartupURLs(std::vector<GURL>* startup_urls) const;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether the Preferences backup is invalid and notifies user in
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that case.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckPreferencesBackup(Profile* profile);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath cur_dir_;
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::CommandLine& command_line_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator* browser_creator_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_first_run_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(StartupBrowserCreatorImpl);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_IMPL_H_
157