// 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_