• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #pragma once
8 
9 #include <vector>
10 
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/gtest_prod_util.h"
14 #include "base/memory/ref_counted.h"
15 #include "ui/gfx/native_widget_types.h"
16 
17 class CommandLine;
18 class FilePath;
19 class GURL;
20 class Profile;
21 class ProcessSingleton;
22 class ImporterHost;
23 class ImporterList;
24 
25 // This class 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 class FirstRun {
35  public:
36   // There are three types of possible first run bubbles:
37   enum BubbleType {
38     LARGE_BUBBLE,      // The normal bubble, with search engine choice
39     OEM_BUBBLE,        // Smaller bubble for OEM builds
40     MINIMAL_BUBBLE     // Minimal bubble shown after search engine dialog
41   };
42 
43   // See ProcessMasterPreferences for more info about this structure.
44   struct MasterPrefs {
45     MasterPrefs();
46     ~MasterPrefs();
47 
48     int ping_delay;
49     bool homepage_defined;
50     int do_import_items;
51     int dont_import_items;
52     bool run_search_engine_experiment;
53     bool randomize_search_engine_experiment;
54     bool make_chrome_default;
55     std::vector<GURL> new_tabs;
56     std::vector<GURL> bookmarks;
57   };
58 
59   // Import bookmarks and/or browser items (depending on platform support)
60   // in this process. This function is paired with FirstRun::ImportSettings().
61   // This function might or might not show a visible UI depending on the
62   // cmdline parameters.
63   static int ImportNow(Profile* profile, const CommandLine& cmdline);
64 
65   // Automatically import history and home page (and search engine, if
66   // ShouldShowSearchEngineDialog is true).
67   static void AutoImport(
68       Profile* profile,
69       bool homepage_defined,
70       int import_items,
71       int dont_import_items,
72       bool search_engine_experiment,
73       bool randomize_search_engine_experiment,
74       bool make_chrome_default,
75       ProcessSingleton* process_singleton);
76 
77   // Does platform specific setup. Called at the start of AutoImport.
78   static void PlatformSetup();
79 
80   // Returns whether the first run should be "organic".
81   static bool IsOrganicFirstRun();
82 
83   // The master preferences is a JSON file with the same entries as the
84   // 'Default\Preferences' file. This function locates this file from a standard
85   // location and processes it so it becomes the default preferences in the
86   // profile pointed to by |user_data_dir|. After processing the file, the
87   // function returns true if and only if showing the first run dialog is
88   // needed. The detailed settings in the preference file are reported via
89   // |preference_details|.
90   //
91   // This function destroys any existing prefs file and it is meant to be
92   // invoked only on first run.
93   //
94   // See chrome/installer/util/master_preferences.h for a description of
95   // 'master_preferences' file.
96   static bool ProcessMasterPreferences(const FilePath& user_data_dir,
97                                        MasterPrefs* out_prefs);
98 
99   // Returns true if this is the first time chrome is run for this user.
100   static bool IsChromeFirstRun();
101 
102   // Creates the sentinel file that signals that chrome has been configured.
103   static bool CreateSentinel();
104 
105   // Removes the sentinel file created in ConfigDone(). Returns false if the
106   // sentinel file could not be removed.
107   static bool RemoveSentinel();
108 
109   // Imports settings. This may be done in a separate process depending on the
110   // platform, but it will always block until done. The return value indicates
111   // success.
112   static bool ImportSettings(Profile* profile,
113                              scoped_refptr<ImporterHost> importer_host,
114                              scoped_refptr<ImporterList> importer_list,
115                              int items_to_import);
116 
117   // Sets the kShouldShowFirstRunBubble local state pref so that the browser
118   // shows the bubble once the main message loop gets going (or refrains from
119   // showing the bubble, if |show_bubble| is false). Returns false if the pref
120   // could not be set. This function can be called multiple times, but only the
121   // initial call will actually set the preference.
122   static bool SetShowFirstRunBubblePref(bool show_bubble);
123 
124   // Sets the kShouldUseOEMFirstRunBubble local state pref so that the
125   // browser shows the OEM first run bubble once the main message loop
126   // gets going. Returns false if the pref could not be set.
127   static bool SetOEMFirstRunBubblePref();
128 
129   // Sets the kShouldUseMinimalFirstRunBubble local state pref so that the
130   // browser shows the minimal first run bubble once the main message loop
131   // gets going. Returns false if the pref could not be set.
132   static bool SetMinimalFirstRunBubblePref();
133 
134   // Sets the kShouldShowWelcomePage local state pref so that the browser
135   // loads the welcome tab once the message loop gets going. Returns false
136   // if the pref could not be set.
137   static bool SetShowWelcomePagePref();
138 
139   // Sets the kAutofillPersonalDataManagerFirstRun local state pref so that the
140   // browser loads PersonalDataManager once the main message loop gets going.
141   // Returns false if the pref could not be set.
142   static bool SetPersonalDataManagerFirstRunPref();
143 
144   // True if special circumstances should prevent the search engine ballot from
145   // being shown.
146   static bool SearchEngineSelectorDisallowed();
147 
148  private:
149   friend class FirstRunTest;
150   FRIEND_TEST_ALL_PREFIXES(Toolbar5ImporterTest, BookmarkParse);
151 
152 #if defined(OS_WIN)
153   // Writes the EULA to a temporary file, returned in |*eula_path|, and returns
154   // true if successful.
155   static bool WriteEULAtoTempFile(FilePath* eula_path);
156 
157   // Launches the setup exe with the given parameter/value on the command-line,
158   // waits for its termination, returns its exit code in |*ret_code|, and
159   // returns true if the exit code is valid.
160   static bool LaunchSetupWithParam(const std::string& param,
161                                    const std::wstring& value,
162                                    int* ret_code);
163 
164   // Installs a task to do an extensions update check once the extensions system
165   // is running.
166   static void DoDelayedInstallExtensions();
167 
168   // Imports settings in a separate process. It is the implementation of the
169   // public version.  |skip_first_run_ui| is true if no first run UI should
170   // appear (search engine dialog, Firefox import warning dialog).
171   static bool ImportSettings(Profile* profile,
172                              int importer_type,
173                              int items_to_import,
174                              const FilePath& import_path,
175                              bool skip_first_run_ui,
176                              gfx::NativeView parent_window);
177 
178   // Import browser items in this process. The browser and the items to
179   // import are encoded int the command line.
180   static int ImportFromBrowser(Profile* profile, const CommandLine& cmdline);
181 
182 #else
183   static bool ImportBookmarks(const FilePath& import_bookmarks_path);
184 #endif
185 
186   // Import bookmarks from an html file. The path to the file is provided in
187   // the command line.
188   static int ImportFromFile(Profile* profile, const CommandLine& cmdline);
189 
190   // Gives the full path to the sentinel file. The file might not exist.
191   static bool GetFirstRunSentinelFilePath(FilePath* path);
192 
193   enum FirstRunState {
194     FIRST_RUN_UNKNOWN,  // The state is not tested or set yet.
195     FIRST_RUN_TRUE,
196     FIRST_RUN_FALSE
197   };
198 
199   // This variable should only be accessed through IsChromeFirstRun().
200   static FirstRunState first_run_;
201 
202   // This class is for scoping purposes.
203   DISALLOW_IMPLICIT_CONSTRUCTORS(FirstRun);
204 };
205 
206 #endif  // CHROME_BROWSER_FIRST_RUN_FIRST_RUN_H_
207