// Copyright (c) 2012 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/first_run.h" #include "base/command_line.h" #include "base/file_path.h" #include "base/file_util.h" #include "base/path_service.h" #include "base/process_util.h" #include "base/string_piece.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/first_run/first_run_internal.h" #include "chrome/browser/importer/importer_host.h" #include "chrome/browser/process_singleton.h" #include "chrome/browser/shell_integration.h" #include "chrome/common/chrome_switches.h" #include "chrome/installer/util/google_update_settings.h" #include "chrome/installer/util/master_preferences.h" #include "content/public/common/result_codes.h" #include "googleurl/src/gurl.h" #include "ui/base/ui_base_switches.h" namespace first_run { namespace internal { bool IsOrganicFirstRun() { // We treat all installs as organic. return true; } // 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 ImportBookmarks(const FilePath& 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.AppendSwitchPath(switches::kUserDataDir, cmdline.GetSwitchValuePath(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.AppendSwitchASCII(switches::kLang, g_browser_process->GetApplicationLocale()); import_cmd.CommandLine::AppendSwitchPath(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. base::LaunchOptions options; options.wait = true; return base::LaunchProcess(import_cmd, options, NULL); } } // namespace internal } // namespace first_run namespace first_run { 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) { #if !defined(USE_AURA) // We need to avoid dispatching new tabs when we are importing because // that will lead to data corruption or a crash. Because there is no UI for // the import process, we pass NULL as the window to bring to the foreground // when a CopyData message comes in; this causes the message to be silently // discarded, which is the correct behavior during the import process. process_singleton->Lock(NULL); scoped_refptr importer_host; importer_host = new ImporterHost; internal::AutoImportPlatformCommon(importer_host, profile, homepage_defined, import_items, dont_import_items, search_engine_experiment, randomize_search_engine_experiment, make_chrome_default); process_singleton->Unlock(); CreateSentinel(); #endif // !defined(USE_AURA) } FilePath MasterPrefsPath() { // The standard location of the master prefs is next to the chrome binary. FilePath master_prefs; if (!PathService::Get(base::DIR_EXE, &master_prefs)) return FilePath(); return master_prefs.AppendASCII(installer::kDefaultMasterPrefs); } } // namespace first_run