1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/webui/options/reset_profile_settings_handler.h"
8 #include "base/bind_helpers.h"
9 #include "base/metrics/histogram.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/strings/string16.h"
12 #include "base/values.h"
13 #include "chrome/browser/google/google_brand.h"
14 #include "chrome/browser/profile_resetter/brandcode_config_fetcher.h"
15 #include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
16 #include "chrome/browser/profile_resetter/profile_resetter.h"
17 #include "chrome/browser/profile_resetter/resettable_settings_snapshot.h"
18 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/common/pref_names.h"
20 #include "chrome/common/url_constants.h"
21 #include "content/public/browser/user_metrics.h"
22 #include "content/public/browser/web_ui.h"
23 #include "grit/generated_resources.h"
27 ResetProfileSettingsHandler::ResetProfileSettingsHandler() {
28 google_brand::GetBrand(&brandcode_);
31 ResetProfileSettingsHandler::~ResetProfileSettingsHandler() {}
33 void ResetProfileSettingsHandler::InitializeHandler() {
34 Profile* profile = Profile::FromWebUI(web_ui());
35 resetter_.reset(new ProfileResetter(profile));
38 void ResetProfileSettingsHandler::InitializePage() {
39 web_ui()->CallJavascriptFunction(
40 "ResetProfileSettingsOverlay.setResettingState",
41 base::FundamentalValue(resetter_->IsActive()));
44 void ResetProfileSettingsHandler::GetLocalizedValues(
45 base::DictionaryValue* localized_strings) {
46 DCHECK(localized_strings);
48 static OptionsStringResource resources[] = {
49 { "resetProfileSettingsCommit", IDS_RESET_PROFILE_SETTINGS_COMMIT_BUTTON },
50 { "resetProfileSettingsExplanation",
51 IDS_RESET_PROFILE_SETTINGS_EXPLANATION },
52 { "resetProfileSettingsFeedback", IDS_RESET_PROFILE_SETTINGS_FEEDBACK }
55 RegisterStrings(localized_strings, resources, arraysize(resources));
56 RegisterTitle(localized_strings, "resetProfileSettingsOverlay",
57 IDS_RESET_PROFILE_SETTINGS_TITLE);
58 localized_strings->SetString(
59 "resetProfileSettingsLearnMoreUrl",
60 chrome::kResetProfileSettingsLearnMoreURL);
63 void ResetProfileSettingsHandler::RegisterMessages() {
64 // Setup handlers specific to this panel.
65 web_ui()->RegisterMessageCallback("performResetProfileSettings",
66 base::Bind(&ResetProfileSettingsHandler::HandleResetProfileSettings,
67 base::Unretained(this)));
68 web_ui()->RegisterMessageCallback("onShowResetProfileDialog",
69 base::Bind(&ResetProfileSettingsHandler::OnShowResetProfileDialog,
70 base::Unretained(this)));
71 web_ui()->RegisterMessageCallback("onHideResetProfileDialog",
72 base::Bind(&ResetProfileSettingsHandler::OnHideResetProfileDialog,
73 base::Unretained(this)));
76 void ResetProfileSettingsHandler::HandleResetProfileSettings(
77 const base::ListValue* value) {
78 bool send_settings = false;
79 if (!value->GetBoolean(0, &send_settings))
82 DCHECK(brandcode_.empty() || config_fetcher_);
83 if (config_fetcher_ && config_fetcher_->IsActive()) {
84 // Reset once the prefs are fetched.
85 config_fetcher_->SetCallback(
86 base::Bind(&ResetProfileSettingsHandler::ResetProfile,
90 ResetProfile(send_settings);
94 void ResetProfileSettingsHandler::OnResetProfileSettingsDone(
96 web_ui()->CallJavascriptFunction("ResetProfileSettingsOverlay.doneResetting");
97 if (send_feedback && setting_snapshot_) {
98 Profile* profile = Profile::FromWebUI(web_ui());
99 ResettableSettingsSnapshot current_snapshot(profile);
100 int difference = setting_snapshot_->FindDifferentFields(current_snapshot);
102 setting_snapshot_->Subtract(current_snapshot);
103 std::string report = SerializeSettingsReport(*setting_snapshot_,
105 SendSettingsFeedback(report, profile);
108 setting_snapshot_.reset();
111 void ResetProfileSettingsHandler::OnShowResetProfileDialog(
112 const base::ListValue* value) {
113 if (!resetter_->IsActive()) {
114 setting_snapshot_.reset(
115 new ResettableSettingsSnapshot(Profile::FromWebUI(web_ui())));
116 setting_snapshot_->RequestShortcuts(base::Bind(
117 &ResetProfileSettingsHandler::UpdateFeedbackUI, AsWeakPtr()));
121 if (brandcode_.empty())
123 config_fetcher_.reset(new BrandcodeConfigFetcher(
124 base::Bind(&ResetProfileSettingsHandler::OnSettingsFetched,
126 GURL("https://tools.google.com/service/update2"),
130 void ResetProfileSettingsHandler::OnHideResetProfileDialog(
131 const base::ListValue* value) {
132 if (!resetter_->IsActive())
133 setting_snapshot_.reset();
136 void ResetProfileSettingsHandler::OnSettingsFetched() {
137 DCHECK(config_fetcher_);
138 DCHECK(!config_fetcher_->IsActive());
139 // The master prefs is fetched. We are waiting for user pressing 'Reset'.
142 void ResetProfileSettingsHandler::ResetProfile(bool send_settings) {
144 DCHECK(!resetter_->IsActive());
146 scoped_ptr<BrandcodedDefaultSettings> default_settings;
147 if (config_fetcher_) {
148 DCHECK(!config_fetcher_->IsActive());
149 default_settings = config_fetcher_->GetSettings();
150 config_fetcher_.reset();
152 DCHECK(brandcode_.empty());
155 // If failed to fetch BrandcodedDefaultSettings or this is an organic
156 // installation, use default settings.
157 if (!default_settings)
158 default_settings.reset(new BrandcodedDefaultSettings);
160 ProfileResetter::ALL,
161 default_settings.Pass(),
163 base::Bind(&ResetProfileSettingsHandler::OnResetProfileSettingsDone,
166 content::RecordAction(base::UserMetricsAction("ResetProfile"));
167 UMA_HISTOGRAM_BOOLEAN("ProfileReset.SendFeedback", send_settings);
170 void ResetProfileSettingsHandler::UpdateFeedbackUI() {
171 if (!setting_snapshot_)
173 scoped_ptr<base::ListValue> list = GetReadableFeedbackForSnapshot(
174 Profile::FromWebUI(web_ui()),
176 base::DictionaryValue feedback_info;
177 feedback_info.Set("feedbackInfo", list.release());
178 web_ui()->CallJavascriptFunction(
179 "ResetProfileSettingsOverlay.setFeedbackInfo",
183 } // namespace options