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