// Copyright (c) 2010 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. #include "chrome/browser/first_run.h" #include "app/app_switches.h" #include "app/resource_bundle.h" #include "base/file_path.h" #include "base/file_util.h" #include "base/path_service.h" #include "chrome/browser/gtk/first_run_dialog.h" #include "chrome/browser/profile_manager.h" #include "chrome/browser/shell_integration.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/common/result_codes.h" #include "chrome/installer/util/google_update_settings.h" #include "chrome/installer/util/master_preferences.h" #include "chrome/installer/util/util_constants.h" #include "googleurl/src/gurl.h" bool OpenFirstRunDialog(Profile* profile, bool homepage_defined, int import_items, int dont_import_items, bool search_engine_experiment, ProcessSingleton* process_singleton) { return FirstRunDialog::Show(profile, process_singleton); } FilePath GetDefaultPrefFilePath(bool create_profile_dir, const FilePath& user_data_dir) { FilePath default_pref_dir = ProfileManager::GetDefaultProfileDir(user_data_dir); if (create_profile_dir) { if (!file_util::PathExists(default_pref_dir)) { if (!file_util::CreateDirectory(default_pref_dir)) return FilePath(); } } return ProfileManager::GetProfilePrefsPath(default_pref_dir); } bool FirstRun::ProcessMasterPreferences(const FilePath& user_data_dir, const FilePath& master_prefs_path, MasterPrefs* out_prefs) { DCHECK(!user_data_dir.empty()); FilePath master_prefs = master_prefs_path; if (master_prefs.empty()) { // The default location of the master prefs is next to the chrome binary. if (!PathService::Get(base::DIR_EXE, &master_prefs)) return true; master_prefs = master_prefs.AppendASCII(installer_util::kDefaultMasterPrefs); } scoped_ptr prefs( installer_util::ParseDistributionPreferences(master_prefs)); if (!prefs.get()) return true; out_prefs->new_tabs = installer_util::GetFirstRunTabs(prefs.get()); std::string not_used; out_prefs->homepage_defined = prefs->GetString(prefs::kHomePage, ¬_used); bool value = false; if (installer_util::GetDistroBooleanPreference(prefs.get(), installer_util::master_preferences::kAltFirstRunBubble, &value) && value) FirstRun::SetOEMFirstRunBubblePref(); FilePath user_prefs = GetDefaultPrefFilePath(true, user_data_dir); if (user_prefs.empty()) return true; // The master prefs are regular prefs so we can just copy the file // to the default place and they just work. if (!file_util::CopyFile(master_prefs, user_prefs)) return true; // Note we are skipping all other master preferences if skip-first-run-ui // is *not* specified. if (!installer_util::GetDistroBooleanPreference(prefs.get(), installer_util::master_preferences::kDistroSkipFirstRunPref, &value) || !value) return true; // From here on we won't show first run so we need to do the work to set the // required state given that FirstRunView is not going to be called. FirstRun::SetShowFirstRunBubblePref(); if (installer_util::GetDistroBooleanPreference(prefs.get(), installer_util::master_preferences::kDistroShowWelcomePage, &value) && value) FirstRun::SetShowWelcomePagePref(); // We need to be able to create the first run sentinel or else we cannot // proceed because ImportSettings will launch the importer process which // would end up here if the sentinel is not present. if (!FirstRun::CreateSentinel()) return false; std::wstring import_bookmarks_path; installer_util::GetDistroStringPreference(prefs.get(), installer_util::master_preferences::kDistroImportBookmarksFromFilePref, &import_bookmarks_path); if (!import_bookmarks_path.empty()) { // There are bookmarks to import from a file. if (!FirstRun::ImportBookmarks(import_bookmarks_path)) { LOG(WARNING) << "silent bookmark import failed"; } } return false; } // TODO(port): This is just a piece of the silent import functionality from // ImportSettings for Windows. It would be nice to get the rest of it ported. bool FirstRun::ImportBookmarks(const std::wstring& import_bookmarks_path) { const CommandLine& cmdline = *CommandLine::ForCurrentProcess(); CommandLine import_cmd(cmdline.GetProgram()); // Propagate user data directory switch. if (cmdline.HasSwitch(switches::kUserDataDir)) { import_cmd.AppendSwitchWithValue( switches::kUserDataDir, cmdline.GetSwitchValueASCII(switches::kUserDataDir)); } // Since ImportSettings is called before the local state is stored on disk // we pass the language as an argument. GetApplicationLocale checks the // current command line as fallback. import_cmd.AppendSwitchWithValue( switches::kLang, ASCIIToWide(g_browser_process->GetApplicationLocale())); import_cmd.CommandLine::AppendSwitchWithValue( switches::kImportFromFile, import_bookmarks_path); // Time to launch the process that is going to do the import. We'll wait // for the process to return. return base::LaunchApp(import_cmd, true, false, NULL); } #if defined(OS_LINUX) && !defined(OS_CHROMEOS) CommandLine* Upgrade::new_command_line_ = NULL; double Upgrade::saved_last_modified_time_of_exe_ = 0; // static bool Upgrade::IsUpdatePendingRestart() { return saved_last_modified_time_of_exe_ != Upgrade::GetLastModifiedTimeOfExe(); } // static void Upgrade::SaveLastModifiedTimeOfExe() { saved_last_modified_time_of_exe_ = Upgrade::GetLastModifiedTimeOfExe(); } // static void Upgrade::RelaunchChromeBrowserWithNewCommandLineIfNeeded() { if (new_command_line_) { if (!base::LaunchApp(*new_command_line_, false, false, NULL)) { DLOG(ERROR) << "Launching a new instance of the browser failed."; } else { DLOG(WARNING) << "Launched a new instance of the browser."; } delete new_command_line_; new_command_line_ = NULL; } } // static double Upgrade::GetLastModifiedTimeOfExe() { FilePath exe_file_path; if (!PathService::Get(base::FILE_EXE, &exe_file_path)) { LOG(WARNING) << "Failed to get FilePath object for FILE_EXE."; return saved_last_modified_time_of_exe_; } file_util::FileInfo exe_file_info; if (!file_util::GetFileInfo(exe_file_path, &exe_file_info)) { LOG(WARNING) << "Failed to get FileInfo object for FILE_EXE - " << exe_file_path.value(); return saved_last_modified_time_of_exe_; } return exe_file_info.last_modified.ToDoubleT(); } #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)