clear_browser_data_handler.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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.
4
5#include "chrome/browser/ui/webui/options/clear_browser_data_handler.h"
6
7#include "base/basictypes.h"
8#include "base/bind.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 "components/google/core/browser/google_util.h"
19#include "content/public/browser/notification_details.h"
20#include "content/public/browser/web_ui.h"
21#include "grit/generated_resources.h"
22#include "grit/locale_settings.h"
23#include "ui/base/accelerators/accelerator.h"
24#include "ui/base/l10n/l10n_util.h"
25
26namespace {
27const char kClearBrowsingDataLearnMoreUrl[] =
28    "https://support.google.com/chrome/?p=settings_clear_browsing_data";
29}
30
31namespace options {
32
33ClearBrowserDataHandler::ClearBrowserDataHandler()
34    : remover_(NULL) {
35}
36
37ClearBrowserDataHandler::~ClearBrowserDataHandler() {
38  if (remover_)
39    remover_->RemoveObserver(this);
40}
41
42void 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,
46                                      prefs);
47  allow_deleting_browser_history_.Init(
48      prefs::kAllowDeletingBrowserHistory,
49      prefs,
50      base::Bind(&ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged,
51                 base::Unretained(this)));
52}
53
54void ClearBrowserDataHandler::InitializePage() {
55  UpdateInfoBannerVisibility();
56  OnBrowsingHistoryPrefChanged();
57  bool removal_in_progress = !!remover_;
58  web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setClearing",
59                                   base::FundamentalValue(removal_in_progress));
60
61  web_ui()->CallJavascriptFunction(
62      "ClearBrowserDataOverlay.markInitializationComplete");
63}
64
65void ClearBrowserDataHandler::UpdateInfoBannerVisibility() {
66  Profile* profile = Profile::FromWebUI(web_ui());
67  base::Time lastClearBrowsingDataTime = base::Time::FromInternalValue(
68      profile->GetPrefs()->GetInt64(prefs::kLastClearBrowsingDataTime));
69
70  const int64 kHoursPerDay = 24;
71  bool visible = (base::Time::Now() - lastClearBrowsingDataTime) <=
72      base::TimeDelta::FromHours(kHoursPerDay);
73
74  base::ListValue args;
75  args.AppendBoolean(visible);
76  web_ui()->CallJavascriptFunction(
77      "ClearBrowserDataOverlay.setBannerVisibility", args);
78}
79
80void ClearBrowserDataHandler::GetLocalizedValues(
81    base::DictionaryValue* localized_strings) {
82  DCHECK(localized_strings);
83
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 },
100  };
101
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);
107
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()));
114
115  base::ListValue* time_list = new base::ListValue;
116  for (int i = 0; i < 5; i++) {
117    base::string16 label_string;
118    switch (i) {
119      case 0:
120        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_HOUR);
121        break;
122      case 1:
123        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_DAY);
124        break;
125      case 2:
126        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_WEEK);
127        break;
128      case 3:
129        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_4WEEKS);
130        break;
131      case 4:
132        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_EVERYTHING);
133        break;
134    }
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);
139  }
140  localized_strings->Set("clearBrowserDataTimeList", time_list);
141  localized_strings->SetBoolean("showDeleteBrowsingHistoryCheckboxes",
142                                !Profile::FromWebUI(web_ui())->IsSupervised());
143}
144
145void ClearBrowserDataHandler::RegisterMessages() {
146  // Setup handlers specific to this panel.
147  web_ui()->RegisterMessageCallback("performClearBrowserData",
148      base::Bind(&ClearBrowserDataHandler::HandleClearBrowserData,
149                 base::Unretained(this)));
150}
151
152void ClearBrowserDataHandler::HandleClearBrowserData(
153    const base::ListValue* value) {
154  // We should never be called when the previous clearing has not yet finished.
155  CHECK(!remover_);
156
157  Profile* profile = Profile::FromWebUI(web_ui());
158  PrefService* prefs = profile->GetPrefs();
159
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;
164
165  int remove_mask = 0;
166  int origin_mask = 0;
167  if (prefs->GetBoolean(prefs::kDeleteBrowsingHistory) &&
168      *allow_deleting_browser_history_) {
169    remove_mask |= BrowsingDataRemover::REMOVE_HISTORY;
170  }
171  if (prefs->GetBoolean(prefs::kDeleteDownloadHistory) &&
172      *allow_deleting_browser_history_) {
173    remove_mask |= BrowsingDataRemover::REMOVE_DOWNLOADS;
174  }
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;
180  }
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;
189  }
190  if (prefs->GetBoolean(prefs::kDeleteHostedAppsData)) {
191    remove_mask |= site_data_mask;
192    origin_mask |= BrowsingDataHelper::PROTECTED_WEB;
193  }
194
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);
201
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
204  // banner or not.
205  prefs->SetInt64(prefs::kLastClearBrowsingDataTime,
206                  base::Time::Now().ToInternalValue());
207}
208
209void ClearBrowserDataHandler::OnBrowsingDataRemoverDone() {
210  // No need to remove ourselves as an observer as BrowsingDataRemover deletes
211  // itself after we return.
212  remover_ = NULL;
213  web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.doneClearing");
214}
215
216void ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged() {
217  web_ui()->CallJavascriptFunction(
218      "ClearBrowserDataOverlay.setAllowDeletingHistory",
219      base::FundamentalValue(*allow_deleting_browser_history_));
220}
221
222}  // namespace options
223