| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/options/clear_browser_data_handler.h" | 5 #include "chrome/browser/ui/webui/options/clear_browser_data_handler.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/command_line.h" | |
| 13 #include "base/macros.h" | 12 #include "base/macros.h" |
| 14 #include "base/metrics/histogram_macros.h" | 13 #include "base/metrics/histogram_macros.h" |
| 15 #include "base/metrics/sparse_histogram.h" | 14 #include "base/metrics/sparse_histogram.h" |
| 16 #include "base/prefs/pref_service.h" | 15 #include "base/prefs/pref_service.h" |
| 17 #include "base/strings/string16.h" | 16 #include "base/strings/string16.h" |
| 18 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/values.h" | 18 #include "base/values.h" |
| 20 #include "chrome/app/chrome_command_ids.h" | 19 #include "chrome/app/chrome_command_ids.h" |
| 21 #include "chrome/browser/browser_process.h" | 20 #include "chrome/browser/browser_process.h" |
| 22 #include "chrome/browser/browsing_data/autofill_counter.h" | 21 #include "chrome/browser/browsing_data/autofill_counter.h" |
| 23 #include "chrome/browser/browsing_data/browsing_data_counter.h" | 22 #include "chrome/browser/browsing_data/browsing_data_counter.h" |
| 23 #include "chrome/browser/browsing_data/browsing_data_counter_utils.h" |
| 24 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 24 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
| 25 #include "chrome/browser/browsing_data/browsing_data_remover.h" | 25 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
| 26 #include "chrome/browser/browsing_data/cache_counter.h" | 26 #include "chrome/browser/browsing_data/cache_counter.h" |
| 27 #include "chrome/browser/browsing_data/history_counter.h" | 27 #include "chrome/browser/browsing_data/history_counter.h" |
| 28 #include "chrome/browser/browsing_data/passwords_counter.h" | 28 #include "chrome/browser/browsing_data/passwords_counter.h" |
| 29 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 29 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
| 30 #include "chrome/browser/profiles/profile.h" | 30 #include "chrome/browser/profiles/profile.h" |
| 31 #include "chrome/browser/sync/profile_sync_service_factory.h" | 31 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 32 #include "chrome/browser/ui/accelerator_utils.h" | 32 #include "chrome/browser/ui/accelerator_utils.h" |
| 33 #include "chrome/common/chrome_switches.h" | |
| 34 #include "chrome/common/pref_names.h" | 33 #include "chrome/common/pref_names.h" |
| 35 #include "chrome/grit/generated_resources.h" | 34 #include "chrome/grit/generated_resources.h" |
| 36 #include "chrome/grit/locale_settings.h" | 35 #include "chrome/grit/locale_settings.h" |
| 37 #include "components/google/core/browser/google_util.h" | 36 #include "components/google/core/browser/google_util.h" |
| 38 #include "content/public/browser/notification_details.h" | 37 #include "content/public/browser/notification_details.h" |
| 39 #include "content/public/browser/web_ui.h" | 38 #include "content/public/browser/web_ui.h" |
| 40 #include "ui/base/accelerators/accelerator.h" | 39 #include "ui/base/accelerators/accelerator.h" |
| 41 #include "ui/base/l10n/l10n_util.h" | 40 #include "ui/base/l10n/l10n_util.h" |
| 42 #include "ui/base/text/bytes_formatting.h" | |
| 43 #include "ui/events/keycodes/keyboard_codes.h" | 41 #include "ui/events/keycodes/keyboard_codes.h" |
| 44 | 42 |
| 45 namespace { | 43 namespace { |
| 46 | 44 |
| 47 const char kClearBrowsingDataLearnMoreUrl[] = | 45 const char kClearBrowsingDataLearnMoreUrl[] = |
| 48 "https://support.google.com/chrome/?p=settings_clear_browsing_data"; | 46 "https://support.google.com/chrome/?p=settings_clear_browsing_data"; |
| 49 | 47 |
| 50 bool AreCountersEnabled() { | |
| 51 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 52 switches::kEnableClearBrowsingDataCounters)) { | |
| 53 return true; | |
| 54 } | |
| 55 | |
| 56 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 57 switches::kDisableClearBrowsingDataCounters)) { | |
| 58 return false; | |
| 59 } | |
| 60 | |
| 61 // Enabled by default. | |
| 62 return true; | |
| 63 } | |
| 64 | |
| 65 // A helper function to display the size of cache in units of MB or higher. | |
| 66 // We need this, as 1 MB is the lowest nonzero cache size displayed by the | |
| 67 // counter. | |
| 68 base::string16 FormatBytesMBOrHigher(BrowsingDataCounter::ResultInt bytes) { | |
| 69 if (ui::GetByteDisplayUnits(bytes) >= ui::DataUnits::DATA_UNITS_MEBIBYTE) | |
| 70 return ui::FormatBytes(bytes); | |
| 71 | |
| 72 return ui::FormatBytesWithUnits( | |
| 73 bytes, ui::DataUnits::DATA_UNITS_MEBIBYTE, true); | |
| 74 } | |
| 75 | |
| 76 } // namespace | 48 } // namespace |
| 77 | 49 |
| 78 namespace options { | 50 namespace options { |
| 79 | 51 |
| 80 ClearBrowserDataHandler::ClearBrowserDataHandler() | 52 ClearBrowserDataHandler::ClearBrowserDataHandler() |
| 81 : remover_(nullptr), | 53 : remover_(nullptr), |
| 82 sync_service_(nullptr) { | 54 sync_service_(nullptr) { |
| 83 } | 55 } |
| 84 | 56 |
| 85 ClearBrowserDataHandler::~ClearBrowserDataHandler() { | 57 ClearBrowserDataHandler::~ClearBrowserDataHandler() { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 DCHECK_NE(ui::VKEY_UNKNOWN, acc.key_code()); | 116 DCHECK_NE(ui::VKEY_UNKNOWN, acc.key_code()); |
| 145 text = l10n_util::GetStringFUTF16(IDS_CLEAR_BROWSING_DATA_INFO_BAR_TEXT, | 117 text = l10n_util::GetStringFUTF16(IDS_CLEAR_BROWSING_DATA_INFO_BAR_TEXT, |
| 146 acc.GetShortcutText()); | 118 acc.GetShortcutText()); |
| 147 } | 119 } |
| 148 } | 120 } |
| 149 | 121 |
| 150 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setBannerText", | 122 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setBannerText", |
| 151 base::StringValue(text)); | 123 base::StringValue(text)); |
| 152 } | 124 } |
| 153 | 125 |
| 154 // static | |
| 155 base::string16 ClearBrowserDataHandler::GetCounterTextFromResult( | |
| 156 const BrowsingDataCounter::Result* result) { | |
| 157 base::string16 text; | |
| 158 std::string pref_name = result->source()->GetPrefName(); | |
| 159 | |
| 160 if (!result->Finished()) { | |
| 161 // The counter is still counting. | |
| 162 text = l10n_util::GetStringUTF16(IDS_CLEAR_BROWSING_DATA_CALCULATING); | |
| 163 | |
| 164 } else if (pref_name == prefs::kDeletePasswords) { | |
| 165 // Passwords counter. | |
| 166 BrowsingDataCounter::ResultInt passwords_count = | |
| 167 static_cast<const BrowsingDataCounter::FinishedResult*>( | |
| 168 result)->Value(); | |
| 169 text = l10n_util::GetPluralStringFUTF16( | |
| 170 IDS_DEL_PASSWORDS_COUNTER, passwords_count); | |
| 171 | |
| 172 } else if (pref_name == prefs::kDeleteCache) { | |
| 173 // Cache counter. | |
| 174 BrowsingDataCounter::ResultInt cache_size_bytes = | |
| 175 static_cast<const BrowsingDataCounter::FinishedResult*>( | |
| 176 result)->Value(); | |
| 177 | |
| 178 PrefService* prefs = result->source()->GetProfile()->GetPrefs(); | |
| 179 BrowsingDataRemover::TimePeriod time_period = | |
| 180 static_cast<BrowsingDataRemover::TimePeriod>( | |
| 181 prefs->GetInteger(prefs::kDeleteTimePeriod)); | |
| 182 | |
| 183 // Three cases: Nonzero result for the entire cache, nonzero result for | |
| 184 // a subset of cache (i.e. a finite time interval), and almost zero (< 1MB). | |
| 185 static const int kBytesInAMegabyte = 1024 * 1024; | |
| 186 if (cache_size_bytes >= kBytesInAMegabyte) { | |
| 187 base::string16 formatted_size = FormatBytesMBOrHigher(cache_size_bytes); | |
| 188 text = time_period == BrowsingDataRemover::EVERYTHING | |
| 189 ? formatted_size | |
| 190 : l10n_util::GetStringFUTF16(IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE, | |
| 191 formatted_size); | |
| 192 } else { | |
| 193 text = l10n_util::GetStringUTF16(IDS_DEL_CACHE_COUNTER_ALMOST_EMPTY); | |
| 194 } | |
| 195 | |
| 196 } else if (pref_name == prefs::kDeleteBrowsingHistory) { | |
| 197 // History counter. | |
| 198 const HistoryCounter::HistoryResult* history_result = | |
| 199 static_cast<const HistoryCounter::HistoryResult*>(result); | |
| 200 BrowsingDataCounter::ResultInt local_item_count = history_result->Value(); | |
| 201 bool has_synced_visits = history_result->has_synced_visits(); | |
| 202 | |
| 203 text = has_synced_visits | |
| 204 ? l10n_util::GetPluralStringFUTF16( | |
| 205 IDS_DEL_BROWSING_HISTORY_COUNTER_SYNCED, local_item_count) | |
| 206 : l10n_util::GetPluralStringFUTF16( | |
| 207 IDS_DEL_BROWSING_HISTORY_COUNTER, local_item_count); | |
| 208 | |
| 209 } else if (pref_name == prefs::kDeleteFormData) { | |
| 210 // Autofill counter. | |
| 211 const AutofillCounter::AutofillResult* autofill_result = | |
| 212 static_cast<const AutofillCounter::AutofillResult*>(result); | |
| 213 AutofillCounter::ResultInt num_suggestions = autofill_result->Value(); | |
| 214 AutofillCounter::ResultInt num_credit_cards = | |
| 215 autofill_result->num_credit_cards(); | |
| 216 AutofillCounter::ResultInt num_addresses = autofill_result->num_addresses(); | |
| 217 | |
| 218 std::vector<base::string16> displayed_strings; | |
| 219 | |
| 220 if (num_credit_cards) { | |
| 221 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
| 222 IDS_DEL_AUTOFILL_COUNTER_CREDIT_CARDS, num_credit_cards)); | |
| 223 } | |
| 224 if (num_addresses) { | |
| 225 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
| 226 IDS_DEL_AUTOFILL_COUNTER_ADDRESSES, num_addresses)); | |
| 227 } | |
| 228 if (num_suggestions) { | |
| 229 // We use a different wording for autocomplete suggestions based on the | |
| 230 // length of the entire string. | |
| 231 switch (displayed_strings.size()) { | |
| 232 case 0: | |
| 233 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
| 234 IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS, num_suggestions)); | |
| 235 break; | |
| 236 case 1: | |
| 237 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
| 238 IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_LONG, num_suggestions)); | |
| 239 break; | |
| 240 case 2: | |
| 241 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
| 242 IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_SHORT, num_suggestions)); | |
| 243 break; | |
| 244 default: | |
| 245 NOTREACHED(); | |
| 246 } | |
| 247 } | |
| 248 | |
| 249 // Construct the resulting string from the sections in |displayed_strings|. | |
| 250 switch (displayed_strings.size()) { | |
| 251 case 0: | |
| 252 text = l10n_util::GetStringUTF16(IDS_DEL_AUTOFILL_COUNTER_EMPTY); | |
| 253 break; | |
| 254 case 1: | |
| 255 text = displayed_strings[0]; | |
| 256 break; | |
| 257 case 2: | |
| 258 text = l10n_util::GetStringFUTF16(IDS_DEL_AUTOFILL_COUNTER_TWO_TYPES, | |
| 259 displayed_strings[0], | |
| 260 displayed_strings[1]); | |
| 261 break; | |
| 262 case 3: | |
| 263 text = l10n_util::GetStringFUTF16(IDS_DEL_AUTOFILL_COUNTER_THREE_TYPES, | |
| 264 displayed_strings[0], | |
| 265 displayed_strings[1], | |
| 266 displayed_strings[2]); | |
| 267 break; | |
| 268 default: | |
| 269 NOTREACHED(); | |
| 270 } | |
| 271 } | |
| 272 | |
| 273 return text; | |
| 274 } | |
| 275 | |
| 276 void ClearBrowserDataHandler::OnPageOpened(const base::ListValue* value) { | 126 void ClearBrowserDataHandler::OnPageOpened(const base::ListValue* value) { |
| 277 for (BrowsingDataCounter* counter : counters_) { | 127 for (BrowsingDataCounter* counter : counters_) { |
| 278 DCHECK(AreCountersEnabled()); | 128 DCHECK(AreCountersEnabled()); |
| 279 counter->Restart(); | 129 counter->Restart(); |
| 280 } | 130 } |
| 281 } | 131 } |
| 282 | 132 |
| 283 void ClearBrowserDataHandler::GetLocalizedValues( | 133 void ClearBrowserDataHandler::GetLocalizedValues( |
| 284 base::DictionaryValue* localized_strings) { | 134 base::DictionaryValue* localized_strings) { |
| 285 DCHECK(localized_strings); | 135 DCHECK(localized_strings); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 base::StringValue(GetCounterTextFromResult(result.get()))); | 325 base::StringValue(GetCounterTextFromResult(result.get()))); |
| 476 } | 326 } |
| 477 | 327 |
| 478 void ClearBrowserDataHandler::OnStateChanged() { | 328 void ClearBrowserDataHandler::OnStateChanged() { |
| 479 web_ui()->CallJavascriptFunction( | 329 web_ui()->CallJavascriptFunction( |
| 480 "ClearBrowserDataOverlay.updateSyncWarning", | 330 "ClearBrowserDataOverlay.updateSyncWarning", |
| 481 base::FundamentalValue(sync_service_ && sync_service_->IsSyncActive())); | 331 base::FundamentalValue(sync_service_ && sync_service_->IsSyncActive())); |
| 482 } | 332 } |
| 483 | 333 |
| 484 } // namespace options | 334 } // namespace options |
| OLD | NEW |