1 // Copyright (c) 2012 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/clear_browser_data_handler.h"
7 #include "base/basictypes.h"
9 #include "base/bind_helpers.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/strings/string16.h"
12 #include "base/values.h"
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/browsing_data/browsing_data_helper.h"
15 #include "chrome/browser/browsing_data/browsing_data_remover.h"
16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/common/pref_names.h"
18 #include "chrome/grit/generated_resources.h"
19 #include "chrome/grit/locale_settings.h"
20 #include "components/google/core/browser/google_util.h"
21 #include "content/public/browser/notification_details.h"
22 #include "content/public/browser/web_ui.h"
23 #include "ui/base/accelerators/accelerator.h"
24 #include "ui/base/l10n/l10n_util.h"
27 const char kClearBrowsingDataLearnMoreUrl
[] =
28 "https://support.google.com/chrome/?p=settings_clear_browsing_data";
33 ClearBrowserDataHandler::ClearBrowserDataHandler()
37 ClearBrowserDataHandler::~ClearBrowserDataHandler() {
39 remover_
->RemoveObserver(this);
42 void ClearBrowserDataHandler::InitializeHandler() {
43 PrefService
* prefs
= Profile::FromWebUI(web_ui())->GetPrefs();
44 clear_plugin_lso_data_enabled_
.Init(prefs::kClearPluginLSODataEnabled
, prefs
);
45 pepper_flash_settings_enabled_
.Init(prefs::kPepperFlashSettingsEnabled
,
47 allow_deleting_browser_history_
.Init(
48 prefs::kAllowDeletingBrowserHistory
,
50 base::Bind(&ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged
,
51 base::Unretained(this)));
54 void ClearBrowserDataHandler::InitializePage() {
55 UpdateInfoBannerVisibility();
56 OnBrowsingHistoryPrefChanged();
57 bool removal_in_progress
= !!remover_
;
58 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setClearing",
59 base::FundamentalValue(removal_in_progress
));
61 web_ui()->CallJavascriptFunction(
62 "ClearBrowserDataOverlay.markInitializationComplete");
65 void ClearBrowserDataHandler::UpdateInfoBannerVisibility() {
66 Profile
* profile
= Profile::FromWebUI(web_ui());
67 base::Time lastClearBrowsingDataTime
= base::Time::FromInternalValue(
68 profile
->GetPrefs()->GetInt64(prefs::kLastClearBrowsingDataTime
));
70 const int64 kHoursPerDay
= 24;
71 bool visible
= (base::Time::Now() - lastClearBrowsingDataTime
) <=
72 base::TimeDelta::FromHours(kHoursPerDay
);
75 args
.AppendBoolean(visible
);
76 web_ui()->CallJavascriptFunction(
77 "ClearBrowserDataOverlay.setBannerVisibility", args
);
80 void ClearBrowserDataHandler::GetLocalizedValues(
81 base::DictionaryValue
* localized_strings
) {
82 DCHECK(localized_strings
);
84 static OptionsStringResource resources
[] = {
85 { "clearBrowserDataLabel", IDS_CLEAR_BROWSING_DATA_LABEL
},
86 { "contentSettingsAndSearchEnginesRemain",
87 IDS_CLEAR_BROWSING_DATA_SOME_STUFF_REMAINS
},
88 { "deleteBrowsingHistoryCheckbox", IDS_DEL_BROWSING_HISTORY_CHKBOX
},
89 { "deleteDownloadHistoryCheckbox", IDS_DEL_DOWNLOAD_HISTORY_CHKBOX
},
90 { "deleteCacheCheckbox", IDS_DEL_CACHE_CHKBOX
},
91 { "deleteCookiesCheckbox", IDS_DEL_COOKIES_CHKBOX
},
92 { "deleteCookiesFlashCheckbox", IDS_DEL_COOKIES_FLASH_CHKBOX
},
93 { "deletePasswordsCheckbox", IDS_DEL_PASSWORDS_CHKBOX
},
94 { "deleteFormDataCheckbox", IDS_DEL_FORM_DATA_CHKBOX
},
95 { "deleteHostedAppsDataCheckbox", IDS_DEL_HOSTED_APPS_DATA_CHKBOX
},
96 { "deauthorizeContentLicensesCheckbox",
97 IDS_DEAUTHORIZE_CONTENT_LICENSES_CHKBOX
},
98 { "clearBrowserDataCommit", IDS_CLEAR_BROWSING_DATA_COMMIT
},
99 { "flash_storage_url", IDS_FLASH_STORAGE_URL
},
102 RegisterStrings(localized_strings
, resources
, arraysize(resources
));
103 RegisterTitle(localized_strings
, "clearBrowserDataOverlay",
104 IDS_CLEAR_BROWSING_DATA_TITLE
);
105 localized_strings
->SetString("clearBrowsingDataLearnMoreUrl",
106 kClearBrowsingDataLearnMoreUrl
);
108 ui::Accelerator
acc(ui::VKEY_N
, ui::EF_CONTROL_DOWN
| ui::EF_SHIFT_DOWN
);
109 localized_strings
->SetString(
110 "clearBrowserDataInfoBar",
111 l10n_util::GetStringFUTF16(
112 IDS_CLEAR_BROWSING_DATA_INFO_BAR_TEXT
,
113 acc
.GetShortcutText()));
115 base::ListValue
* time_list
= new base::ListValue
;
116 for (int i
= 0; i
< 5; i
++) {
117 base::string16 label_string
;
120 label_string
= l10n_util::GetStringUTF16(IDS_CLEAR_DATA_HOUR
);
123 label_string
= l10n_util::GetStringUTF16(IDS_CLEAR_DATA_DAY
);
126 label_string
= l10n_util::GetStringUTF16(IDS_CLEAR_DATA_WEEK
);
129 label_string
= l10n_util::GetStringUTF16(IDS_CLEAR_DATA_4WEEKS
);
132 label_string
= l10n_util::GetStringUTF16(IDS_CLEAR_DATA_EVERYTHING
);
135 base::ListValue
* option
= new base::ListValue();
136 option
->Append(new base::FundamentalValue(i
));
137 option
->Append(new base::StringValue(label_string
));
138 time_list
->Append(option
);
140 localized_strings
->Set("clearBrowserDataTimeList", time_list
);
141 localized_strings
->SetBoolean("showDeleteBrowsingHistoryCheckboxes",
142 !Profile::FromWebUI(web_ui())->IsSupervised());
145 void ClearBrowserDataHandler::RegisterMessages() {
146 // Setup handlers specific to this panel.
147 web_ui()->RegisterMessageCallback("performClearBrowserData",
148 base::Bind(&ClearBrowserDataHandler::HandleClearBrowserData
,
149 base::Unretained(this)));
152 void ClearBrowserDataHandler::HandleClearBrowserData(
153 const base::ListValue
* value
) {
154 // We should never be called when the previous clearing has not yet finished.
157 Profile
* profile
= Profile::FromWebUI(web_ui());
158 PrefService
* prefs
= profile
->GetPrefs();
160 int site_data_mask
= BrowsingDataRemover::REMOVE_SITE_DATA
;
161 // Don't try to clear LSO data if it's not supported.
162 if (!*clear_plugin_lso_data_enabled_
)
163 site_data_mask
&= ~BrowsingDataRemover::REMOVE_PLUGIN_DATA
;
167 if (prefs
->GetBoolean(prefs::kDeleteBrowsingHistory
) &&
168 *allow_deleting_browser_history_
) {
169 remove_mask
|= BrowsingDataRemover::REMOVE_HISTORY
;
171 if (prefs
->GetBoolean(prefs::kDeleteDownloadHistory
) &&
172 *allow_deleting_browser_history_
) {
173 remove_mask
|= BrowsingDataRemover::REMOVE_DOWNLOADS
;
175 if (prefs
->GetBoolean(prefs::kDeleteCache
))
176 remove_mask
|= BrowsingDataRemover::REMOVE_CACHE
;
177 if (prefs
->GetBoolean(prefs::kDeleteCookies
)) {
178 remove_mask
|= site_data_mask
;
179 origin_mask
|= BrowsingDataHelper::UNPROTECTED_WEB
;
181 if (prefs
->GetBoolean(prefs::kDeletePasswords
))
182 remove_mask
|= BrowsingDataRemover::REMOVE_PASSWORDS
;
183 if (prefs
->GetBoolean(prefs::kDeleteFormData
))
184 remove_mask
|= BrowsingDataRemover::REMOVE_FORM_DATA
;
185 // Clearing Content Licenses is only supported in Pepper Flash.
186 if (prefs
->GetBoolean(prefs::kDeauthorizeContentLicenses
) &&
187 *pepper_flash_settings_enabled_
) {
188 remove_mask
|= BrowsingDataRemover::REMOVE_CONTENT_LICENSES
;
190 if (prefs
->GetBoolean(prefs::kDeleteHostedAppsData
)) {
191 remove_mask
|= site_data_mask
;
192 origin_mask
|= BrowsingDataHelper::PROTECTED_WEB
;
195 // BrowsingDataRemover deletes itself when done.
196 int period_selected
= prefs
->GetInteger(prefs::kDeleteTimePeriod
);
197 remover_
= BrowsingDataRemover::CreateForPeriod(profile
,
198 static_cast<BrowsingDataRemover::TimePeriod
>(period_selected
));
199 remover_
->AddObserver(this);
200 remover_
->Remove(remove_mask
, origin_mask
);
202 // Store the clear browsing data time. Next time the clear browsing data
203 // dialog is open, this time is used to decide whether to display an info
205 prefs
->SetInt64(prefs::kLastClearBrowsingDataTime
,
206 base::Time::Now().ToInternalValue());
209 void ClearBrowserDataHandler::OnBrowsingDataRemoverDone() {
210 // No need to remove ourselves as an observer as BrowsingDataRemover deletes
211 // itself after we return.
213 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.doneClearing");
216 void ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged() {
217 web_ui()->CallJavascriptFunction(
218 "ClearBrowserDataOverlay.setAllowDeletingHistory",
219 base::FundamentalValue(*allow_deleting_browser_history_
));
222 } // namespace options