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_FIRST_RUN_FIRST_RUN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This namespace contains the chrome first-run installation actions needed to
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fully test the custom installer. It also contains the opposite actions to
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// execute during uninstall. When the first run UI is ready we won't
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// do the actions unconditionally. Currently the only action is to create a
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// desktop shortcut.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The way we detect first-run is by looking at a 'sentinel' file.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If it does not exist we understand that we need to do the first time
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// install work for this user. After that the sentinel file is created.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace first_run {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)enum AutoImportState {
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AUTO_IMPORT_NONE = 0,
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AUTO_IMPORT_CALLED = 1 << 0,
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AUTO_IMPORT_PROFILE_IMPORTED = 1 << 1,
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AUTO_IMPORT_BOOKMARKS_FILE_IMPORTED = 1 << 2,
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum FirstRunBubbleMetric {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FIRST_RUN_BUBBLE_SHOWN = 0,       // The search engine bubble was shown.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FIRST_RUN_BUBBLE_CHANGE_INVOKED,  // The bubble's "Change" was invoked.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NUM_FIRST_RUN_BUBBLE_METRICS
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Options for the first run bubble. The default is FIRST_RUN_BUBBLE_DONT_SHOW.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FIRST_RUN_BUBBLE_SUPPRESS is stronger in that FIRST_RUN_BUBBLE_SHOW should
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// never be set once FIRST_RUN_BUBBLE_SUPPRESS is set.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum FirstRunBubbleOptions {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FIRST_RUN_BUBBLE_DONT_SHOW,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FIRST_RUN_BUBBLE_SUPPRESS,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FIRST_RUN_BUBBLE_SHOW,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ProcessMasterPreferencesResult {
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  FIRST_RUN_PROCEED = 0,  // Proceed with first run.
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EULA_EXIT_NOW,          // Should immediately exit due to EULA flow.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See ProcessMasterPreferences for more info about this structure.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MasterPrefs {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MasterPrefs();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MasterPrefs();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(macourteau): as part of the master preferences refactoring effort,
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // remove items from here which are being stored temporarily only to be later
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // dumped into local_state. Also see related TODO in chrome_browser_main.cc.
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ping_delay;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool homepage_defined;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int do_import_items;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int dont_import_items;
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool make_chrome_default_for_user;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool suppress_first_run_default_browser_prompt;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> new_tabs;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> bookmarks;
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string import_bookmarks_path;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string variations_seed;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string variations_seed_signature;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string suppress_default_browser_prompt_for_version;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if this is the first time chrome is run for this user.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsChromeFirstRun();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_MACOSX)
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Returns true if |command_line|'s switches explicitly specify that first run
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be suppressed in the current run.
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsFirstRunSuppressed(const base::CommandLine& command_line);
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Creates the first run sentinel if needed. This should only be called after
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the process singleton has been grabbed by the current process
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// (http://crbug.com/264694).
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CreateSentinelIfNeeded();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get RLZ ping delay pref name.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetPingDelayPrefName();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Register user preferences used by the MasterPrefs structure.
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sets the kShowFirstRunBubbleOption local state pref so that the browser
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shows the bubble once the main message loop gets going (or refrains from
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// showing the bubble, if |show_bubble| is not FIRST_RUN_BUBBLE_SHOW).
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Once FIRST_RUN_BUBBLE_SUPPRESS is set, no other value can be set.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns false if the pref service could not be retrieved.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SetShowFirstRunBubblePref(FirstRunBubbleOptions show_bubble_option);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sets a flag that will cause ShouldShowWelcomePage to return true
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// exactly once, so that the browser loads the welcome tab once the
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// message loop gets going.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetShouldShowWelcomePage();
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if the welcome page should be shown.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This will return true only once: The first time it is called after
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SetShouldShowWelcomePage() is called.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldShowWelcomePage();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sets a flag that will cause ShouldDoPersonalDataManagerFirstRun()
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to return true exactly once, so that the browser loads
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PersonalDataManager once the main message loop gets going.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetShouldDoPersonalDataManagerFirstRun();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if the autofill personal data manager first-run action
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should be taken.
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This will return true only once, the first time it is called after
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SetShouldDoPersonalDataManagerFirstRun() is called.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldDoPersonalDataManagerFirstRun();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Log a metric for the "FirstRun.SearchEngineBubble" histogram.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LogFirstRunMetric(FirstRunBubbleMetric metric);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Automatically import history and home page (and search engine, if
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// ShouldShowSearchEngineDialog is true). Also imports bookmarks from file if
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |import_bookmarks_path| is not empty.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutoImport(Profile* profile,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bool homepage_defined,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int import_items,
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                int dont_import_items,
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                const std::string& import_bookmarks_path);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Does remaining first run tasks. This can pop the first run consent dialog on
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// linux. |make_chrome_default_for_user| is the value of
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// kMakeChromeDefaultForUser in master_preferences which contributes to the
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// decision of making chrome default browser in post import tasks.
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void DoPostImportTasks(Profile* profile, bool make_chrome_default_for_user);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns the current state of AutoImport as recorded in a bitfield formed from
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// values in AutoImportState.
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)uint16 auto_import_state();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Set a master preferences file path that overrides platform defaults.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetMasterPrefsPathForTesting(const base::FilePath& master_prefs);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The master_preferences is a JSON file with the same entries as the
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'Default\Preferences' file. This function locates this file from a standard
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// location, processes it, and uses its content to initialize the preferences
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// for the profile pointed to by |user_data_dir|. After processing the file,
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// this function returns a value from the ProcessMasterPreferencesResult enum,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicating whether the first run flow should be shown, skipped, or whether
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser should exit.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This function overwrites any existing Preferences file and is only meant to
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// be invoked on first run.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See chrome/installer/util/master_preferences.h for a description of
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'master_preferences' file.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProcessMasterPreferencesResult ProcessMasterPreferences(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& user_data_dir,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MasterPrefs* out_prefs);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace first_run
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_
181