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