Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / options / reset_profile_settings_handler.cc
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.
4
5 #include "chrome/browser/ui/webui/options/reset_profile_settings_handler.h"
6
7 #include "base/bind.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"
24
25 namespace options {
26
27 ResetProfileSettingsHandler::ResetProfileSettingsHandler() {
28   google_brand::GetBrand(&brandcode_);
29 }
30
31 ResetProfileSettingsHandler::~ResetProfileSettingsHandler() {}
32
33 void ResetProfileSettingsHandler::InitializeHandler() {
34   Profile* profile = Profile::FromWebUI(web_ui());
35   resetter_.reset(new ProfileResetter(profile));
36 }
37
38 void ResetProfileSettingsHandler::InitializePage() {
39   web_ui()->CallJavascriptFunction(
40       "ResetProfileSettingsOverlay.setResettingState",
41       base::FundamentalValue(resetter_->IsActive()));
42 }
43
44 void ResetProfileSettingsHandler::GetLocalizedValues(
45     base::DictionaryValue* localized_strings) {
46   DCHECK(localized_strings);
47
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 }
53   };
54
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);
61 }
62
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)));
74 }
75
76 void ResetProfileSettingsHandler::HandleResetProfileSettings(
77     const base::ListValue* value) {
78   bool send_settings = false;
79   if (!value->GetBoolean(0, &send_settings))
80     NOTREACHED();
81
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,
87                    Unretained(this),
88                    send_settings));
89   } else {
90     ResetProfile(send_settings);
91   }
92 }
93
94 void ResetProfileSettingsHandler::OnResetProfileSettingsDone(
95     bool send_feedback) {
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);
101     if (difference) {
102       setting_snapshot_->Subtract(current_snapshot);
103       std::string report = SerializeSettingsReport(*setting_snapshot_,
104                                                    difference);
105       SendSettingsFeedback(report, profile);
106     }
107   }
108   setting_snapshot_.reset();
109 }
110
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()));
118     UpdateFeedbackUI();
119   }
120
121   if (brandcode_.empty())
122     return;
123   config_fetcher_.reset(new BrandcodeConfigFetcher(
124       base::Bind(&ResetProfileSettingsHandler::OnSettingsFetched,
125                  Unretained(this)),
126       GURL("https://tools.google.com/service/update2"),
127       brandcode_));
128 }
129
130 void ResetProfileSettingsHandler::OnHideResetProfileDialog(
131     const base::ListValue* value) {
132   if (!resetter_->IsActive())
133     setting_snapshot_.reset();
134 }
135
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'.
140 }
141
142 void ResetProfileSettingsHandler::ResetProfile(bool send_settings) {
143   DCHECK(resetter_);
144   DCHECK(!resetter_->IsActive());
145
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();
151   } else {
152     DCHECK(brandcode_.empty());
153   }
154
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);
159   resetter_->Reset(
160       ProfileResetter::ALL,
161       default_settings.Pass(),
162       send_settings,
163       base::Bind(&ResetProfileSettingsHandler::OnResetProfileSettingsDone,
164                  AsWeakPtr(),
165                  send_settings));
166   content::RecordAction(base::UserMetricsAction("ResetProfile"));
167   UMA_HISTOGRAM_BOOLEAN("ProfileReset.SendFeedback", send_settings);
168 }
169
170 void ResetProfileSettingsHandler::UpdateFeedbackUI() {
171   if (!setting_snapshot_)
172     return;
173   scoped_ptr<base::ListValue> list = GetReadableFeedbackForSnapshot(
174       Profile::FromWebUI(web_ui()),
175       *setting_snapshot_);
176   base::DictionaryValue feedback_info;
177   feedback_info.Set("feedbackInfo", list.release());
178   web_ui()->CallJavascriptFunction(
179       "ResetProfileSettingsOverlay.setFeedbackInfo",
180       feedback_info);
181 }
182
183 }  // namespace options