// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_ #define CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_ #pragma once #include <vector> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/memory/ref_counted.h" #include "ui/gfx/native_widget_types.h" class CommandLine; class FilePath; class GURL; class Profile; class ProcessSingleton; class ImporterHost; class ImporterList; // This class contains the chrome first-run installation actions needed to // fully test the custom installer. It also contains the opposite actions to // execute during uninstall. When the first run UI is ready we won't // do the actions unconditionally. Currently the only action is to create a // desktop shortcut. // // The way we detect first-run is by looking at a 'sentinel' file. // If it does not exist we understand that we need to do the first time // install work for this user. After that the sentinel file is created. class FirstRun { public: // There are three types of possible first run bubbles: enum BubbleType { LARGE_BUBBLE, // The normal bubble, with search engine choice OEM_BUBBLE, // Smaller bubble for OEM builds MINIMAL_BUBBLE // Minimal bubble shown after search engine dialog }; // See ProcessMasterPreferences for more info about this structure. struct MasterPrefs { MasterPrefs(); ~MasterPrefs(); int ping_delay; bool homepage_defined; int do_import_items; int dont_import_items; bool run_search_engine_experiment; bool randomize_search_engine_experiment; bool make_chrome_default; std::vector<GURL> new_tabs; std::vector<GURL> bookmarks; }; // Import bookmarks and/or browser items (depending on platform support) // in this process. This function is paired with FirstRun::ImportSettings(). // This function might or might not show a visible UI depending on the // cmdline parameters. static int ImportNow(Profile* profile, const CommandLine& cmdline); // Automatically import history and home page (and search engine, if // ShouldShowSearchEngineDialog is true). static void AutoImport( Profile* profile, bool homepage_defined, int import_items, int dont_import_items, bool search_engine_experiment, bool randomize_search_engine_experiment, bool make_chrome_default, ProcessSingleton* process_singleton); // Does platform specific setup. Called at the start of AutoImport. static void PlatformSetup(); // Returns whether the first run should be "organic". static bool IsOrganicFirstRun(); // The master preferences is a JSON file with the same entries as the // 'Default\Preferences' file. This function locates this file from a standard // location and processes it so it becomes the default preferences in the // profile pointed to by |user_data_dir|. After processing the file, the // function returns true if and only if showing the first run dialog is // needed. The detailed settings in the preference file are reported via // |preference_details|. // // This function destroys any existing prefs file and it is meant to be // invoked only on first run. // // See chrome/installer/util/master_preferences.h for a description of // 'master_preferences' file. static bool ProcessMasterPreferences(const FilePath& user_data_dir, MasterPrefs* out_prefs); // Returns true if this is the first time chrome is run for this user. static bool IsChromeFirstRun(); // Creates the sentinel file that signals that chrome has been configured. static bool CreateSentinel(); // Removes the sentinel file created in ConfigDone(). Returns false if the // sentinel file could not be removed. static bool RemoveSentinel(); // Imports settings. This may be done in a separate process depending on the // platform, but it will always block until done. The return value indicates // success. static bool ImportSettings(Profile* profile, scoped_refptr<ImporterHost> importer_host, scoped_refptr<ImporterList> importer_list, int items_to_import); // Sets the kShouldShowFirstRunBubble local state pref so that the browser // shows the bubble once the main message loop gets going (or refrains from // showing the bubble, if |show_bubble| is false). Returns false if the pref // could not be set. This function can be called multiple times, but only the // initial call will actually set the preference. static bool SetShowFirstRunBubblePref(bool show_bubble); // Sets the kShouldUseOEMFirstRunBubble local state pref so that the // browser shows the OEM first run bubble once the main message loop // gets going. Returns false if the pref could not be set. static bool SetOEMFirstRunBubblePref(); // Sets the kShouldUseMinimalFirstRunBubble local state pref so that the // browser shows the minimal first run bubble once the main message loop // gets going. Returns false if the pref could not be set. static bool SetMinimalFirstRunBubblePref(); // Sets the kShouldShowWelcomePage local state pref so that the browser // loads the welcome tab once the message loop gets going. Returns false // if the pref could not be set. static bool SetShowWelcomePagePref(); // Sets the kAutofillPersonalDataManagerFirstRun local state pref so that the // browser loads PersonalDataManager once the main message loop gets going. // Returns false if the pref could not be set. static bool SetPersonalDataManagerFirstRunPref(); // True if special circumstances should prevent the search engine ballot from // being shown. static bool SearchEngineSelectorDisallowed(); private: friend class FirstRunTest; FRIEND_TEST_ALL_PREFIXES(Toolbar5ImporterTest, BookmarkParse); #if defined(OS_WIN) // Writes the EULA to a temporary file, returned in |*eula_path|, and returns // true if successful. static bool WriteEULAtoTempFile(FilePath* eula_path); // Launches the setup exe with the given parameter/value on the command-line, // waits for its termination, returns its exit code in |*ret_code|, and // returns true if the exit code is valid. static bool LaunchSetupWithParam(const std::string& param, const std::wstring& value, int* ret_code); // Installs a task to do an extensions update check once the extensions system // is running. static void DoDelayedInstallExtensions(); // Imports settings in a separate process. It is the implementation of the // public version. |skip_first_run_ui| is true if no first run UI should // appear (search engine dialog, Firefox import warning dialog). static bool ImportSettings(Profile* profile, int importer_type, int items_to_import, const FilePath& import_path, bool skip_first_run_ui, gfx::NativeView parent_window); // Import browser items in this process. The browser and the items to // import are encoded int the command line. static int ImportFromBrowser(Profile* profile, const CommandLine& cmdline); #else static bool ImportBookmarks(const FilePath& import_bookmarks_path); #endif // Import bookmarks from an html file. The path to the file is provided in // the command line. static int ImportFromFile(Profile* profile, const CommandLine& cmdline); // Gives the full path to the sentinel file. The file might not exist. static bool GetFirstRunSentinelFilePath(FilePath* path); enum FirstRunState { FIRST_RUN_UNKNOWN, // The state is not tested or set yet. FIRST_RUN_TRUE, FIRST_RUN_FALSE }; // This variable should only be accessed through IsChromeFirstRun(). static FirstRunState first_run_; // This class is for scoping purposes. DISALLOW_IMPLICIT_CONSTRUCTORS(FirstRun); }; #endif // CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_