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