Home | History | Annotate | Download | only in options
      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 
     27 namespace {
     28 const char kClearBrowsingDataLearnMoreUrl[] =
     29     "https://support.google.com/chrome/?p=settings_clear_browsing_data";
     30 }
     31 
     32 namespace options {
     33 
     34 ClearBrowserDataHandler::ClearBrowserDataHandler()
     35     : remover_(NULL) {
     36 }
     37 
     38 ClearBrowserDataHandler::~ClearBrowserDataHandler() {
     39   if (remover_)
     40     remover_->RemoveObserver(this);
     41 }
     42 
     43 void 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 
     55 void ClearBrowserDataHandler::InitializePage() {
     56   UpdateInfoBannerVisibility();
     57   OnBrowsingHistoryPrefChanged();
     58 }
     59 
     60 void 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 
     75 void 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 
    140 void 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 
    147 void 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 
    202 void 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 
    209 void ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged() {
    210   web_ui()->CallJavascriptFunction(
    211       "ClearBrowserDataOverlay.updateHistoryCheckboxes",
    212       base::FundamentalValue(*allow_deleting_browser_history_));
    213 }
    214 
    215 }  // namespace options
    216