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