| Index: chrome/browser/browsing_data/browsing_data_remover_impl.cc | 
| diff --git a/chrome/browser/browsing_data/browsing_data_remover_impl.cc b/chrome/browser/browsing_data/browsing_data_remover_impl.cc | 
| index dd3a924c22ca7cd1b62fe8b9a5a4e2d848e91ae6..f58b19bda5acf5e05cfbffc3573e6e9a9d40cd51 100644 | 
| --- a/chrome/browser/browsing_data/browsing_data_remover_impl.cc | 
| +++ b/chrome/browser/browsing_data/browsing_data_remover_impl.cc | 
| @@ -15,6 +15,7 @@ | 
| #include "base/logging.h" | 
| #include "base/memory/ptr_util.h" | 
| #include "base/metrics/histogram_macros.h" | 
| +#include "base/stl_util.h" | 
| #include "chrome/browser/browsing_data/browsing_data_helper.h" | 
| #include "chrome/browser/browsing_data/browsing_data_remover_delegate.h" | 
| #include "chrome/browser/profiles/profile.h" | 
| @@ -46,6 +47,7 @@ | 
| using base::UserMetricsAction; | 
| using content::BrowserContext; | 
| using content::BrowserThread; | 
| +using content::BrowsingDataType; | 
| using content::BrowsingDataFilterBuilder; | 
| using content::DOMStorageContext; | 
|  | 
| @@ -117,6 +119,16 @@ void ClearChannelIDsOnIOThread( | 
| base::RetainedRef(std::move(rq_context)), callback)); | 
| } | 
|  | 
| +bool IsFilterable(const std::set<const BrowsingDataType*>& remove_mask) { | 
| +  for (const BrowsingDataType* data_type : remove_mask) { | 
| +    DCHECK(data_type); | 
| +    if (!data_type->filterable) | 
| +      return false; | 
| +  } | 
| + | 
| +  return true; | 
| +} | 
| + | 
| }  // namespace | 
|  | 
| BrowsingDataRemoverImpl::CompletionInhibitor* | 
| @@ -152,7 +164,6 @@ void BrowsingDataRemoverImpl::SubTask::CompletionCallback() { | 
| BrowsingDataRemoverImpl::BrowsingDataRemoverImpl( | 
| content::BrowserContext* browser_context) | 
| : browser_context_(browser_context), | 
| -      remove_mask_(-1), | 
| origin_type_mask_(-1), | 
| is_removing_(false), | 
| sub_task_forward_callback_( | 
| @@ -204,10 +215,11 @@ BrowsingDataRemoverImpl::GetEmbedderDelegate() const { | 
| return embedder_delegate_.get(); | 
| } | 
|  | 
| -void BrowsingDataRemoverImpl::Remove(const base::Time& delete_begin, | 
| -                                 const base::Time& delete_end, | 
| -                                 int remove_mask, | 
| -                                 int origin_type_mask) { | 
| +void BrowsingDataRemoverImpl::Remove( | 
| +    const base::Time& delete_begin, | 
| +    const base::Time& delete_end, | 
| +    const std::set<const BrowsingDataType*>& remove_mask, | 
| +    int origin_type_mask) { | 
| RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, | 
| std::unique_ptr<BrowsingDataFilterBuilder>(), nullptr); | 
| } | 
| @@ -215,7 +227,7 @@ void BrowsingDataRemoverImpl::Remove(const base::Time& delete_begin, | 
| void BrowsingDataRemoverImpl::RemoveAndReply( | 
| const base::Time& delete_begin, | 
| const base::Time& delete_end, | 
| -    int remove_mask, | 
| +    const std::set<const BrowsingDataType*>& remove_mask, | 
| int origin_type_mask, | 
| Observer* observer) { | 
| DCHECK(observer); | 
| @@ -226,10 +238,10 @@ void BrowsingDataRemoverImpl::RemoveAndReply( | 
| void BrowsingDataRemoverImpl::RemoveWithFilter( | 
| const base::Time& delete_begin, | 
| const base::Time& delete_end, | 
| -    int remove_mask, | 
| +    const std::set<const BrowsingDataType*>& remove_mask, | 
| int origin_type_mask, | 
| std::unique_ptr<BrowsingDataFilterBuilder> filter_builder) { | 
| -  DCHECK_EQ(0, remove_mask & ~FILTERABLE_DATATYPES); | 
| +  DCHECK(IsFilterable(remove_mask)); | 
| DCHECK(filter_builder); | 
| RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, | 
| std::move(filter_builder), nullptr); | 
| @@ -238,11 +250,11 @@ void BrowsingDataRemoverImpl::RemoveWithFilter( | 
| void BrowsingDataRemoverImpl::RemoveWithFilterAndReply( | 
| const base::Time& delete_begin, | 
| const base::Time& delete_end, | 
| -    int remove_mask, | 
| +    const std::set<const BrowsingDataType*>& remove_mask, | 
| int origin_type_mask, | 
| std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | 
| Observer* observer) { | 
| -  DCHECK_EQ(0, remove_mask & ~FILTERABLE_DATATYPES); | 
| +  DCHECK(IsFilterable(remove_mask)); | 
| DCHECK(filter_builder); | 
| DCHECK(observer); | 
| RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, | 
| @@ -252,7 +264,7 @@ void BrowsingDataRemoverImpl::RemoveWithFilterAndReply( | 
| void BrowsingDataRemoverImpl::RemoveInternal( | 
| const base::Time& delete_begin, | 
| const base::Time& delete_end, | 
| -    int remove_mask, | 
| +    const std::set<const BrowsingDataType*>& remove_mask, | 
| int origin_type_mask, | 
| std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | 
| Observer* observer) { | 
| @@ -299,7 +311,7 @@ void BrowsingDataRemoverImpl::RunNextTask() { | 
| void BrowsingDataRemoverImpl::RemoveImpl( | 
| const base::Time& delete_begin, | 
| const base::Time& delete_end, | 
| -    int remove_mask, | 
| +    const std::set<const BrowsingDataType*>& remove_mask, | 
| const BrowsingDataFilterBuilder& filter_builder, | 
| int origin_type_mask) { | 
| // =============== README before adding more storage backends =============== | 
| @@ -345,11 +357,13 @@ void BrowsingDataRemoverImpl::RemoveImpl( | 
|  | 
| // Record the combined deletion of cookies and cache. | 
| CookieOrCacheDeletionChoice choice = NEITHER_COOKIES_NOR_CACHE; | 
| -  if (remove_mask & REMOVE_COOKIES && | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeCookies) && | 
| origin_type_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { | 
| -    choice = remove_mask & REMOVE_CACHE ? BOTH_COOKIES_AND_CACHE | 
| -                                        : ONLY_COOKIES; | 
| -  } else if (remove_mask & REMOVE_CACHE) { | 
| +    choice = base::ContainsValue(remove_mask, &content::kBrowsingDataTypeCache) | 
| +                 ? BOTH_COOKIES_AND_CACHE | 
| +                 : ONLY_COOKIES; | 
| +  } else if (base::ContainsValue(remove_mask, | 
| +                                 &content::kBrowsingDataTypeCache)) { | 
| choice = ONLY_CACHE; | 
| } | 
|  | 
| @@ -372,8 +386,10 @@ void BrowsingDataRemoverImpl::RemoveImpl( | 
| filter_builder.BuildGeneralFilter(); | 
|  | 
| ////////////////////////////////////////////////////////////////////////////// | 
| -  // REMOVE_DOWNLOADS | 
| -  if ((remove_mask & REMOVE_DOWNLOADS) && may_delete_history) { | 
| +  // kBrowsingDataTypeDownloads | 
| +  if ((base::ContainsValue(remove_mask, | 
| +                           &content::kBrowsingDataTypeDownloads)) && | 
| +      may_delete_history) { | 
| content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads")); | 
| content::DownloadManager* download_manager = | 
| BrowserContext::GetDownloadManager(browser_context_); | 
| @@ -382,10 +398,10 @@ void BrowsingDataRemoverImpl::RemoveImpl( | 
| } | 
|  | 
| ////////////////////////////////////////////////////////////////////////////// | 
| -  // REMOVE_CHANNEL_IDS | 
| +  // kBrowsingDataTypeChannelIDs | 
| // Channel IDs are not separated for protected and unprotected web | 
| // origins. We check the origin_type_mask_ to prevent unintended deletion. | 
| -  if (remove_mask & REMOVE_CHANNEL_IDS && | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeChannelIDs) && | 
| origin_type_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { | 
| content::RecordAction( | 
| UserMetricsAction("ClearBrowsingData_ChannelIDs")); | 
| @@ -411,36 +427,40 @@ void BrowsingDataRemoverImpl::RemoveImpl( | 
| // don't accidentally remove the cookies that are associated with the | 
| // UNPROTECTED_WEB origin. This is necessary because cookies are not separated | 
| // between UNPROTECTED_WEB and PROTECTED_WEB. | 
| -  if (remove_mask & REMOVE_COOKIES && | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeCookies) && | 
| origin_type_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_COOKIES; | 
| } | 
| -  if (remove_mask & REMOVE_LOCAL_STORAGE) { | 
| +  if (base::ContainsValue(remove_mask, | 
| +                          &content::kBrowsingDataTypeLocalStorage)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE; | 
| } | 
| -  if (remove_mask & REMOVE_INDEXEDDB) { | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeIndexedDB)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_INDEXEDDB; | 
| } | 
| -  if (remove_mask & REMOVE_WEBSQL) { | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeWebSQL)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_WEBSQL; | 
| } | 
| -  if (remove_mask & REMOVE_APPCACHE) { | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeAppCache)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_APPCACHE; | 
| } | 
| -  if (remove_mask & REMOVE_SERVICE_WORKERS) { | 
| +  if (base::ContainsValue(remove_mask, | 
| +                          &content::kBrowsingDataTypeServiceWorkers)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_SERVICE_WORKERS; | 
| } | 
| -  if (remove_mask & REMOVE_CACHE_STORAGE) { | 
| +  if (base::ContainsValue(remove_mask, | 
| +                          &content::kBrowsingDataTypeCacheStorage)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_CACHE_STORAGE; | 
| } | 
| -  if (remove_mask & REMOVE_FILE_SYSTEMS) { | 
| +  if (base::ContainsValue(remove_mask, | 
| +                          &content::kBrowsingDataTypeFileSystems)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS; | 
| } | 
| @@ -448,7 +468,8 @@ void BrowsingDataRemoverImpl::RemoveImpl( | 
| // Content Decryption Modules used by Encrypted Media store licenses in a | 
| // private filesystem. These are different than content licenses used by | 
| // Flash (which are deleted father down in this method). | 
| -  if (remove_mask & REMOVE_MEDIA_LICENSES) { | 
| +  if (base::ContainsValue(remove_mask, | 
| +                          &content::kBrowsingDataTypeMediaLicenses)) { | 
| storage_partition_remove_mask |= | 
| content::StoragePartition::REMOVE_DATA_MASK_PLUGIN_PRIVATE_DATA; | 
| } | 
| @@ -493,8 +514,8 @@ void BrowsingDataRemoverImpl::RemoveImpl( | 
| } | 
|  | 
| ////////////////////////////////////////////////////////////////////////////// | 
| -  // CACHE | 
| -  if (remove_mask & REMOVE_CACHE) { | 
| +  // kBrowsingDataTypeCache | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeCache)) { | 
| // Tell the renderers to clear their cache. | 
| web_cache::WebCacheManager::GetInstance()->ClearCache(); | 
|  | 
| @@ -523,7 +544,7 @@ void BrowsingDataRemoverImpl::RemoveImpl( | 
|  | 
| ////////////////////////////////////////////////////////////////////////////// | 
| // Auth cache. | 
| -  if (remove_mask & REMOVE_COOKIES) { | 
| +  if (base::ContainsValue(remove_mask, &content::kBrowsingDataTypeCookies)) { | 
| scoped_refptr<net::URLRequestContextGetter> request_context = | 
| BrowserContext::GetDefaultStoragePartition(browser_context_) | 
| ->GetURLRequestContext(); | 
| @@ -573,7 +594,8 @@ const base::Time& BrowsingDataRemoverImpl::GetLastUsedEndTime() { | 
| return delete_end_; | 
| } | 
|  | 
| -int BrowsingDataRemoverImpl::GetLastUsedRemovalMask() { | 
| +const std::set<const BrowsingDataType*>& | 
| +BrowsingDataRemoverImpl::GetLastUsedRemovalMask() { | 
| return remove_mask_; | 
| } | 
|  | 
| @@ -584,7 +606,7 @@ int BrowsingDataRemoverImpl::GetLastUsedOriginTypeMask() { | 
| BrowsingDataRemoverImpl::RemovalTask::RemovalTask( | 
| const base::Time& delete_begin, | 
| const base::Time& delete_end, | 
| -    int remove_mask, | 
| +    const std::set<const BrowsingDataType*>& remove_mask, | 
| int origin_type_mask, | 
| std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | 
| Observer* observer) | 
|  |