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_FIRST_RUN_FIRST_RUN_H_ 6 #define CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 13 class GURL; 14 class Profile; 15 16 namespace base { 17 class CommandLine; 18 class FilePath; 19 } 20 21 namespace user_prefs { 22 class PrefRegistrySyncable; 23 } 24 25 // This namespace contains the chrome first-run installation actions needed to 26 // fully test the custom installer. It also contains the opposite actions to 27 // execute during uninstall. When the first run UI is ready we won't 28 // do the actions unconditionally. Currently the only action is to create a 29 // desktop shortcut. 30 // 31 // The way we detect first-run is by looking at a 'sentinel' file. 32 // If it does not exist we understand that we need to do the first time 33 // install work for this user. After that the sentinel file is created. 34 namespace first_run { 35 36 enum AutoImportState { 37 AUTO_IMPORT_NONE = 0, 38 AUTO_IMPORT_CALLED = 1 << 0, 39 AUTO_IMPORT_PROFILE_IMPORTED = 1 << 1, 40 AUTO_IMPORT_BOOKMARKS_FILE_IMPORTED = 1 << 2, 41 }; 42 43 enum FirstRunBubbleMetric { 44 FIRST_RUN_BUBBLE_SHOWN = 0, // The search engine bubble was shown. 45 FIRST_RUN_BUBBLE_CHANGE_INVOKED, // The bubble's "Change" was invoked. 46 NUM_FIRST_RUN_BUBBLE_METRICS 47 }; 48 49 // Options for the first run bubble. The default is FIRST_RUN_BUBBLE_DONT_SHOW. 50 // FIRST_RUN_BUBBLE_SUPPRESS is stronger in that FIRST_RUN_BUBBLE_SHOW should 51 // never be set once FIRST_RUN_BUBBLE_SUPPRESS is set. 52 enum FirstRunBubbleOptions { 53 FIRST_RUN_BUBBLE_DONT_SHOW, 54 FIRST_RUN_BUBBLE_SUPPRESS, 55 FIRST_RUN_BUBBLE_SHOW, 56 }; 57 58 enum ProcessMasterPreferencesResult { 59 FIRST_RUN_PROCEED = 0, // Proceed with first run. 60 EULA_EXIT_NOW, // Should immediately exit due to EULA flow. 61 }; 62 63 // See ProcessMasterPreferences for more info about this structure. 64 struct MasterPrefs { 65 MasterPrefs(); 66 ~MasterPrefs(); 67 68 // TODO(macourteau): as part of the master preferences refactoring effort, 69 // remove items from here which are being stored temporarily only to be later 70 // dumped into local_state. Also see related TODO in chrome_browser_main.cc. 71 72 int ping_delay; 73 bool homepage_defined; 74 int do_import_items; 75 int dont_import_items; 76 bool make_chrome_default_for_user; 77 bool suppress_first_run_default_browser_prompt; 78 std::vector<GURL> new_tabs; 79 std::vector<GURL> bookmarks; 80 std::string import_bookmarks_path; 81 std::string variations_seed; 82 std::string variations_seed_signature; 83 std::string suppress_default_browser_prompt_for_version; 84 }; 85 86 // Returns true if this is the first time chrome is run for this user. 87 bool IsChromeFirstRun(); 88 89 #if defined(OS_MACOSX) 90 // Returns true if |command_line|'s switches explicitly specify that first run 91 // should be suppressed in the current run. 92 bool IsFirstRunSuppressed(const base::CommandLine& command_line); 93 #endif 94 95 // Creates the first run sentinel if needed. This should only be called after 96 // the process singleton has been grabbed by the current process 97 // (http://crbug.com/264694). 98 void CreateSentinelIfNeeded(); 99 100 // Get RLZ ping delay pref name. 101 std::string GetPingDelayPrefName(); 102 103 // Register user preferences used by the MasterPrefs structure. 104 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 105 106 // Sets the kShowFirstRunBubbleOption local state pref so that the browser 107 // shows the bubble once the main message loop gets going (or refrains from 108 // showing the bubble, if |show_bubble| is not FIRST_RUN_BUBBLE_SHOW). 109 // Once FIRST_RUN_BUBBLE_SUPPRESS is set, no other value can be set. 110 // Returns false if the pref service could not be retrieved. 111 bool SetShowFirstRunBubblePref(FirstRunBubbleOptions show_bubble_option); 112 113 // Sets a flag that will cause ShouldShowWelcomePage to return true 114 // exactly once, so that the browser loads the welcome tab once the 115 // message loop gets going. 116 void SetShouldShowWelcomePage(); 117 118 // Returns true if the welcome page should be shown. 119 // 120 // This will return true only once: The first time it is called after 121 // SetShouldShowWelcomePage() is called. 122 bool ShouldShowWelcomePage(); 123 124 // Sets a flag that will cause ShouldDoPersonalDataManagerFirstRun() 125 // to return true exactly once, so that the browser loads 126 // PersonalDataManager once the main message loop gets going. 127 void SetShouldDoPersonalDataManagerFirstRun(); 128 129 // Returns true if the autofill personal data manager first-run action 130 // should be taken. 131 // 132 // This will return true only once, the first time it is called after 133 // SetShouldDoPersonalDataManagerFirstRun() is called. 134 bool ShouldDoPersonalDataManagerFirstRun(); 135 136 // Log a metric for the "FirstRun.SearchEngineBubble" histogram. 137 void LogFirstRunMetric(FirstRunBubbleMetric metric); 138 139 // Automatically import history and home page (and search engine, if 140 // ShouldShowSearchEngineDialog is true). Also imports bookmarks from file if 141 // |import_bookmarks_path| is not empty. 142 void AutoImport(Profile* profile, 143 bool homepage_defined, 144 int import_items, 145 int dont_import_items, 146 const std::string& import_bookmarks_path); 147 148 // Does remaining first run tasks. This can pop the first run consent dialog on 149 // linux. |make_chrome_default_for_user| is the value of 150 // kMakeChromeDefaultForUser in master_preferences which contributes to the 151 // decision of making chrome default browser in post import tasks. 152 void DoPostImportTasks(Profile* profile, bool make_chrome_default_for_user); 153 154 // Returns the current state of AutoImport as recorded in a bitfield formed from 155 // values in AutoImportState. 156 uint16 auto_import_state(); 157 158 // Set a master preferences file path that overrides platform defaults. 159 void SetMasterPrefsPathForTesting(const base::FilePath& master_prefs); 160 161 // The master_preferences is a JSON file with the same entries as the 162 // 'Default\Preferences' file. This function locates this file from a standard 163 // location, processes it, and uses its content to initialize the preferences 164 // for the profile pointed to by |user_data_dir|. After processing the file, 165 // this function returns a value from the ProcessMasterPreferencesResult enum, 166 // indicating whether the first run flow should be shown, skipped, or whether 167 // the browser should exit. 168 // 169 // This function overwrites any existing Preferences file and is only meant to 170 // be invoked on first run. 171 // 172 // See chrome/installer/util/master_preferences.h for a description of 173 // 'master_preferences' file. 174 ProcessMasterPreferencesResult ProcessMasterPreferences( 175 const base::FilePath& user_data_dir, 176 MasterPrefs* out_prefs); 177 178 } // namespace first_run 179 180 #endif // CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_ 181