1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
// 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_
|