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