first_run.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run_dialog.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run_import_observer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run_internal.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/external_process_importer_host.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer_host.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer_list.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer_progress_dialog.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer_progress_observer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_service.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/process_singleton.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/startup_metric_utils.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences_constants.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/util_constants.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilePath GetDefaultPrefFilePath(bool create_profile_dir,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const FilePath& user_data_dir) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath default_pref_dir =
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileManager::GetDefaultProfileDir(user_data_dir);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (create_profile_dir) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!file_util::PathExists(default_pref_dir)) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!file_util::CreateDirectory(default_pref_dir))
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return FilePath();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ProfileManager::GetProfilePrefsPath(default_pref_dir);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the |items| bitfield according to whether the import data specified by
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |import_type| should be be auto imported or not.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetImportItem(PrefService* user_prefs,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const char* pref_path,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int import_items,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int dont_import_items,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   importer::ImportItem import_type,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int& items) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Work out whether an item is to be imported according to what is specified
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in master preferences.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_import = false;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool master_pref_set =
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ((import_items | dont_import_items) & import_type) != 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool master_pref = ((import_items & ~dont_import_items) & import_type) != 0;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (import_type == importer::HISTORY ||
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ((import_type != importer::FAVORITES) &&
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_run::internal::IsOrganicFirstRun())) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // History is always imported unless turned off in master_preferences.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Search engines are only imported in certain builds unless overridden
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in master_preferences.Home page is imported in organic builds only unless
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // turned off in master_preferences.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    should_import = !master_pref_set || master_pref;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Bookmarks are never imported, unless turned on in master_preferences.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Search engine and home page import behaviour is similar in non organic
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // builds.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    should_import = master_pref_set && master_pref;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If an import policy is set, import items according to policy. If no master
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference is set, but a corresponding recommended policy is set, import
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item according to recommended policy. If both a master preference and a
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recommended policy is set, the master preference wins. If neither
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recommended nor managed policies are set, import item according to what we
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // worked out above.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (master_pref_set)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_prefs->SetBoolean(pref_path, should_import);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!user_prefs->FindPreference(pref_path)->IsDefaultValue()) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (user_prefs->GetBoolean(pref_path))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      items |= import_type;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else { // no policy (recommended or managed) is set
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (should_import)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      items |= import_type;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_prefs->ClearPref(pref_path);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Imports bookmarks from an html file. The path to the file is provided in
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the command line.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ImportFromFile(Profile* profile, const CommandLine& cmdline) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath file_path = cmdline.GetSwitchValuePath(switches::kImportFromFile);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (file_path.empty()) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ImporterHost> importer_host(new ImporterHost);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importer_host->set_headless();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importer::SourceProfile source_profile;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_profile.importer_type = importer::TYPE_BOOKMARKS_FILE;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_profile.source_path = file_path;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FirstRunImportObserver importer_observer;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importer::ShowImportProgressDialog(importer::FAVORITES,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     importer_host,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &importer_observer,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     source_profile,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     profile,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     true);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importer_observer.RunLoop();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return importer_observer.import_result();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace first_run {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunState first_run_ = FIRST_RUN_UNKNOWN;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)installer::MasterPreferences* LoadMasterPrefs(FilePath* master_prefs_path)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *master_prefs_path = FilePath(MasterPrefsPath());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (master_prefs_path->empty())
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::MasterPreferences* install_prefs =
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new installer::MasterPreferences(*master_prefs_path);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!install_prefs->read_from_file()) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete install_prefs;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return install_prefs;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CopyPrefFile(const FilePath& user_data_dir,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const FilePath& master_prefs_path) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath user_prefs = GetDefaultPrefFilePath(true, user_data_dir);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (user_prefs.empty())
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The master prefs are regular prefs so we can just copy the file
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the default place and they just work.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return file_util::CopyFile(master_prefs_path, user_prefs);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupMasterPrefsFromInstallPrefs(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MasterPrefs* out_prefs,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::MasterPreferences* install_prefs) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool value = false;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kDistroImportSearchPref, &value)) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->do_import_items |= importer::SEARCH_ENGINES;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->dont_import_items |= importer::SEARCH_ENGINES;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're suppressing the first-run bubble, set that preference now.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, wait until the user has completed first run to set it, so the
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user is guaranteed to see the bubble iff he or she has completed the first
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // run process.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kDistroSuppressFirstRunBubble,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &value) && value)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetShowFirstRunBubblePref(false);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kDistroImportHistoryPref,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &value)) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->do_import_items |= importer::HISTORY;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->dont_import_items |= importer::HISTORY;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string not_used;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  out_prefs->homepage_defined = install_prefs->GetString(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kHomePage, &not_used);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kDistroImportHomePagePref,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &value)) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->do_import_items |= importer::HOME_PAGE;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->dont_import_items |= importer::HOME_PAGE;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmarks are never imported unless specifically turned on.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kDistroImportBookmarksPref,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &value)) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->do_import_items |= importer::FAVORITES;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out_prefs->dont_import_items |= importer::FAVORITES;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kMakeChromeDefaultForUser,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &value) && value) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out_prefs->make_chrome_default = true;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kSuppressFirstRunDefaultBrowserPrompt,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &value) && value) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out_prefs->suppress_first_run_default_browser_prompt = true;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetDefaultBrowser(installer::MasterPreferences* install_prefs){
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Even on the first run we only allow for the user choice to take effect if
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no policy has been set by the admin.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!g_browser_process->local_state()->IsManagedPreference(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prefs::kDefaultBrowserSettingEnabled)) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool value = false;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (install_prefs->GetBool(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            installer::master_preferences::kMakeChromeDefaultForUser,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &value) && value) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShellIntegration::SetAsDefaultBrowser();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (g_browser_process->local_state()->GetBoolean(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prefs::kDefaultBrowserSettingEnabled)) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShellIntegration::SetAsDefaultBrowser();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetShowWelcomePagePrefIfNeeded(
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::MasterPreferences* install_prefs) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool value = false;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_prefs->GetBool(
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          installer::master_preferences::kDistroShowWelcomePage, &value)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          && value) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetShowWelcomePagePref();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SkipFirstRunUI(installer::MasterPreferences* install_prefs) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool value = false;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_prefs->GetBool(installer::master_preferences::kDistroSkipFirstRunPref,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         &value);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetRLZPref(first_run::MasterPrefs* out_prefs,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                installer::MasterPreferences* install_prefs) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!install_prefs->GetInt(installer::master_preferences::kDistroPingDelay,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &out_prefs->ping_delay)) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default value in case master preferences is missing or corrupt,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // or ping_delay is missing.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out_prefs->ping_delay = 90;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -- Platform-specific functions --
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_LINUX) && !defined(OS_BSD)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsOrganicFirstRun() {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string brand;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  google_util::GetBrand(&brand);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return google_util::IsOrganicFirstRun(brand);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutoImportPlatformCommon(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<ImporterHost> importer_host,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool homepage_defined,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int import_items,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int dont_import_items,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool make_chrome_default) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath local_state_path;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::FILE_LOCAL_STATE, &local_state_path);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool local_state_file_exists = file_util::PathExists(local_state_path);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ImporterList> importer_list(new ImporterList(NULL));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importer_list->DetectSourceProfilesHack();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do import if there is an available profile for us to import.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (importer_list->count() > 0) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't show the warning dialog if import fails.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    importer_host->set_headless();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int items = 0;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsOrganicFirstRun()) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Home page is imported in organic builds only unless turned off or
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // defined in master_preferences.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (homepage_defined) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dont_import_items |= importer::HOME_PAGE;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (import_items & importer::HOME_PAGE)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          import_items &= ~importer::HOME_PAGE;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Search engines are not imported automatically in organic builds if the
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // user already has a user preferences directory.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (local_state_file_exists) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dont_import_items |= importer::SEARCH_ENGINES;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (import_items & importer::SEARCH_ENGINES)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          import_items &= ~importer::SEARCH_ENGINES;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* user_prefs = profile->GetPrefs();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImportItem(user_prefs,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  prefs::kImportHistory,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  import_items,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  dont_import_items,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  importer::HISTORY,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  items);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImportItem(user_prefs,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  prefs::kImportHomepage,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  import_items,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  dont_import_items,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  importer::HOME_PAGE,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  items);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImportItem(user_prefs,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  prefs::kImportSearchEngine,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  import_items,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  dont_import_items,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  importer::SEARCH_ENGINES,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  items);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImportItem(user_prefs,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  prefs::kImportBookmarks,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  import_items,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  dont_import_items,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  importer::FAVORITES,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  items);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportSettings(profile, importer_host, importer_list, items);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("FirstRunDef_Accept"));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch the first run dialog only for certain builds, and only if the user
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has not already set preferences.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsOrganicFirstRun() && !local_state_file_exists) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startup_metric_utils::SetNonBrowserUIDisplayed();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowFirstRunDialog(profile);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (make_chrome_default &&
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShellIntegration::CanSetAsDefaultBrowser() ==
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ShellIntegration::SET_DEFAULT_UNATTENDED) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellIntegration::SetAsDefaultBrowser();
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Display the first run bubble if there is a default search provider.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* template_url =
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(profile);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (template_url && template_url->GetDefaultSearchProvider())
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FirstRunBubbleLauncher::ShowFirstRunBubbleSoon();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetShowWelcomePagePref();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersonalDataManagerFirstRunPref();
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(USE_AURA)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ImportBookmarkFromFileIfNeeded(Profile* profile,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const CommandLine& cmdline) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int return_code = true;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cmdline.HasSwitch(switches::kImportFromFile)) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Silently import preset bookmarks from file.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is an OEM scenario.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return_code = ImportFromFile(profile, cmdline);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return return_code;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace first_run
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace first_run {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MasterPrefs::MasterPrefs()
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ping_delay(0),
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      homepage_defined(false),
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      do_import_items(0),
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dont_import_items(0),
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      make_chrome_default(false),
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suppress_first_run_default_browser_prompt(false) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MasterPrefs::~MasterPrefs() {}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsChromeFirstRun() {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internal::first_run_ != internal::FIRST_RUN_UNKNOWN)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return internal::first_run_ == internal::FIRST_RUN_TRUE;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath first_run_sentinel;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!internal::GetFirstRunSentinelFilePath(&first_run_sentinel) ||
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_util::PathExists(first_run_sentinel)) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::first_run_ = internal::FIRST_RUN_FALSE;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::first_run_ = internal::FIRST_RUN_TRUE;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CreateSentinel() {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath first_run_sentinel;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!internal::GetFirstRunSentinelFilePath(&first_run_sentinel))
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return file_util::WriteFile(first_run_sentinel, "", 0) != -1;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetPingDelayPrefName() {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::StringPrintf("%s.%s",
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            installer::master_preferences::kDistroDict,
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            installer::master_preferences::kDistroPingDelay);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterUserPrefs(PrefService* prefs) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->RegisterIntegerPref(GetPingDelayPrefName().c_str(),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             0,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             PrefService::UNSYNCABLE_PREF);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RemoveSentinel() {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath first_run_sentinel;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!internal::GetFirstRunSentinelFilePath(&first_run_sentinel))
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return file_util::Delete(first_run_sentinel, false);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SetShowFirstRunBubblePref(bool show_bubble) {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* local_state = g_browser_process->local_state();
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!local_state)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local_state->SetBoolean(prefs::kShouldShowFirstRunBubble, show_bubble);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SetShowWelcomePagePref() {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* local_state = g_browser_process->local_state();
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!local_state)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!local_state->FindPreference(prefs::kShouldShowWelcomePage)) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local_state->RegisterBooleanPref(prefs::kShouldShowWelcomePage, false);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local_state->SetBoolean(prefs::kShouldShowWelcomePage, true);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SetPersonalDataManagerFirstRunPref() {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* local_state = g_browser_process->local_state();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!local_state)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!local_state->FindPreference(
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prefs::kAutofillPersonalDataManagerFirstRun)) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local_state->RegisterBooleanPref(
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kAutofillPersonalDataManagerFirstRun, false);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local_state->SetBoolean(prefs::kAutofillPersonalDataManagerFirstRun, true);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LogFirstRunMetric(FirstRunBubbleMetric metric) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("FirstRun.SearchEngineBubble", metric,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            NUM_FIRST_RUN_BUBBLE_METRICS);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubbleLauncher::ShowFirstRunBubbleSoon() {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetShowFirstRunBubblePref(true);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This FirstRunBubbleLauncher instance will manage its own lifetime.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new FirstRunBubbleLauncher();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunBubbleLauncher::FirstRunBubbleLauncher() {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunBubbleLauncher::~FirstRunBubbleLauncher() {}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubbleLauncher::Observe(
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(type, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = browser::FindBrowserWithWebContents(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<content::WebContents>(source).ptr());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser || !browser->is_type_tabbed())
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the preference to determine if the bubble should be shown.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prefs || !prefs->GetBoolean(prefs::kShouldShowFirstRunBubble)) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* contents = chrome::GetActiveWebContents(browser);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contents && contents->GetURL().SchemeIs(chrome::kChromeUIScheme)) {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Suppress the first run bubble if the sync promo is showing.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (contents->GetURL().host() == chrome::kChromeUISyncPromoHost)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Suppress the first run bubble if 'make chrome metro' flow is showing.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (contents->GetURL().host() == chrome::kChromeUIMetroFlowHost)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Suppress the first run bubble if the NTP sync promo bubble is showing.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (contents->GetURL().host() == chrome::kChromeUINewTabHost) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NewTabUI* new_tab_ui =
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NewTabUI::FromWebUIController(contents->GetWebUI()->GetController());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (new_tab_ui && new_tab_ui->showing_sync_bubble())
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Suppress the first run bubble if a global error bubble is pending.
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalErrorService* global_error_service =
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GlobalErrorServiceFactory::GetForProfile(browser->profile());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (global_error_service->GetFirstGlobalErrorWithBubbleView() != NULL)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the preference and notifications to avoid showing the bubble again.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->SetBoolean(prefs::kShouldShowFirstRunBubble, false);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show the bubble now and destroy this bubble launcher.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->ShowFirstRunBubble();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace first_run
565