15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines the Chrome Extensions BrowsingData API functions, which entail
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// clearing browsing data, and clearing the browser's cache (which, let's be
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// honest, are the same thing), as specified in the extension API JSON.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/browsing_data/browsing_data_api.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_data_remover_helper.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/error_utils.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extension_browsing_data_api_constants {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Parameter name keys.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDataRemovalPermittedKey[] = "dataRemovalPermitted";
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDataToRemoveKey[] = "dataToRemove";
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOptionsKey[] = "options";
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Type keys.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppCacheKey[] = "appcache";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCacheKey[] = "cache";
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kChannelIDsKey[] = "serverBoundCertificates";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCookiesKey[] = "cookies";
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDownloadsKey[] = "downloads";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileSystemsKey[] = "fileSystems";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFormDataKey[] = "formData";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHistoryKey[] = "history";
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIndexedDBKey[] = "indexedDB";
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLocalStorageKey[] = "localStorage";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPasswordsKey[] = "passwords";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPluginDataKey[] = "pluginData";
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kServiceWorkersKey[] = "serviceWorkers";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWebSQLKey[] = "webSQL";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Option keys.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtensionsKey[] = "extension";
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOriginTypesKey[] = "originTypes";
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProtectedWebKey[] = "protectedWeb";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSinceKey[] = "since";
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUnprotectedWebKey[] = "unprotectedWeb";
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Errors!
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The placeholder will be filled by the name of the affected data type (e.g.,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "history").
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kBadDataTypeDetails[] = "Invalid value for data type '%s'.";
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDeleteProhibitedError[] = "Browsing history and downloads are not "
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      "permitted to be removed.";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOneAtATimeError[] = "Only one 'browsingData' API call can run at "
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "a time.";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extension_browsing_data_api_constants
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int MaskForKey(const char* key) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kAppCacheKey) == 0)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_APPCACHE;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kCacheKey) == 0)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_CACHE;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kCookiesKey) == 0)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_COOKIES;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kDownloadsKey) == 0)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_DOWNLOADS;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kFileSystemsKey) == 0)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_FILE_SYSTEMS;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kFormDataKey) == 0)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_FORM_DATA;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kHistoryKey) == 0)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_HISTORY;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kIndexedDBKey) == 0)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_INDEXEDDB;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kLocalStorageKey) == 0)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_LOCAL_STORAGE;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key,
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             extension_browsing_data_api_constants::kChannelIDsKey) == 0)
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_CHANNEL_IDS;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kPasswordsKey) == 0)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_PASSWORDS;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kPluginDataKey) == 0)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_PLUGIN_DATA;
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kServiceWorkersKey) ==
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      0)
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return BrowsingDataRemover::REMOVE_SERVICE_WORKERS;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (strcmp(key, extension_browsing_data_api_constants::kWebSQLKey) == 0)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BrowsingDataRemover::REMOVE_WEBSQL;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns false if any of the selected data types are not allowed to be
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// deleted.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsRemovalPermitted(int removal_mask, PrefService* prefs) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enterprise policy or user preference might prohibit deleting browser or
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // download history.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((removal_mask & BrowsingDataRemover::REMOVE_HISTORY) ||
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (removal_mask & BrowsingDataRemover::REMOVE_DOWNLOADS)) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool BrowsingDataSettingsFunction::RunSync() {
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PrefService* prefs = GetProfile()->GetPrefs();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill origin types.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The "cookies" and "hosted apps" UI checkboxes both map to
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // REMOVE_SITE_DATA in browsing_data_remover.h, the former for the unprotected
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // web, the latter for  protected web data. There is no UI control for
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension data.
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> origin_types(new base::DictionaryValue);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  origin_types->SetBoolean(
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_browsing_data_api_constants::kUnprotectedWebKey,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->GetBoolean(prefs::kDeleteCookies));
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  origin_types->SetBoolean(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_browsing_data_api_constants::kProtectedWebKey,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->GetBoolean(prefs::kDeleteHostedAppsData));
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  origin_types->SetBoolean(
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_browsing_data_api_constants::kExtensionsKey, false);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill deletion time period.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int period_pref = prefs->GetInteger(prefs::kDeleteTimePeriod);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowsingDataRemover::TimePeriod period =
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<BrowsingDataRemover::TimePeriod>(period_pref);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double since = 0;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (period != BrowsingDataRemover::EVERYTHING) {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Time time = BrowsingDataRemover::CalculateBeginDeleteTime(period);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    since = time.ToJsTime();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> options(new base::DictionaryValue);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options->Set(extension_browsing_data_api_constants::kOriginTypesKey,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               origin_types.release());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options->SetDouble(extension_browsing_data_api_constants::kSinceKey, since);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill dataToRemove and dataRemovalPermitted.
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> selected(new base::DictionaryValue);
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> permitted(new base::DictionaryValue);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool delete_site_data = prefs->GetBoolean(prefs::kDeleteCookies) ||
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          prefs->GetBoolean(prefs::kDeleteHostedAppsData);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kAppCacheKey,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             delete_site_data);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kCookiesKey,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             delete_site_data);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kFileSystemsKey,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             delete_site_data);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kIndexedDBKey,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             delete_site_data);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_browsing_data_api_constants::kLocalStorageKey,
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete_site_data);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kWebSQLKey,
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             delete_site_data);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extension_browsing_data_api_constants::kChannelIDsKey,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete_site_data);
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)             extension_browsing_data_api_constants::kServiceWorkersKey,
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)             delete_site_data);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_browsing_data_api_constants::kPluginDataKey,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete_site_data && prefs->GetBoolean(prefs::kClearPluginLSODataEnabled));
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kHistoryKey,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             prefs->GetBoolean(prefs::kDeleteBrowsingHistory));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kDownloadsKey,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             prefs->GetBoolean(prefs::kDeleteDownloadHistory));
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kCacheKey,
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             prefs->GetBoolean(prefs::kDeleteCache));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kFormDataKey,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             prefs->GetBoolean(prefs::kDeleteFormData));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDetails(selected.get(), permitted.get(),
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             extension_browsing_data_api_constants::kPasswordsKey,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             prefs->GetBoolean(prefs::kDeletePasswords));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->Set(extension_browsing_data_api_constants::kOptionsKey,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              options.release());
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->Set(extension_browsing_data_api_constants::kDataToRemoveKey,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              selected.release());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->Set(extension_browsing_data_api_constants::kDataRemovalPermittedKey,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              permitted.release());
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(result.release());
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid BrowsingDataSettingsFunction::SetDetails(
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::DictionaryValue* selected_dict,
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::DictionaryValue* permitted_dict,
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char* data_type,
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool is_selected) {
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool is_permitted =
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      IsRemovalPermitted(MaskForKey(data_type), GetProfile()->GetPrefs());
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_dict->SetBoolean(data_type, is_selected && is_permitted);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  permitted_dict->SetBoolean(data_type, is_permitted);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowsingDataRemoverFunction::OnBrowsingDataRemoverDone() {
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this->SendResponse(true);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Release();  // Balanced in RunAsync.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool BrowsingDataRemoverFunction::RunAsync() {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we don't have a profile, something's pretty wrong.
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(GetProfile());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Grab the initial |options| parameter, and parse out the arguments.
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* options;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &options));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(options);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origin_set_mask_ = ParseOriginSetMask(*options);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |ms_since_epoch| isn't set, default it to 0.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double ms_since_epoch;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!options->GetDouble(extension_browsing_data_api_constants::kSinceKey,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          &ms_since_epoch))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ms_since_epoch = 0;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // base::Time takes a double that represents seconds since epoch. JavaScript
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gives developers milliseconds, so do a quick conversion before populating
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the object. Also, Time::FromDoubleT converts double time 0 to empty Time
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // object. So we need to do special handling here.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remove_since_ = (ms_since_epoch == 0) ?
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time::UnixEpoch() :
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time::FromDoubleT(ms_since_epoch / 1000.0);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  removal_mask_ = GetRemovalMask();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (bad_message_)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check for prohibited data types.
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!IsRemovalPermitted(removal_mask_, GetProfile()->GetPrefs())) {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_ = extension_browsing_data_api_constants::kDeleteProhibitedError;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (removal_mask_ & BrowsingDataRemover::REMOVE_PLUGIN_DATA) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we're being asked to remove plugin data, check whether it's actually
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // supported.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        BrowserThread::FILE,
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        FROM_HERE,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            &BrowsingDataRemoverFunction::CheckRemovingPluginDataSupported,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this,
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            PluginPrefs::GetForProfile(GetProfile())));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartRemoving();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Will finish asynchronously.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowsingDataRemoverFunction::CheckRemovingPluginDataSupported(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<PluginPrefs> plugin_prefs) {
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!PluginDataRemoverHelper::IsSupported(plugin_prefs.get()))
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    removal_mask_ &= ~BrowsingDataRemover::REMOVE_PLUGIN_DATA;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&BrowsingDataRemoverFunction::StartRemoving, this));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowsingDataRemoverFunction::StartRemoving() {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BrowsingDataRemover::is_removing()) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_ = extension_browsing_data_api_constants::kOneAtATimeError;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendResponse(false);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're good to go, add a ref (Balanced in OnBrowsingDataRemoverDone)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddRef();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a BrowsingDataRemover, set the current object as an observer (so
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that we're notified after removal) and call remove() with the arguments
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we've generated above. We can use a raw pointer here, as the browsing data
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remover is responsible for deleting itself once data removal is complete.
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BrowsingDataRemover* remover = BrowsingDataRemover::CreateForRange(
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GetProfile(), remove_since_, base::Time::Max());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remover->AddObserver(this);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remover->Remove(removal_mask_, origin_set_mask_);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoverFunction::ParseOriginSetMask(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::DictionaryValue& options) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parse the |options| dictionary to generate the origin set mask. Default to
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UNPROTECTED_WEB if the developer doesn't specify anything.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mask = BrowsingDataHelper::UNPROTECTED_WEB;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::DictionaryValue* d = NULL;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (options.HasKey(extension_browsing_data_api_constants::kOriginTypesKey)) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXTENSION_FUNCTION_VALIDATE(options.GetDictionary(
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_browsing_data_api_constants::kOriginTypesKey, &d));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool value;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The developer specified something! Reset to 0 and parse the dictionary.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mask = 0;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Unprotected web.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (d->HasKey(extension_browsing_data_api_constants::kUnprotectedWebKey)) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXTENSION_FUNCTION_VALIDATE(d->GetBoolean(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_browsing_data_api_constants::kUnprotectedWebKey, &value));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mask |= value ? BrowsingDataHelper::UNPROTECTED_WEB : 0;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Protected web.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (d->HasKey(extension_browsing_data_api_constants::kProtectedWebKey)) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXTENSION_FUNCTION_VALIDATE(d->GetBoolean(
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_browsing_data_api_constants::kProtectedWebKey, &value));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mask |= value ? BrowsingDataHelper::PROTECTED_WEB : 0;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Extensions.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (d->HasKey(extension_browsing_data_api_constants::kExtensionsKey)) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXTENSION_FUNCTION_VALIDATE(d->GetBoolean(
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_browsing_data_api_constants::kExtensionsKey, &value));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mask |= value ? BrowsingDataHelper::EXTENSION : 0;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return mask;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Parses the |dataToRemove| argument to generate the removal mask. Sets
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |bad_message_| (like EXTENSION_FUNCTION_VALIDATE would if this were a bool
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// method) if 'dataToRemove' is not present or any data-type keys don't have
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// supported (boolean) values.
360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveFunction::GetRemovalMask() {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* data_to_remove;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!args_->GetDictionary(1, &data_to_remove)) {
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bad_message_ = true;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int removal_mask = 0;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (base::DictionaryValue::Iterator i(*data_to_remove);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       !i.IsAtEnd();
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       i.Advance()) {
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool selected = false;
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!i.value().GetAsBoolean(&selected)) {
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bad_message_ = true;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return 0;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (selected)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      removal_mask |= MaskForKey(i.key().c_str());
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return removal_mask;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveAppcacheFunction::GetRemovalMask() {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_APPCACHE;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveCacheFunction::GetRemovalMask() {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_CACHE;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveCookiesFunction::GetRemovalMask() {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_COOKIES |
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         BrowsingDataRemover::REMOVE_CHANNEL_IDS;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveDownloadsFunction::GetRemovalMask() {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_DOWNLOADS;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveFileSystemsFunction::GetRemovalMask() {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_FILE_SYSTEMS;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveFormDataFunction::GetRemovalMask() {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_FORM_DATA;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveHistoryFunction::GetRemovalMask() {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_HISTORY;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveIndexedDBFunction::GetRemovalMask() {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_INDEXEDDB;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveLocalStorageFunction::GetRemovalMask() {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_LOCAL_STORAGE;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemovePluginDataFunction::GetRemovalMask() {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_PLUGIN_DATA;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemovePasswordsFunction::GetRemovalMask() {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_PASSWORDS;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)int BrowsingDataRemoveServiceWorkersFunction::GetRemovalMask() {
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_SERVICE_WORKERS;
4316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
4326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
433a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int BrowsingDataRemoveWebSQLFunction::GetRemovalMask() {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowsingDataRemover::REMOVE_WEBSQL;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
436