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