| Index: chrome/browser/android/preferences/pref_service_bridge.cc
 | 
| diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
 | 
| index 42c432441ab3beb9094ee8c8d2c8e67e660e1724..9c1f13310f32450c440574cb49e32ca595e427a5 100644
 | 
| --- a/chrome/browser/android/preferences/pref_service_bridge.cc
 | 
| +++ b/chrome/browser/android/preferences/pref_service_bridge.cc
 | 
| @@ -7,6 +7,7 @@
 | 
|  #include <jni.h>
 | 
|  #include <stddef.h>
 | 
|  
 | 
| +#include <algorithm>
 | 
|  #include <memory>
 | 
|  #include <set>
 | 
|  #include <string>
 | 
| @@ -29,6 +30,7 @@
 | 
|  #include "chrome/browser/browsing_data/browsing_data_helper.h"
 | 
|  #include "chrome/browser/browsing_data/browsing_data_remover.h"
 | 
|  #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
 | 
| +#include "chrome/browser/browsing_data/chrome_browsing_data_types.h"
 | 
|  #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 | 
|  #include "chrome/browser/engagement/important_sites_util.h"
 | 
|  #include "chrome/browser/history/web_history_service_factory.h"
 | 
| @@ -619,24 +621,25 @@ static void ClearBrowsingData(
 | 
|    std::vector<int> data_types_vector;
 | 
|    base::android::JavaIntArrayToIntVector(env, data_types, &data_types_vector);
 | 
|  
 | 
| -  int remove_mask = 0;
 | 
| +  std::set<const content::BrowsingDataType*> remove_mask;
 | 
|    for (const int data_type : data_types_vector) {
 | 
|      switch (static_cast<browsing_data::BrowsingDataType>(data_type)) {
 | 
|        case browsing_data::HISTORY:
 | 
| -        remove_mask |= BrowsingDataRemover::REMOVE_HISTORY;
 | 
| +        remove_mask.insert(&kBrowsingDataTypeHistory);
 | 
|          break;
 | 
|        case browsing_data::CACHE:
 | 
| -        remove_mask |= BrowsingDataRemover::REMOVE_CACHE;
 | 
| +        remove_mask.insert(&kBrowsingDataTypeCache);
 | 
|          break;
 | 
|        case browsing_data::COOKIES:
 | 
| -        remove_mask |= BrowsingDataRemover::REMOVE_COOKIES;
 | 
| -        remove_mask |= BrowsingDataRemover::REMOVE_SITE_DATA;
 | 
| +        remove_mask.insert(&kBrowsingDataTypeCookies);
 | 
| +        remove_mask.insert(BrowsingDataTypeSetSiteData().begin(),
 | 
| +                           BrowsingDataTypeSetSiteData().end());
 | 
|          break;
 | 
|        case browsing_data::PASSWORDS:
 | 
| -        remove_mask |= BrowsingDataRemover::REMOVE_PASSWORDS;
 | 
| +        remove_mask.insert(&kBrowsingDataTypePasswords);
 | 
|          break;
 | 
|        case browsing_data::FORM_DATA:
 | 
| -        remove_mask |= BrowsingDataRemover::REMOVE_FORM_DATA;
 | 
| +        remove_mask.insert(&kBrowsingDataTypeFormData);
 | 
|          break;
 | 
|        case browsing_data::BOOKMARKS:
 | 
|          // Bookmarks are deleted separately on the Java side.
 | 
| @@ -673,10 +676,18 @@ static void ClearBrowsingData(
 | 
|  
 | 
|    // Delete the types protected by Important Sites with a filter,
 | 
|    // and the rest completely.
 | 
| -  int filterable_mask =
 | 
| -      remove_mask & BrowsingDataRemover::IMPORTANT_SITES_DATATYPES;
 | 
| -  int nonfilterable_mask = remove_mask &
 | 
| -      ~BrowsingDataRemover::IMPORTANT_SITES_DATATYPES;
 | 
| +  std::set<const content::BrowsingDataType*> filterable_mask;
 | 
| +  std::set_intersection(
 | 
| +      remove_mask.begin(), remove_mask.end(),
 | 
| +      BrowsingDataTypeSetImportantSites().begin(),
 | 
| +      BrowsingDataTypeSetImportantSites().end(),
 | 
| +      std::inserter(filterable_mask, filterable_mask.begin()));
 | 
| +
 | 
| +  std::set<const content::BrowsingDataType*> nonfilterable_mask;
 | 
| +  std::set_difference(
 | 
| +      remove_mask.begin(), remove_mask.end(), filterable_mask.begin(),
 | 
| +      filterable_mask.end(),
 | 
| +      std::inserter(nonfilterable_mask, nonfilterable_mask.begin()));
 | 
|  
 | 
|    // ClearBrowsingDataObserver deletes itself when |browsing_data_remover| is
 | 
|    // done with both removal tasks.
 | 
| @@ -687,7 +698,7 @@ static void ClearBrowsingData(
 | 
|        static_cast<browsing_data::TimePeriod>(time_period);
 | 
|    browsing_data::RecordDeletionForPeriod(period);
 | 
|  
 | 
| -  if (filterable_mask) {
 | 
| +  if (!filterable_mask.empty()) {
 | 
|      browsing_data_remover->RemoveWithFilterAndReply(
 | 
|          browsing_data::CalculateBeginDeleteTime(period),
 | 
|          browsing_data::CalculateEndDeleteTime(period),
 | 
| @@ -698,7 +709,7 @@ static void ClearBrowsingData(
 | 
|      observer->OnBrowsingDataRemoverDone();
 | 
|    }
 | 
|  
 | 
| -  if (nonfilterable_mask) {
 | 
| +  if (!nonfilterable_mask.empty()) {
 | 
|      browsing_data_remover->RemoveAndReply(
 | 
|          browsing_data::CalculateBeginDeleteTime(period),
 | 
|          browsing_data::CalculateEndDeleteTime(period),
 | 
| 
 |