first_run.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run_internal.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/external_process_importer_host.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer_host.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer_list.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer_progress_observer.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_type.h" 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/importer/profile_writer.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h" 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/signin_tracker.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/new_tab_ui.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences_constants.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/util_constants.h" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// A bitfield formed from values in AutoImportState to record the state of 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// AutoImport. This is used in testing to verify import startup actions that 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// occur before an observer can be registered in the test. 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)uint16 g_auto_import_state = first_run::AUTO_IMPORT_NONE; 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flags for functions of similar name. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool g_should_show_welcome_page = false; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool g_should_do_autofill_personal_data_manager_first_run = false; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This class acts as an observer for the ImporterProgressObserver::ImportEnded 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// callback. When the import process is started, certain errors may cause 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// ImportEnded() to be called synchronously, but the typical case is that 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// ImportEnded() is called asynchronously. Thus we have to handle both cases. 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ImportEndedObserver : public importer::ImporterProgressObserver { 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImportEndedObserver() : ended_(false), 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) should_quit_message_loop_(false) {} 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~ImportEndedObserver() {} 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // importer::ImporterProgressObserver: 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ImportStarted() OVERRIDE {} 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {} 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {} 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ImportEnded() OVERRIDE { 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ended_ = true; 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (should_quit_message_loop_) 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_should_quit_message_loop() { 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) should_quit_message_loop_ = true; 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool ended() const { 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return ended_; 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Set if the import has ended. 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool ended_; 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool should_quit_message_loop_; 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Helper class that performs delayed first-run tasks that need more of the 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// chrome infrastructure to be up and running before they can be attempted. 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FirstRunDelayedTasks : public content::NotificationObserver { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Tasks { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NO_TASK, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INSTALL_EXTENSIONS 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit FirstRunDelayedTasks(Tasks task) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (task == INSTALL_EXTENSIONS) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_BROWSER_CLOSED, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // After processing the notification we always delete ourselves. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == chrome::NOTIFICATION_EXTENSIONS_READY) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DoExtensionWork( 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<Profile>(source).ptr()->GetExtensionService()); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Private ctor forces it to be created only in the heap. 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FirstRunDelayedTasks() {} 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The extension work is to basically trigger an extension update check. 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the extension specified in the master pref is older than the live 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension it will get updated which is the same as get it installed. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DoExtensionWork(ExtensionService* service) { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (service) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service->updater()->CheckNow(extensions::ExtensionUpdater::CheckParams()); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationRegistrar registrar_; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Installs a task to do an extensions update check once the extensions system 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is running. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DoDelayedInstallExtensions() { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FirstRunDelayedTasks(FirstRunDelayedTasks::INSTALL_EXTENSIONS); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DoDelayedInstallExtensionsIfNeeded( 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) installer::MasterPreferences* install_prefs) { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* extensions = 0; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs->GetExtensionsBlock(&extensions)) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VLOG(1) << "Extensions block found in master preferences"; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DoDelayedInstallExtensions(); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetDefaultPrefFilePath(bool create_profile_dir, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& user_data_dir) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath default_pref_dir = 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager::GetDefaultProfileDir(user_data_dir); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (create_profile_dir) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::PathExists(default_pref_dir)) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::CreateDirectory(default_pref_dir)) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProfileManager::GetProfilePrefsPath(default_pref_dir); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the |items| bitfield according to whether the import data specified by 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |import_type| should be be auto imported or not. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetImportItem(PrefService* user_prefs, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* pref_path, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int import_items, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dont_import_items, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) importer::ImportItem import_type, 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* items) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work out whether an item is to be imported according to what is specified 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in master preferences. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_import = false; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool master_pref_set = 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((import_items | dont_import_items) & import_type) != 0; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool master_pref = ((import_items & ~dont_import_items) & import_type) != 0; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (import_type == importer::HISTORY || 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (import_type != importer::FAVORITES && 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_run::internal::IsOrganicFirstRun())) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // History is always imported unless turned off in master_preferences. 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Search engines and home page are imported in organic builds only 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // unless turned off in master_preferences. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_import = !master_pref_set || master_pref; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bookmarks are never imported, unless turned on in master_preferences. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Search engine and home page import behaviour is similar in non organic 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // builds. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_import = master_pref_set && master_pref; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If an import policy is set, import items according to policy. If no master 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preference is set, but a corresponding recommended policy is set, import 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item according to recommended policy. If both a master preference and a 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recommended policy is set, the master preference wins. If neither 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recommended nor managed policies are set, import item according to what we 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // worked out above. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (master_pref_set) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_prefs->SetBoolean(pref_path, should_import); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_prefs->FindPreference(pref_path)->IsDefaultValue()) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_prefs->GetBoolean(pref_path)) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *items |= import_type; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { // no policy (recommended or managed) is set 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (should_import) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *items |= import_type; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_prefs->ClearPref(pref_path); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Launches the import, via |importer_host|, from |source_profile| into 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |target_profile| for the items specified in the |items_to_import| bitfield. 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This may be done in a separate process depending on the platform, but it will 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// always block until done. 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ImportFromSourceProfile(ImporterHost* importer_host, 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const importer::SourceProfile& source_profile, 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Profile* target_profile, 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint16 items_to_import) { 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImportEndedObserver observer; 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer_host->SetObserver(&observer); 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) importer_host->StartImportSettings(source_profile, 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) target_profile, 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) items_to_import, 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new ProfileWriter(target_profile)); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the import process has not errored out, block on it. 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!observer.ended()) { 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.set_should_quit_message_loop(); 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Imports bookmarks from an html file whose path is provided by 25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |import_bookmarks_path|. 25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ImportFromFile(Profile* profile, 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImporterHost* file_importer_host, 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& import_bookmarks_path) { 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) importer::SourceProfile source_profile; 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) source_profile.importer_type = importer::TYPE_BOOKMARKS_FILE; 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::FilePath::StringType& import_bookmarks_path_str = 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN) 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UTF8ToUTF16(import_bookmarks_path); 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) import_bookmarks_path; 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) source_profile.source_path = base::FilePath(import_bookmarks_path_str); 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImportFromSourceProfile(file_importer_host, source_profile, profile, 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) importer::FAVORITES); 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_auto_import_state |= first_run::AUTO_IMPORT_BOOKMARKS_FILE_IMPORTED; 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Imports settings from the first profile in |importer_list|. 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ImportSettings(Profile* profile, 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImporterHost* importer_host, 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<ImporterList> importer_list, 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int items_to_import) { 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const importer::SourceProfile& source_profile = 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) importer_list->GetSourceProfileAt(0); 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure that importers aren't requested to import items that they do not 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // support. If there is no overlap, skip. 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) items_to_import &= source_profile.services_supported; 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (items_to_import == 0) 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImportFromSourceProfile(importer_host, source_profile, profile, 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) items_to_import); 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_auto_import_state |= first_run::AUTO_IMPORT_PROFILE_IMPORTED; 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL UrlFromString(const std::string& in) { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(in); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ConvertStringVectorToGURLVector( 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& src, 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL>* ret) { 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret->resize(src.size()); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::transform(src.begin(), src.end(), ret->begin(), &UrlFromString); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace first_run { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunState first_run_ = FIRST_RUN_UNKNOWN; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<base::FilePath> master_prefs_path_for_testing 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) = LAZY_INSTANCE_INITIALIZER; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)installer::MasterPreferences* 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadMasterPrefs(base::FilePath* master_prefs_path) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!master_prefs_path_for_testing.Get().empty()) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *master_prefs_path = master_prefs_path_for_testing.Get(); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *master_prefs_path = base::FilePath(MasterPrefsPath()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (master_prefs_path->empty()) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::MasterPreferences* install_prefs = 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new installer::MasterPreferences(*master_prefs_path); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!install_prefs->read_from_file()) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete install_prefs; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return install_prefs; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool CopyPrefFile(const base::FilePath& user_data_dir, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& master_prefs_path) { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_prefs = GetDefaultPrefFilePath(true, user_data_dir); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_prefs.empty()) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The master prefs are regular prefs so we can just copy the file 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the default place and they just work. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_util::CopyFile(master_prefs_path, user_prefs); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupMasterPrefsFromInstallPrefs( 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const installer::MasterPreferences& install_prefs, 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MasterPrefs* out_prefs) { 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConvertStringVectorToGURLVector( 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) install_prefs.GetFirstRunTabs(), &out_prefs->new_tabs); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) install_prefs.GetInt(installer::master_preferences::kDistroPingDelay, 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &out_prefs->ping_delay); 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value = false; 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs.GetBool( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kDistroImportSearchPref, &value)) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->do_import_items |= importer::SEARCH_ENGINES; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->dont_import_items |= importer::SEARCH_ENGINES; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're suppressing the first-run bubble, set that preference now. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, wait until the user has completed first run to set it, so the 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user is guaranteed to see the bubble iff he or she has completed the first 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // run process. 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs.GetBool( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kDistroSuppressFirstRunBubble, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value) && value) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetShowFirstRunBubblePref(FIRST_RUN_BUBBLE_SUPPRESS); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs.GetBool( 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kDistroImportHistoryPref, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value)) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->do_import_items |= importer::HISTORY; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->dont_import_items |= importer::HISTORY; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string not_used; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_prefs->homepage_defined = install_prefs.GetString( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kHomePage, ¬_used); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs.GetBool( 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kDistroImportHomePagePref, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value)) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->do_import_items |= importer::HOME_PAGE; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->dont_import_items |= importer::HOME_PAGE; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bookmarks are never imported unless specifically turned on. 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs.GetBool( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kDistroImportBookmarksPref, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value)) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->do_import_items |= importer::FAVORITES; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->dont_import_items |= importer::FAVORITES; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs.GetBool( 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kMakeChromeDefaultForUser, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value) && value) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->make_chrome_default = true; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_prefs.GetBool( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kSuppressFirstRunDefaultBrowserPrompt, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value) && value) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_prefs->suppress_first_run_default_browser_prompt = true; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) install_prefs.GetString( 41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) installer::master_preferences::kDistroImportBookmarksFromFilePref, 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &out_prefs->import_bookmarks_path); 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_prefs->variations_seed = install_prefs.GetVariationsSeed(); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) install_prefs.GetString( 42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) installer::master_preferences::kDistroSuppressDefaultBrowserPromptPref, 42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &out_prefs->suppress_default_browser_prompt_for_version); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetDefaultBrowser(installer::MasterPreferences* install_prefs){ 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Even on the first run we only allow for the user choice to take effect if 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no policy has been set by the admin. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_browser_process->local_state()->IsManagedPreference( 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDefaultBrowserSettingEnabled)) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value = false; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (install_prefs->GetBool( 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kMakeChromeDefaultForUser, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value) && value) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::SetAsDefaultBrowser(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (g_browser_process->local_state()->GetBoolean( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDefaultBrowserSettingEnabled)) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::SetAsDefaultBrowser(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -- Platform-specific functions -- 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_LINUX) && !defined(OS_BSD) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsOrganicFirstRun() { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string brand; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_util::GetBrand(&brand); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return google_util::IsOrganicFirstRun(brand); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace first_run 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace first_run { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MasterPrefs::MasterPrefs() 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ping_delay(0), 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) homepage_defined(false), 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do_import_items(0), 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dont_import_items(0), 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_chrome_default(false), 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suppress_first_run_default_browser_prompt(false) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MasterPrefs::~MasterPrefs() {} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsChromeFirstRun() { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (internal::first_run_ != internal::FIRST_RUN_UNKNOWN) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return internal::first_run_ == internal::FIRST_RUN_TRUE; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath first_run_sentinel; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!internal::GetFirstRunSentinelFilePath(&first_run_sentinel) || 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::PathExists(first_run_sentinel)) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::first_run_ = internal::FIRST_RUN_FALSE; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::first_run_ = internal::FIRST_RUN_TRUE; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CreateSentinel() { 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath first_run_sentinel; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!internal::GetFirstRunSentinelFilePath(&first_run_sentinel)) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_util::WriteFile(first_run_sentinel, "", 0) != -1; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetPingDelayPrefName() { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("%s.%s", 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kDistroDict, 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::master_preferences::kDistroPingDelay); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry) { 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterIntegerPref( 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetPingDelayPrefName().c_str(), 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RemoveSentinel() { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath first_run_sentinel; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!internal::GetFirstRunSentinelFilePath(&first_run_sentinel)) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_util::Delete(first_run_sentinel, false); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SetShowFirstRunBubblePref(FirstRunBubbleOptions show_bubble_option) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!local_state) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (local_state->GetInteger( 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kShowFirstRunBubbleOption) != FIRST_RUN_BUBBLE_SUPPRESS) { 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the new state as long as the bubble wasn't explicitly suppressed 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // already. 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state->SetInteger(prefs::kShowFirstRunBubbleOption, 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_bubble_option); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetShouldShowWelcomePage() { 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_should_show_welcome_page = true; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldShowWelcomePage() { 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool retval = g_should_show_welcome_page; 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_should_show_welcome_page = false; 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return retval; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetShouldDoPersonalDataManagerFirstRun() { 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_should_do_autofill_personal_data_manager_first_run = true; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldDoPersonalDataManagerFirstRun() { 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool retval = g_should_do_autofill_personal_data_manager_first_run; 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_should_do_autofill_personal_data_manager_first_run = false; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return retval; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LogFirstRunMetric(FirstRunBubbleMetric metric) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("FirstRun.SearchEngineBubble", metric, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_FIRST_RUN_BUBBLE_METRICS); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubbleLauncher::ShowFirstRunBubbleSoon() { 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetShowFirstRunBubblePref(FIRST_RUN_BUBBLE_SHOW); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This FirstRunBubbleLauncher instance will manage its own lifetime. 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new FirstRunBubbleLauncher(); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunBubbleLauncher::FirstRunBubbleLauncher() { 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstRunBubbleLauncher::~FirstRunBubbleLauncher() {} 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FirstRunBubbleLauncher::Observe( 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents( 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<content::WebContents>(source).ptr()); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!browser || !browser->is_type_tabbed()) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the preference to determine if the bubble should be shown. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!prefs || prefs->GetInteger( 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kShowFirstRunBubbleOption) != FIRST_RUN_BUBBLE_SHOW) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* contents = 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetActiveWebContents(); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Suppress the first run bubble if a Gaia sign in page or the continue 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // URL for the sign in page is showing. 588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (contents && 589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (gaia::IsGaiaSignonRealm(contents->GetURL().GetOrigin()) || 590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SyncPromoUI::IsContinueUrlForWebBasedSigninFlow(contents->GetURL()))) { 591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents && contents->GetURL().SchemeIs(chrome::kChromeUIScheme)) { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress the first run bubble if the sync promo is showing. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents->GetURL().host() == chrome::kChromeUISyncPromoHost) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress the first run bubble if 'make chrome metro' flow is showing. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents->GetURL().host() == chrome::kChromeUIMetroFlowHost) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Suppress the first run bubble if the NTP sync promo bubble is showing 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or if sign in is in progress. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents->GetURL().host() == chrome::kChromeUINewTabHost) { 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile::FromBrowserContext(contents->GetBrowserContext()); 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManagerBase* manager = 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManagerFactory::GetForProfile(profile); 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool signin_in_progress = manager && 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (!manager->GetAuthenticatedUsername().empty() && 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninTracker::GetSigninState(profile, NULL) != 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninTracker::SIGNIN_COMPLETE); 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_promo_bubble_visible = 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile->GetPrefs()->GetBoolean(prefs::kSyncPromoShowNTPBubble); 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_promo_bubble_visible || signin_in_progress) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress the first run bubble if a global error bubble is pending. 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalErrorService* global_error_service = 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalErrorServiceFactory::GetForProfile(browser->profile()); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (global_error_service->GetFirstGlobalErrorWithBubbleView() != NULL) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the preference and notifications to avoid showing the bubble again. 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->SetInteger(prefs::kShowFirstRunBubbleOption, 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FIRST_RUN_BUBBLE_DONT_SHOW); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the bubble now and destroy this bubble launcher. 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->ShowFirstRunBubble(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetMasterPrefsPathForTesting(const base::FilePath& master_prefs) { 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::master_prefs_path_for_testing.Get() = master_prefs; 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ProcessMasterPreferencesResult ProcessMasterPreferences( 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& user_data_dir, 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MasterPrefs* out_prefs) { 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!user_data_dir.empty()); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Chrome OS has its own out-of-box-experience code. Create the sentinel to 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mark the fact that we've run once but skip the full first-run flow. 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSentinel(); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SKIP_FIRST_RUN_TASKS; 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath master_prefs_path; 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<installer::MasterPreferences> 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) install_prefs(internal::LoadMasterPrefs(&master_prefs_path)); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Default value in case master preferences is missing or corrupt, or 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ping_delay is missing. 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) out_prefs->ping_delay = 90; 660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (install_prefs.get()) { 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!internal::ShowPostInstallEULAIfNeeded(install_prefs.get())) 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return EULA_EXIT_NOW; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!internal::CopyPrefFile(user_data_dir, master_prefs_path)) 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DLOG(ERROR) << "Failed to copy master_preferences to user data dir."; 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DoDelayedInstallExtensionsIfNeeded(install_prefs.get()); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::SetupMasterPrefsFromInstallPrefs(*install_prefs, out_prefs); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::SetDefaultBrowser(install_prefs.get()); 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return DO_FIRST_RUN_TASKS; 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutoImport( 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool homepage_defined, 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int import_items, 68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int dont_import_items, 68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& import_bookmarks_path) { 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(USE_AURA) 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes itself. 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImporterHost* importer_host; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(csilv,mirandac): Out-of-process import has only been qualified on 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // MacOS X and Windows, so we will only use it on those platforms. 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Linux still uses the in-process import (http://crbug.com/56816). 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer_host = new ExternalProcessImporterHost; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer_host = new ImporterHost; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath local_state_path; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PathService::Get(chrome::FILE_LOCAL_STATE, &local_state_path); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool local_state_file_exists = file_util::PathExists(local_state_path); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ImporterList> importer_list(new ImporterList(NULL)); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer_list->DetectSourceProfilesHack(); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do import if there is an available profile for us to import. 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (importer_list->count() > 0) { 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't show the warning dialog if import fails. 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer_host->set_headless(); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int items = 0; 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (internal::IsOrganicFirstRun()) { 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Home page is imported in organic builds only unless turned off or 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // defined in master_preferences. 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (homepage_defined) { 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dont_import_items |= importer::HOME_PAGE; 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (import_items & importer::HOME_PAGE) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_items &= ~importer::HOME_PAGE; 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Search engines are not imported automatically in organic builds if the 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // user already has a user preferences directory. 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (local_state_file_exists) { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dont_import_items |= importer::SEARCH_ENGINES; 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (import_items & importer::SEARCH_ENGINES) 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_items &= ~importer::SEARCH_ENGINES; 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* user_prefs = profile->GetPrefs(); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetImportItem(user_prefs, 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kImportHistory, 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_items, 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dont_import_items, 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer::HISTORY, 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &items); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetImportItem(user_prefs, 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kImportHomepage, 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_items, 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dont_import_items, 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer::HOME_PAGE, 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &items); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetImportItem(user_prefs, 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kImportSearchEngine, 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_items, 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dont_import_items, 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer::SEARCH_ENGINES, 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &items); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetImportItem(user_prefs, 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kImportBookmarks, 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_items, 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dont_import_items, 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) importer::FAVORITES, 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &items); 751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::LogImporterUseToMetrics( 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "AutoImport", importer_list->GetSourceProfileAt(0).importer_type); 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImportSettings(profile, importer_host, importer_list, items); 75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!import_bookmarks_path.empty()) { 75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Deletes itself. 76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImporterHost* file_importer_host; 76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(gab): Make Linux use OOP import as well (http://crbug.com/56816) and 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // get rid of these ugly ifdefs. 76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) file_importer_host = new ExternalProcessImporterHost; 76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) file_importer_host = new ImporterHost; 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) file_importer_host->set_headless(); 76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImportFromFile(profile, file_importer_host, import_bookmarks_path); 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RecordAction(UserMetricsAction("FirstRunDef_Accept")); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(USE_AURA) 77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_auto_import_state |= AUTO_IMPORT_CALLED; 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DoPostImportTasks(Profile* profile, bool make_chrome_default) { 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (make_chrome_default && 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::CanSetAsDefaultBrowser() == 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::SET_DEFAULT_UNATTENDED) { 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::SetAsDefaultBrowser(); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Display the first run bubble if there is a default search provider. 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLService* template_url = 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLServiceFactory::GetForProfile(profile); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (template_url && template_url->GetDefaultSearchProvider()) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FirstRunBubbleLauncher::ShowFirstRunBubbleSoon(); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetShouldShowWelcomePage(); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetShouldDoPersonalDataManagerFirstRun(); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 794b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) internal::DoPostImportPlatformSpecificTasks(profile); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)uint16 auto_import_state() { 79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return g_auto_import_state; 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace first_run 802