summaryrefslogtreecommitdiffstats
path: root/chrome/browser/search_engines/default_search_pref_migration.cc
blob: 224f2fc9c012a03bfc3c72129925d92ea3428fa9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Copyright 2014 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/search_engines/default_search_pref_migration.h"

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/histogram.h"
#include "base/prefs/pref_service.h"
#include "components/search_engines/default_search_manager.h"
#include "components/search_engines/search_engines_pref_names.h"
#include "components/search_engines/template_url_data.h"
#include "components/search_engines/template_url_service.h"

namespace {

// Loads the user-selected DSE (if there is one, and it's not masked by policy
// or an extension) from legacy preferences.
scoped_ptr<TemplateURLData> LoadDefaultSearchProviderFromPrefs(
    PrefService* pref_service) {
  scoped_ptr<TemplateURLData> legacy_dse_from_prefs;
  bool legacy_is_managed = false;
  TemplateURLService::LoadDefaultSearchProviderFromPrefs(
      pref_service, &legacy_dse_from_prefs, &legacy_is_managed);
  return legacy_is_managed ?
      scoped_ptr<TemplateURLData>() : legacy_dse_from_prefs.Pass();
}

void ClearDefaultSearchProviderFromLegacyPrefs(PrefService* prefs) {
  prefs->ClearPref(prefs::kDefaultSearchProviderName);
  prefs->ClearPref(prefs::kDefaultSearchProviderKeyword);
  prefs->ClearPref(prefs::kDefaultSearchProviderSearchURL);
  prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURL);
  prefs->ClearPref(prefs::kDefaultSearchProviderInstantURL);
  prefs->ClearPref(prefs::kDefaultSearchProviderImageURL);
  prefs->ClearPref(prefs::kDefaultSearchProviderNewTabURL);
  prefs->ClearPref(prefs::kDefaultSearchProviderSearchURLPostParams);
  prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURLPostParams);
  prefs->ClearPref(prefs::kDefaultSearchProviderInstantURLPostParams);
  prefs->ClearPref(prefs::kDefaultSearchProviderImageURLPostParams);
  prefs->ClearPref(prefs::kDefaultSearchProviderIconURL);
  prefs->ClearPref(prefs::kDefaultSearchProviderEncodings);
  prefs->ClearPref(prefs::kDefaultSearchProviderPrepopulateID);
  prefs->ClearPref(prefs::kDefaultSearchProviderAlternateURLs);
  prefs->ClearPref(prefs::kDefaultSearchProviderSearchTermsReplacementKey);
}

void MigrateDefaultSearchPref(PrefService* pref_service) {
  DCHECK(pref_service);

  scoped_ptr<TemplateURLData> legacy_dse_from_prefs =
      LoadDefaultSearchProviderFromPrefs(pref_service);
  if (!legacy_dse_from_prefs)
    return;

  DefaultSearchManager default_search_manager(
      pref_service, DefaultSearchManager::ObserverCallback());
  DefaultSearchManager::Source modern_source;
  TemplateURLData* modern_value =
      default_search_manager.GetDefaultSearchEngine(&modern_source);
  if (modern_source == DefaultSearchManager::FROM_FALLBACK) {
    // |modern_value| is the prepopulated default. If it matches the legacy DSE
    // we assume it is not a user-selected value.
    if (!modern_value ||
        legacy_dse_from_prefs->prepopulate_id != modern_value->prepopulate_id) {
      // This looks like a user-selected value, so let's migrate it.
      // TODO(erikwright): Remove this migration logic when this stat approaches
      // zero.
      UMA_HISTOGRAM_BOOLEAN("Search.MigratedPrefToDictionaryValue", true);
      default_search_manager.SetUserSelectedDefaultSearchEngine(
          *legacy_dse_from_prefs);
    }
  }

  ClearDefaultSearchProviderFromLegacyPrefs(pref_service);
}

void OnPrefsInitialized(PrefService* pref_service,
                        bool pref_service_initialization_success) {
  MigrateDefaultSearchPref(pref_service);
}

}  // namespace

void ConfigureDefaultSearchPrefMigrationToDictionaryValue(
    PrefService* pref_service) {
  if (pref_service->GetInitializationStatus() ==
      PrefService::INITIALIZATION_STATUS_WAITING) {
    pref_service->AddPrefInitObserver(
        base::Bind(&OnPrefsInitialized, base::Unretained(pref_service)));
  } else {
    MigrateDefaultSearchPref(pref_service);
  }
}