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/google/google_util.h"
17#include "chrome/browser/profiles/profile.h"
18#include "chrome/common/pref_names.h"
19#include "content/public/browser/notification_details.h"
20#include "content/public/browser/web_ui.h"
21#include "grit/chromium_strings.h"
22#include "grit/generated_resources.h"
23#include "grit/locale_settings.h"
24#include "ui/base/accelerators/accelerator.h"
25#include "ui/base/l10n/l10n_util.h"
26
27namespace {
28const char kClearBrowsingDataLearnMoreUrl[] =
29    "https://support.google.com/chrome/?p=settings_clear_browsing_data";
30}
31
32namespace options {
33
34ClearBrowserDataHandler::ClearBrowserDataHandler()
35    : remover_(NULL) {
36}
37
38ClearBrowserDataHandler::~ClearBrowserDataHandler() {
39  if (remover_)
40    remover_->RemoveObserver(this);
41}
42
43void ClearBrowserDataHandler::InitializeHandler() {
44  PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
45  clear_plugin_lso_data_enabled_.Init(prefs::kClearPluginLSODataEnabled, prefs);
46  pepper_flash_settings_enabled_.Init(prefs::kPepperFlashSettingsEnabled,
47                                      prefs);
48  allow_deleting_browser_history_.Init(
49      prefs::kAllowDeletingBrowserHistory,
50      prefs,
51      base::Bind(&ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged,
52                 base::Unretained(this)));
53}
54
55void ClearBrowserDataHandler::InitializePage() {
56  UpdateInfoBannerVisibility();
57  OnBrowsingHistoryPrefChanged();
58}
59
60void ClearBrowserDataHandler::UpdateInfoBannerVisibility() {
61  Profile* profile = Profile::FromWebUI(web_ui());
62  base::Time lastClearBrowsingDataTime = base::Time::FromInternalValue(
63      profile->GetPrefs()->GetInt64(prefs::kLastClearBrowsingDataTime));
64
65  const int64 kHoursPerDay = 24;
66  bool visible = (base::Time::Now() - lastClearBrowsingDataTime) <=
67      base::TimeDelta::FromHours(kHoursPerDay);
68
69  ListValue args;
70  args.Append(Value::CreateBooleanValue(visible));
71  web_ui()->CallJavascriptFunction(
72      "ClearBrowserDataOverlay.setBannerVisibility", args);
73}
74
75void ClearBrowserDataHandler::GetLocalizedValues(
76    DictionaryValue* localized_strings) {
77  DCHECK(localized_strings);
78
79  static OptionsStringResource resources[] = {
80    { "clearBrowserDataLabel", IDS_CLEAR_BROWSING_DATA_LABEL },
81    { "deleteBrowsingHistoryCheckbox", IDS_DEL_BROWSING_HISTORY_CHKBOX },
82    { "deleteDownloadHistoryCheckbox", IDS_DEL_DOWNLOAD_HISTORY_CHKBOX },
83    { "deleteCacheCheckbox", IDS_DEL_CACHE_CHKBOX },
84    { "deleteCookiesCheckbox", IDS_DEL_COOKIES_CHKBOX },
85    { "deleteCookiesFlashCheckbox", IDS_DEL_COOKIES_FLASH_CHKBOX },
86    { "deletePasswordsCheckbox", IDS_DEL_PASSWORDS_CHKBOX },
87    { "deleteFormDataCheckbox", IDS_DEL_FORM_DATA_CHKBOX },
88    { "deleteHostedAppsDataCheckbox", IDS_DEL_HOSTED_APPS_DATA_CHKBOX },
89    { "deauthorizeContentLicensesCheckbox",
90      IDS_DEAUTHORIZE_CONTENT_LICENSES_CHKBOX },
91    { "clearBrowserDataCommit", IDS_CLEAR_BROWSING_DATA_COMMIT },
92    { "flash_storage_url", IDS_FLASH_STORAGE_URL },
93  };
94
95  RegisterStrings(localized_strings, resources, arraysize(resources));
96  RegisterTitle(localized_strings, "clearBrowserDataOverlay",
97                IDS_CLEAR_BROWSING_DATA_TITLE);
98  localized_strings->SetString(
99      "clearBrowsingDataLearnMoreUrl",
100      google_util::StringAppendGoogleLocaleParam(
101          kClearBrowsingDataLearnMoreUrl));
102
103  ui::Accelerator acc(ui::VKEY_N, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN);
104  localized_strings->SetString(
105      "clearBrowserDataInfoBar",
106      l10n_util::GetStringFUTF16(
107          IDS_CLEAR_BROWSING_DATA_INFO_BAR_TEXT,
108          acc.GetShortcutText()));
109
110  ListValue* time_list = new ListValue;
111  for (int i = 0; i < 5; i++) {
112    string16 label_string;
113    switch (i) {
114      case 0:
115        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_HOUR);
116        break;
117      case 1:
118        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_DAY);
119        break;
120      case 2:
121        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_WEEK);
122        break;
123      case 3:
124        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_4WEEKS);
125        break;
126      case 4:
127        label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_EVERYTHING);
128        break;
129    }
130    ListValue* option = new ListValue();
131    option->Append(new base::FundamentalValue(i));
132    option->Append(new base::StringValue(label_string));
133    time_list->Append(option);
134  }
135  localized_strings->Set("clearBrowserDataTimeList", time_list);
136  localized_strings->SetBoolean("showDeleteBrowsingHistoryCheckboxes",
137                                !Profile::FromWebUI(web_ui())->IsManaged());
138}
139
140void ClearBrowserDataHandler::RegisterMessages() {
141  // Setup handlers specific to this panel.
142  web_ui()->RegisterMessageCallback("performClearBrowserData",
143      base::Bind(&ClearBrowserDataHandler::HandleClearBrowserData,
144                 base::Unretained(this)));
145}
146
147void ClearBrowserDataHandler::HandleClearBrowserData(const ListValue* value) {
148  DCHECK(!remover_);
149
150  Profile* profile = Profile::FromWebUI(web_ui());
151  PrefService* prefs = profile->GetPrefs();
152
153  int site_data_mask = BrowsingDataRemover::REMOVE_SITE_DATA;
154  // Don't try to clear LSO data if it's not supported.
155  if (!*clear_plugin_lso_data_enabled_)
156    site_data_mask &= ~BrowsingDataRemover::REMOVE_PLUGIN_DATA;
157
158  int remove_mask = 0;
159  int origin_mask = 0;
160  if (prefs->GetBoolean(prefs::kDeleteBrowsingHistory) &&
161      *allow_deleting_browser_history_) {
162    remove_mask |= BrowsingDataRemover::REMOVE_HISTORY;
163  }
164  if (prefs->GetBoolean(prefs::kDeleteDownloadHistory) &&
165      *allow_deleting_browser_history_) {
166    remove_mask |= BrowsingDataRemover::REMOVE_DOWNLOADS;
167  }
168  if (prefs->GetBoolean(prefs::kDeleteCache))
169    remove_mask |= BrowsingDataRemover::REMOVE_CACHE;
170  if (prefs->GetBoolean(prefs::kDeleteCookies)) {
171    remove_mask |= site_data_mask;
172    origin_mask |= BrowsingDataHelper::UNPROTECTED_WEB;
173  }
174  if (prefs->GetBoolean(prefs::kDeletePasswords))
175    remove_mask |= BrowsingDataRemover::REMOVE_PASSWORDS;
176  if (prefs->GetBoolean(prefs::kDeleteFormData))
177    remove_mask |= BrowsingDataRemover::REMOVE_FORM_DATA;
178  // Clearing Content Licenses is only supported in Pepper Flash.
179  if (prefs->GetBoolean(prefs::kDeauthorizeContentLicenses) &&
180      *pepper_flash_settings_enabled_) {
181    remove_mask |= BrowsingDataRemover::REMOVE_CONTENT_LICENSES;
182  }
183  if (prefs->GetBoolean(prefs::kDeleteHostedAppsData)) {
184    remove_mask |= site_data_mask;
185    origin_mask |= BrowsingDataHelper::PROTECTED_WEB;
186  }
187
188  // BrowsingDataRemover deletes itself when done.
189  int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod);
190  remover_ = BrowsingDataRemover::CreateForPeriod(profile,
191      static_cast<BrowsingDataRemover::TimePeriod>(period_selected));
192  remover_->AddObserver(this);
193  remover_->Remove(remove_mask, origin_mask);
194
195  // Store the clear browsing data time. Next time the clear browsing data
196  // dialog is open, this time is used to decide whether to display an info
197  // banner or not.
198  prefs->SetInt64(prefs::kLastClearBrowsingDataTime,
199                  base::Time::Now().ToInternalValue());
200}
201
202void ClearBrowserDataHandler::OnBrowsingDataRemoverDone() {
203  // No need to remove ourselves as an observer as BrowsingDataRemover deletes
204  // itself after we return.
205  remover_ = NULL;
206  web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.doneClearing");
207}
208
209void ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged() {
210  web_ui()->CallJavascriptFunction(
211      "ClearBrowserDataOverlay.updateHistoryCheckboxes",
212      base::FundamentalValue(*allow_deleting_browser_history_));
213}
214
215}  // namespace options
216