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/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 bool removal_in_progress = !!remover_; 59 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setClearing", 60 base::FundamentalValue(removal_in_progress)); 61 62 web_ui()->CallJavascriptFunction( 63 "ClearBrowserDataOverlay.markInitializationComplete"); 64} 65 66void ClearBrowserDataHandler::UpdateInfoBannerVisibility() { 67 Profile* profile = Profile::FromWebUI(web_ui()); 68 base::Time lastClearBrowsingDataTime = base::Time::FromInternalValue( 69 profile->GetPrefs()->GetInt64(prefs::kLastClearBrowsingDataTime)); 70 71 const int64 kHoursPerDay = 24; 72 bool visible = (base::Time::Now() - lastClearBrowsingDataTime) <= 73 base::TimeDelta::FromHours(kHoursPerDay); 74 75 base::ListValue args; 76 args.Append(base::Value::CreateBooleanValue(visible)); 77 web_ui()->CallJavascriptFunction( 78 "ClearBrowserDataOverlay.setBannerVisibility", args); 79} 80 81void ClearBrowserDataHandler::GetLocalizedValues( 82 base::DictionaryValue* localized_strings) { 83 DCHECK(localized_strings); 84 85 static OptionsStringResource resources[] = { 86 { "clearBrowserDataLabel", IDS_CLEAR_BROWSING_DATA_LABEL }, 87 { "contentSettingsAndSearchEnginesRemain", 88 IDS_CLEAR_BROWSING_DATA_SOME_STUFF_REMAINS }, 89 { "deleteBrowsingHistoryCheckbox", IDS_DEL_BROWSING_HISTORY_CHKBOX }, 90 { "deleteDownloadHistoryCheckbox", IDS_DEL_DOWNLOAD_HISTORY_CHKBOX }, 91 { "deleteCacheCheckbox", IDS_DEL_CACHE_CHKBOX }, 92 { "deleteCookiesCheckbox", IDS_DEL_COOKIES_CHKBOX }, 93 { "deleteCookiesFlashCheckbox", IDS_DEL_COOKIES_FLASH_CHKBOX }, 94 { "deletePasswordsCheckbox", IDS_DEL_PASSWORDS_CHKBOX }, 95 { "deleteFormDataCheckbox", IDS_DEL_FORM_DATA_CHKBOX }, 96 { "deleteHostedAppsDataCheckbox", IDS_DEL_HOSTED_APPS_DATA_CHKBOX }, 97 { "deauthorizeContentLicensesCheckbox", 98 IDS_DEAUTHORIZE_CONTENT_LICENSES_CHKBOX }, 99 { "clearBrowserDataCommit", IDS_CLEAR_BROWSING_DATA_COMMIT }, 100 { "flash_storage_url", IDS_FLASH_STORAGE_URL }, 101 }; 102 103 RegisterStrings(localized_strings, resources, arraysize(resources)); 104 RegisterTitle(localized_strings, "clearBrowserDataOverlay", 105 IDS_CLEAR_BROWSING_DATA_TITLE); 106 localized_strings->SetString("clearBrowsingDataLearnMoreUrl", 107 kClearBrowsingDataLearnMoreUrl); 108 109 ui::Accelerator acc(ui::VKEY_N, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN); 110 localized_strings->SetString( 111 "clearBrowserDataInfoBar", 112 l10n_util::GetStringFUTF16( 113 IDS_CLEAR_BROWSING_DATA_INFO_BAR_TEXT, 114 acc.GetShortcutText())); 115 116 base::ListValue* time_list = new base::ListValue; 117 for (int i = 0; i < 5; i++) { 118 base::string16 label_string; 119 switch (i) { 120 case 0: 121 label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_HOUR); 122 break; 123 case 1: 124 label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_DAY); 125 break; 126 case 2: 127 label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_WEEK); 128 break; 129 case 3: 130 label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_4WEEKS); 131 break; 132 case 4: 133 label_string = l10n_util::GetStringUTF16(IDS_CLEAR_DATA_EVERYTHING); 134 break; 135 } 136 base::ListValue* option = new base::ListValue(); 137 option->Append(new base::FundamentalValue(i)); 138 option->Append(new base::StringValue(label_string)); 139 time_list->Append(option); 140 } 141 localized_strings->Set("clearBrowserDataTimeList", time_list); 142 localized_strings->SetBoolean("showDeleteBrowsingHistoryCheckboxes", 143 !Profile::FromWebUI(web_ui())->IsSupervised()); 144} 145 146void ClearBrowserDataHandler::RegisterMessages() { 147 // Setup handlers specific to this panel. 148 web_ui()->RegisterMessageCallback("performClearBrowserData", 149 base::Bind(&ClearBrowserDataHandler::HandleClearBrowserData, 150 base::Unretained(this))); 151} 152 153void ClearBrowserDataHandler::HandleClearBrowserData( 154 const base::ListValue* value) { 155 // We should never be called when the previous clearing has not yet finished. 156 CHECK(!remover_); 157 158 Profile* profile = Profile::FromWebUI(web_ui()); 159 PrefService* prefs = profile->GetPrefs(); 160 161 int site_data_mask = BrowsingDataRemover::REMOVE_SITE_DATA; 162 // Don't try to clear LSO data if it's not supported. 163 if (!*clear_plugin_lso_data_enabled_) 164 site_data_mask &= ~BrowsingDataRemover::REMOVE_PLUGIN_DATA; 165 166 int remove_mask = 0; 167 int origin_mask = 0; 168 if (prefs->GetBoolean(prefs::kDeleteBrowsingHistory) && 169 *allow_deleting_browser_history_) { 170 remove_mask |= BrowsingDataRemover::REMOVE_HISTORY; 171 } 172 if (prefs->GetBoolean(prefs::kDeleteDownloadHistory) && 173 *allow_deleting_browser_history_) { 174 remove_mask |= BrowsingDataRemover::REMOVE_DOWNLOADS; 175 } 176 if (prefs->GetBoolean(prefs::kDeleteCache)) 177 remove_mask |= BrowsingDataRemover::REMOVE_CACHE; 178 if (prefs->GetBoolean(prefs::kDeleteCookies)) { 179 remove_mask |= site_data_mask; 180 origin_mask |= BrowsingDataHelper::UNPROTECTED_WEB; 181 } 182 if (prefs->GetBoolean(prefs::kDeletePasswords)) 183 remove_mask |= BrowsingDataRemover::REMOVE_PASSWORDS; 184 if (prefs->GetBoolean(prefs::kDeleteFormData)) 185 remove_mask |= BrowsingDataRemover::REMOVE_FORM_DATA; 186 // Clearing Content Licenses is only supported in Pepper Flash. 187 if (prefs->GetBoolean(prefs::kDeauthorizeContentLicenses) && 188 *pepper_flash_settings_enabled_) { 189 remove_mask |= BrowsingDataRemover::REMOVE_CONTENT_LICENSES; 190 } 191 if (prefs->GetBoolean(prefs::kDeleteHostedAppsData)) { 192 remove_mask |= site_data_mask; 193 origin_mask |= BrowsingDataHelper::PROTECTED_WEB; 194 } 195 196 // BrowsingDataRemover deletes itself when done. 197 int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod); 198 remover_ = BrowsingDataRemover::CreateForPeriod(profile, 199 static_cast<BrowsingDataRemover::TimePeriod>(period_selected)); 200 remover_->AddObserver(this); 201 remover_->Remove(remove_mask, origin_mask); 202 203 // Store the clear browsing data time. Next time the clear browsing data 204 // dialog is open, this time is used to decide whether to display an info 205 // banner or not. 206 prefs->SetInt64(prefs::kLastClearBrowsingDataTime, 207 base::Time::Now().ToInternalValue()); 208} 209 210void ClearBrowserDataHandler::OnBrowsingDataRemoverDone() { 211 // No need to remove ourselves as an observer as BrowsingDataRemover deletes 212 // itself after we return. 213 remover_ = NULL; 214 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.doneClearing"); 215} 216 217void ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged() { 218 web_ui()->CallJavascriptFunction( 219 "ClearBrowserDataOverlay.setAllowDeletingHistory", 220 base::FundamentalValue(*allow_deleting_browser_history_)); 221} 222 223} // namespace options 224