| Index: chrome/browser/first_run/first_run.cc
|
| diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc
|
| index 06cbc5cbf9a257430ca04184944cdf14bb875dbc..8f66c1adbb9ed9cf4aa502217fd0159fb49a4387 100644
|
| --- a/chrome/browser/first_run/first_run.cc
|
| +++ b/chrome/browser/first_run/first_run.cc
|
| @@ -55,6 +55,7 @@
|
| #include "chrome/installer/util/master_preferences.h"
|
| #include "chrome/installer/util/master_preferences_constants.h"
|
| #include "chrome/installer/util/util_constants.h"
|
| +#include "components/pref_registry/pref_registry_syncable.h"
|
| #include "components/prefs/pref_service.h"
|
| #include "components/search_engines/template_url_service.h"
|
| #include "components/signin/core/browser/signin_manager.h"
|
| @@ -198,56 +199,6 @@ void DoDelayedInstallExtensionsIfNeeded(
|
| }
|
| }
|
|
|
| -// Sets the |items| bitfield according to whether the import data specified by
|
| -// |import_type| should be be auto imported or not.
|
| -void SetImportItem(PrefService* user_prefs,
|
| - const char* pref_path,
|
| - int import_items,
|
| - int dont_import_items,
|
| - importer::ImportItem import_type,
|
| - int* items) {
|
| - // Work out whether an item is to be imported according to what is specified
|
| - // in master preferences.
|
| - bool should_import = false;
|
| - bool master_pref_set =
|
| - ((import_items | dont_import_items) & import_type) != 0;
|
| - bool master_pref = ((import_items & ~dont_import_items) & import_type) != 0;
|
| -
|
| - if (import_type == importer::HISTORY ||
|
| - (import_type != importer::FAVORITES &&
|
| - first_run::internal::IsOrganicFirstRun())) {
|
| - // History is always imported unless turned off in master_preferences.
|
| - // Search engines and home page are imported in organic builds only
|
| - // unless turned off in master_preferences.
|
| - should_import = !master_pref_set || master_pref;
|
| - } else {
|
| - // Bookmarks are never imported, unless turned on in master_preferences.
|
| - // Search engine and home page import behaviour is similar in non organic
|
| - // builds.
|
| - should_import = master_pref_set && master_pref;
|
| - }
|
| -
|
| - // If an import policy is set, import items according to policy. If no master
|
| - // preference is set, but a corresponding recommended policy is set, import
|
| - // item according to recommended policy. If both a master preference and a
|
| - // recommended policy is set, the master preference wins. If neither
|
| - // recommended nor managed policies are set, import item according to what we
|
| - // worked out above.
|
| - if (master_pref_set)
|
| - user_prefs->SetBoolean(pref_path, should_import);
|
| -
|
| - if (!user_prefs->FindPreference(pref_path)->IsDefaultValue()) {
|
| - if (user_prefs->GetBoolean(pref_path))
|
| - *items |= import_type;
|
| - } else {
|
| - // no policy (recommended or managed) is set
|
| - if (should_import)
|
| - *items |= import_type;
|
| - }
|
| -
|
| - user_prefs->ClearPref(pref_path);
|
| -}
|
| -
|
| // Launches the import, via |importer_host|, from |source_profile| into
|
| // |target_profile| for the items specified in the |items_to_import| bitfield.
|
| // This may be done in a separate process depending on the platform, but it will
|
| @@ -298,19 +249,16 @@ void ImportFromFile(Profile* profile,
|
| // Imports settings from the first profile in |importer_list|.
|
| void ImportSettings(Profile* profile,
|
| std::unique_ptr<ImporterList> importer_list,
|
| - int items_to_import) {
|
| + uint16_t items_to_import) {
|
| + DCHECK(items_to_import);
|
| const importer::SourceProfile& source_profile =
|
| importer_list->GetSourceProfileAt(0);
|
| - // If no items to import then skip entirely.
|
| - if (!items_to_import)
|
| - return;
|
|
|
| // Ensure that importers aren't requested to import items that they do not
|
| // support. If there is no overlap, skip.
|
| items_to_import &= source_profile.services_supported;
|
| - if (items_to_import) {
|
| + if (items_to_import)
|
| ImportFromSourceProfile(source_profile, profile, items_to_import);
|
| - }
|
|
|
| g_auto_import_state |= first_run::AUTO_IMPORT_PROFILE_IMPORTED;
|
| }
|
| @@ -495,57 +443,16 @@ void SetupMasterPrefsFromInstallPrefs(
|
| ConvertStringVectorToGURLVector(
|
| install_prefs.GetFirstRunTabs(), &out_prefs->new_tabs);
|
|
|
| - bool value = false;
|
| - if (install_prefs.GetBool(
|
| - installer::master_preferences::kDistroImportSearchPref, &value)) {
|
| - if (value) {
|
| - out_prefs->do_import_items |= importer::SEARCH_ENGINES;
|
| - } else {
|
| - out_prefs->dont_import_items |= importer::SEARCH_ENGINES;
|
| - }
|
| - }
|
| -
|
| // If we're suppressing the first-run bubble, set that preference now.
|
| // Otherwise, wait until the user has completed first run to set it, so the
|
| // user is guaranteed to see the bubble iff they have completed the first run
|
| // process.
|
| + bool value = false;
|
| if (install_prefs.GetBool(
|
| installer::master_preferences::kDistroSuppressFirstRunBubble,
|
| - &value) && value)
|
| + &value) &&
|
| + value) {
|
| SetShowFirstRunBubblePref(FIRST_RUN_BUBBLE_SUPPRESS);
|
| -
|
| - if (install_prefs.GetBool(
|
| - installer::master_preferences::kDistroImportHistoryPref,
|
| - &value)) {
|
| - if (value) {
|
| - out_prefs->do_import_items |= importer::HISTORY;
|
| - } else {
|
| - out_prefs->dont_import_items |= importer::HISTORY;
|
| - }
|
| - }
|
| -
|
| - std::string not_used;
|
| - out_prefs->homepage_defined = install_prefs.GetString(
|
| - prefs::kHomePage, ¬_used);
|
| -
|
| - if (install_prefs.GetBool(
|
| - installer::master_preferences::kDistroImportHomePagePref,
|
| - &value)) {
|
| - if (value) {
|
| - out_prefs->do_import_items |= importer::HOME_PAGE;
|
| - } else {
|
| - out_prefs->dont_import_items |= importer::HOME_PAGE;
|
| - }
|
| - }
|
| -
|
| - // Bookmarks are never imported unless specifically turned on.
|
| - if (install_prefs.GetBool(
|
| - installer::master_preferences::kDistroImportBookmarksPref,
|
| - &value)) {
|
| - if (value)
|
| - out_prefs->do_import_items |= importer::FAVORITES;
|
| - else
|
| - out_prefs->dont_import_items |= importer::FAVORITES;
|
| }
|
|
|
| if (install_prefs.GetBool(
|
| @@ -616,15 +523,19 @@ FirstRunState DetermineFirstRunState(bool has_sentinel,
|
|
|
| } // namespace internal
|
|
|
| -MasterPrefs::MasterPrefs()
|
| - : homepage_defined(false),
|
| - do_import_items(0),
|
| - dont_import_items(0),
|
| - make_chrome_default_for_user(false),
|
| - suppress_first_run_default_browser_prompt(false),
|
| - welcome_page_on_os_upgrade_enabled(true) {}
|
| +MasterPrefs::MasterPrefs() = default;
|
|
|
| -MasterPrefs::~MasterPrefs() {}
|
| +MasterPrefs::~MasterPrefs() = default;
|
| +
|
| +void RegisterProfilePrefs(
|
| + user_prefs::PrefRegistrySyncable* registry) {
|
| + registry->RegisterBooleanPref(prefs::kImportAutofillFormData, false);
|
| + registry->RegisterBooleanPref(prefs::kImportBookmarks, false);
|
| + registry->RegisterBooleanPref(prefs::kImportHistory, false);
|
| + registry->RegisterBooleanPref(prefs::kImportHomepage, false);
|
| + registry->RegisterBooleanPref(prefs::kImportSavedPasswords, false);
|
| + registry->RegisterBooleanPref(prefs::kImportSearchEngine, false);
|
| +}
|
|
|
| bool IsChromeFirstRun() {
|
| if (g_first_run == internal::FIRST_RUN_UNKNOWN) {
|
| @@ -756,84 +667,56 @@ ProcessMasterPreferencesResult ProcessMasterPreferences(
|
|
|
| void AutoImport(
|
| Profile* profile,
|
| - bool homepage_defined,
|
| - int import_items,
|
| - int dont_import_items,
|
| const std::string& import_bookmarks_path) {
|
| - base::FilePath local_state_path;
|
| - PathService::Get(chrome::FILE_LOCAL_STATE, &local_state_path);
|
| - bool local_state_file_exists = base::PathExists(local_state_path);
|
| -
|
| - // It may be possible to do the if block below asynchronously. In which case,
|
| - // get rid of this RunLoop. http://crbug.com/366116.
|
| - base::RunLoop run_loop;
|
| - std::unique_ptr<ImporterList> importer_list(new ImporterList());
|
| - importer_list->DetectSourceProfiles(
|
| - g_browser_process->GetApplicationLocale(),
|
| - false, // include_interactive_profiles?
|
| - run_loop.QuitClosure());
|
| - run_loop.Run();
|
| -
|
| - // Do import if there is an available profile for us to import.
|
| - if (importer_list->count() > 0) {
|
| - if (internal::IsOrganicFirstRun()) {
|
| - // Home page is imported in organic builds only unless turned off or
|
| - // defined in master_preferences.
|
| - if (homepage_defined) {
|
| - dont_import_items |= importer::HOME_PAGE;
|
| - if (import_items & importer::HOME_PAGE)
|
| - import_items &= ~importer::HOME_PAGE;
|
| - }
|
| - // Search engines are not imported automatically in organic builds if the
|
| - // user already has a user preferences directory.
|
| - if (local_state_file_exists) {
|
| - dont_import_items |= importer::SEARCH_ENGINES;
|
| - if (import_items & importer::SEARCH_ENGINES)
|
| - import_items &= ~importer::SEARCH_ENGINES;
|
| - }
|
| - }
|
| + g_auto_import_state |= AUTO_IMPORT_CALLED;
|
|
|
| - PrefService* user_prefs = profile->GetPrefs();
|
| - int items = 0;
|
| -
|
| - SetImportItem(user_prefs,
|
| - prefs::kImportHistory,
|
| - import_items,
|
| - dont_import_items,
|
| - importer::HISTORY,
|
| - &items);
|
| - SetImportItem(user_prefs,
|
| - prefs::kImportHomepage,
|
| - import_items,
|
| - dont_import_items,
|
| - importer::HOME_PAGE,
|
| - &items);
|
| - SetImportItem(user_prefs,
|
| - prefs::kImportSearchEngine,
|
| - import_items,
|
| - dont_import_items,
|
| - importer::SEARCH_ENGINES,
|
| - &items);
|
| - SetImportItem(user_prefs,
|
| - prefs::kImportBookmarks,
|
| - import_items,
|
| - dont_import_items,
|
| - importer::FAVORITES,
|
| - &items);
|
| -
|
| - importer::LogImporterUseToMetrics(
|
| - "AutoImport", importer_list->GetSourceProfileAt(0).importer_type);
|
| -
|
| - ImportSettings(profile, std::move(importer_list), items);
|
| + // Use |profile|'s PrefService to determine what to import. It will reflect in
|
| + // order:
|
| + // 1) Policies.
|
| + // 2) Master preferences (used to initialize user prefs in
|
| + // ProcessMasterPreferences()).
|
| + // 3) Recommended policies.
|
| + // 4) Registered default.
|
| + PrefService* prefs = profile->GetPrefs();
|
| + uint16_t items_to_import = 0;
|
| + static constexpr struct {
|
| + const char* pref_path;
|
| + importer::ImportItem bit;
|
| + } kImportItems[] = {
|
| + {prefs::kImportAutofillFormData, importer::AUTOFILL_FORM_DATA},
|
| + {prefs::kImportBookmarks, importer::FAVORITES},
|
| + {prefs::kImportHistory, importer::HISTORY},
|
| + {prefs::kImportHomepage, importer::HOME_PAGE},
|
| + {prefs::kImportSavedPasswords, importer::PASSWORDS},
|
| + {prefs::kImportSearchEngine, importer::SEARCH_ENGINES},
|
| + };
|
| +
|
| + for (const auto& import_item : kImportItems) {
|
| + if (prefs->GetBoolean(import_item.pref_path))
|
| + items_to_import |= import_item.bit;
|
| }
|
|
|
| - if (!import_bookmarks_path.empty()) {
|
| - ImportFromFile(profile, import_bookmarks_path);
|
| + if (items_to_import) {
|
| + // It may be possible to do the if block below asynchronously. In which
|
| + // case, get rid of this RunLoop. http://crbug.com/366116.
|
| + base::RunLoop run_loop;
|
| + auto importer_list = base::MakeUnique<ImporterList>();
|
| + importer_list->DetectSourceProfiles(
|
| + g_browser_process->GetApplicationLocale(),
|
| + false, // include_interactive_profiles?
|
| + run_loop.QuitClosure());
|
| + run_loop.Run();
|
| +
|
| + if (importer_list->count() > 0) {
|
| + importer::LogImporterUseToMetrics(
|
| + "AutoImport", importer_list->GetSourceProfileAt(0).importer_type);
|
| +
|
| + ImportSettings(profile, std::move(importer_list), items_to_import);
|
| + }
|
| }
|
|
|
| - content::RecordAction(UserMetricsAction("FirstRunDef_Accept"));
|
| -
|
| - g_auto_import_state |= AUTO_IMPORT_CALLED;
|
| + if (!import_bookmarks_path.empty())
|
| + ImportFromFile(profile, import_bookmarks_path);
|
| }
|
|
|
| void DoPostImportTasks(Profile* profile, bool make_chrome_default_for_user) {
|
|
|