| Index: chrome/browser/browsing_data/browsing_data_remover.cc
|
| diff --git a/chrome/browser/browsing_data/browsing_data_remover.cc b/chrome/browser/browsing_data/browsing_data_remover.cc
|
| index 97d22b77bc1641231d197ff228eb2f0161f504f7..783e5ad8f6f0556038bfb48d4afbc56619018f3e 100644
|
| --- a/chrome/browser/browsing_data/browsing_data_remover.cc
|
| +++ b/chrome/browser/browsing_data/browsing_data_remover.cc
|
| @@ -16,9 +16,9 @@
|
| #include "build/build_config.h"
|
| #include "chrome/browser/autofill/personal_data_manager_factory.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/browsing_data/browsing_data_filter_builder.h"
|
| #include "chrome/browser/browsing_data/browsing_data_helper.h"
|
| #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
|
| -#include "chrome/browser/browsing_data/origin_filter_builder.h"
|
| #include "chrome/browser/chrome_notification_types.h"
|
| #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
|
| #include "chrome/browser/domain_reliability/service_factory.h"
|
| @@ -45,6 +45,8 @@
|
| #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
|
| #include "components/browsing_data/storage_partition_http_cache_data_remover.h"
|
| #include "components/content_settings/core/browser/host_content_settings_map.h"
|
| +#include "components/content_settings/core/common/content_settings.h"
|
| +#include "components/content_settings/core/common/content_settings_pattern.h"
|
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h"
|
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
|
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
|
| @@ -157,12 +159,21 @@ base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) {
|
| }
|
|
|
| // Helper to create callback for BrowsingDataRemover::DoesOriginMatchMask.
|
| -bool DoesOriginMatchMask(
|
| +bool DoesOriginMatchMaskAndUrls(
|
| int origin_type_mask,
|
| + const base::Callback<bool(const GURL&)>& predicate,
|
| const GURL& origin,
|
| storage::SpecialStoragePolicy* special_storage_policy) {
|
| - return BrowsingDataHelper::DoesOriginMatchMask(
|
| - origin, origin_type_mask, special_storage_policy);
|
| + return predicate.Run(origin) &&
|
| + BrowsingDataHelper::DoesOriginMatchMask(origin, origin_type_mask,
|
| + special_storage_policy);
|
| +}
|
| +
|
| +bool ForwardPrimaryPatternCallback(
|
| + const base::Callback<bool(const ContentSettingsPattern&)> predicate,
|
| + const ContentSettingsPattern& primary_pattern,
|
| + const ContentSettingsPattern& secondary_pattern) {
|
| + return predicate.Run(primary_pattern);
|
| }
|
|
|
| void ClearHostnameResolutionCacheOnIOThread(IOThread* io_thread) {
|
| @@ -207,6 +218,19 @@ void ClearCookiesOnIOThread(base::Time delete_begin,
|
| IgnoreArgument<int>(callback));
|
| }
|
|
|
| +void ClearCookiesWithPredicateOnIOThread(
|
| + base::Time delete_begin,
|
| + base::Time delete_end,
|
| + net::CookieStore::CookiePredicate predicate,
|
| + net::URLRequestContextGetter* rq_context,
|
| + const base::Closure& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + net::CookieStore* cookie_store =
|
| + rq_context->GetURLRequestContext()->cookie_store();
|
| + cookie_store->DeleteAllCreatedBetweenWithPredicateAsync(
|
| + delete_begin, delete_end, predicate, IgnoreArgument<int>(callback));
|
| +}
|
| +
|
| void OnClearedChannelIDsOnIOThread(net::URLRequestContextGetter* rq_context,
|
| const base::Closure& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| @@ -331,13 +355,23 @@ void BrowsingDataRemover::SetRemoving(bool is_removing) {
|
| void BrowsingDataRemover::Remove(const TimeRange& time_range,
|
| int remove_mask,
|
| int origin_type_mask) {
|
| - RemoveImpl(time_range, remove_mask, GURL(), origin_type_mask);
|
| + BrowsingDataFilterBuilder builder(BrowsingDataFilterBuilder::BLACKLIST);
|
| + RemoveImpl(time_range, remove_mask, builder, origin_type_mask);
|
| }
|
|
|
| -void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| - int remove_mask,
|
| - const GURL& remove_url,
|
| - int origin_type_mask) {
|
| +void BrowsingDataRemover::RemoveWithFilter(
|
| + const TimeRange& time_range,
|
| + int remove_mask,
|
| + int origin_type_mask,
|
| + const BrowsingDataFilterBuilder& origin_filter) {
|
| + RemoveImpl(time_range, remove_mask, origin_filter, origin_type_mask);
|
| +}
|
| +
|
| +void BrowsingDataRemover::RemoveImpl(
|
| + const TimeRange& time_range,
|
| + int remove_mask,
|
| + const BrowsingDataFilterBuilder& filter_builder,
|
| + int origin_type_mask) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| // crbug.com/140910: Many places were calling this with base::Time() as
|
| @@ -350,18 +384,10 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| remove_mask_ = remove_mask;
|
| origin_type_mask_ = origin_type_mask;
|
|
|
| - // TODO(msramek): Replace |remove_origin| with |filter| in all backends.
|
| - const url::Origin remove_origin(remove_url);
|
| - OriginFilterBuilder builder(OriginFilterBuilder::BLACKLIST);
|
| - if (!remove_url.is_empty()) {
|
| - // Make sure that only URLs representing origins, with no extra components,
|
| - // are passed to this class.
|
| - DCHECK_EQ(remove_url, remove_url.GetOrigin());
|
| - builder.SetMode(OriginFilterBuilder::WHITELIST);
|
| - builder.AddOrigin(url::Origin(remove_origin));
|
| - }
|
| - base::Callback<bool(const GURL& url)> same_origin_filter =
|
| - builder.BuildSameOriginFilter();
|
| + base::Callback<bool(const GURL& url)> same_domain_filter =
|
| + filter_builder.BuildSameDomainFilter();
|
| + base::Callback<bool(const ContentSettingsPattern& url)> same_pattern_filter =
|
| + filter_builder.BuildWebsiteSettingsPatternMatchesFilter();
|
|
|
| PrefService* prefs = profile_->GetPrefs();
|
| bool may_delete_history = prefs->GetBoolean(
|
| @@ -397,20 +423,11 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| HistoryServiceFactory::GetForProfile(
|
| profile_, ServiceAccessType::EXPLICIT_ACCESS);
|
| if (history_service) {
|
| - // Selective history deletion is currently done through HistoryUI ->
|
| - // HistoryBackend -> HistoryService, and that is for individual URLs,
|
| - // not origins. The code below is currently unused, as the only callsite
|
| - // supplying |remove_url| is the unittest.
|
| - // TODO(msramek): Make it possible to delete history per origin, not just
|
| - // per URL, and use that functionality here.
|
| - std::set<GURL> restrict_urls;
|
| - if (!remove_url.is_empty())
|
| - restrict_urls.insert(remove_url);
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| content::RecordAction(UserMetricsAction("ClearBrowsingData_History"));
|
| waiting_for_clear_history_ = true;
|
| -
|
| history_service->ExpireLocalAndRemoteHistoryBetween(
|
| - WebHistoryServiceFactory::GetForProfile(profile_), restrict_urls,
|
| + WebHistoryServiceFactory::GetForProfile(profile_), std::set<GURL>(),
|
| delete_begin_, delete_end_,
|
| base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone,
|
| weak_ptr_factory_.GetWeakPtr()),
|
| @@ -420,7 +437,8 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| // The extension activity contains details of which websites extensions
|
| // were active on. It therefore indirectly stores details of websites a
|
| // user has visited so best clean from here as well.
|
| - extensions::ActivityLog::GetInstance(profile_)->RemoveURLs(restrict_urls);
|
| + extensions::ActivityLog::GetInstance(profile_)->RemoveURLs(
|
| + std::set<GURL>());
|
| #endif
|
| }
|
|
|
| @@ -433,6 +451,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
|
|
| // The power consumption history by origin contains details of websites
|
| // that were visited.
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| power::OriginPowerMap* origin_power_map =
|
| power::OriginPowerMapFactory::GetForBrowserContext(profile_);
|
| if (origin_power_map)
|
| @@ -442,6 +461,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| // reveals some history: we have no mechanism to track when these items were
|
| // created, so we'll clear them all. Better safe than sorry.
|
| if (g_browser_process->io_thread()) {
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| waiting_for_clear_hostname_resolution_cache_ = true;
|
| BrowserThread::PostTaskAndReply(
|
| BrowserThread::IO, FROM_HERE,
|
| @@ -451,6 +471,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| }
|
| if (profile_->GetNetworkPredictor()) {
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| waiting_for_clear_network_predictor_ = true;
|
| BrowserThread::PostTaskAndReply(
|
| BrowserThread::IO, FROM_HERE,
|
| @@ -463,6 +484,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| // As part of history deletion we also delete the auto-generated keywords.
|
| TemplateURLService* keywords_model =
|
| TemplateURLServiceFactory::GetForProfile(profile_);
|
| +
|
| if (keywords_model && !keywords_model->loaded()) {
|
| template_url_sub_ = keywords_model->RegisterOnLoadedCallback(
|
| base::Bind(&BrowsingDataRemover::OnKeywordsLoaded,
|
| @@ -470,8 +492,9 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| keywords_model->Load();
|
| waiting_for_clear_keyword_data_ = true;
|
| } else if (keywords_model) {
|
| - keywords_model->RemoveAutoGeneratedForOriginBetween(
|
| - remove_url, delete_begin_, delete_end_);
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| + keywords_model->RemoveAutoGeneratedForOriginBetween(GURL(), delete_begin_,
|
| + delete_end_);
|
| }
|
|
|
| // The PrerenderManager keeps history of prerendered pages, so clear that.
|
| @@ -481,6 +504,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| prerender::PrerenderManager* prerender_manager =
|
| prerender::PrerenderManagerFactory::GetForProfile(profile_);
|
| if (prerender_manager) {
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| prerender_manager->ClearData(
|
| prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS |
|
| prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY);
|
| @@ -488,7 +512,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
|
|
| // If the caller is removing history for all hosts, then clear ancillary
|
| // historical information.
|
| - if (remove_url.is_empty()) {
|
| + if (filter_builder.IsEmptyBlacklist()) {
|
| // We also delete the list of recently closed tabs. Since these expire,
|
| // they can't be more than a day old, so we can simply clear them all.
|
| sessions::TabRestoreService* tab_service =
|
| @@ -510,6 +534,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| // The saved Autofill profiles and credit cards can include the origin from
|
| // which these profiles and credit cards were learned. These are a form of
|
| // history, so clear them as well.
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| scoped_refptr<autofill::AutofillWebDataService> web_data_service =
|
| WebDataServiceFactory::GetAutofillWebDataForProfile(
|
| profile_, ServiceAccessType::EXPLICIT_ACCESS);
|
| @@ -591,8 +616,8 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads"));
|
| content::DownloadManager* download_manager =
|
| BrowserContext::GetDownloadManager(profile_);
|
| - download_manager->RemoveDownloadsByURLAndTime(
|
| - same_origin_filter, delete_begin_, delete_end_);
|
| + download_manager->RemoveDownloadsByURLAndTime(same_domain_filter,
|
| + delete_begin_, delete_end_);
|
| DownloadPrefs* download_prefs = DownloadPrefs::FromDownloadManager(
|
| download_manager);
|
| download_prefs->SetSaveFilePath(download_prefs->DownloadPath());
|
| @@ -623,13 +648,24 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| scoped_refptr<net::URLRequestContextGetter> sb_context =
|
| sb_service->url_request_context();
|
| ++waiting_for_clear_cookies_count_;
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&ClearCookiesOnIOThread, delete_begin_, delete_end_,
|
| - base::RetainedRef(std::move(sb_context)),
|
| - UIThreadTrampoline(
|
| - base::Bind(&BrowsingDataRemover::OnClearedCookies,
|
| - weak_ptr_factory_.GetWeakPtr()))));
|
| + if (filter_builder.IsEmptyBlacklist()) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&ClearCookiesOnIOThread, delete_begin_, delete_end_,
|
| + base::RetainedRef(std::move(sb_context)),
|
| + UIThreadTrampoline(
|
| + base::Bind(&BrowsingDataRemover::OnClearedCookies,
|
| + weak_ptr_factory_.GetWeakPtr()))));
|
| + } else {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&ClearCookiesWithPredicateOnIOThread, delete_begin_,
|
| + delete_end_, filter_builder.BuildDomainCookieFilter(),
|
| + base::RetainedRef(std::move(sb_context)),
|
| + UIThreadTrampoline(
|
| + base::Bind(&BrowsingDataRemover::OnClearedCookies,
|
| + weak_ptr_factory_.GetWeakPtr()))));
|
| + }
|
| }
|
| }
|
|
|
| @@ -707,13 +743,17 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| #endif
|
|
|
| if (remove_mask & REMOVE_SITE_USAGE_DATA) {
|
| - HostContentSettingsMapFactory::GetForProfile(profile_)
|
| - ->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT);
|
| + ClearSettingsForOneTypeWithPredicate(
|
| + HostContentSettingsMapFactory::GetForProfile(profile_),
|
| + CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT,
|
| + base::Bind(&ForwardPrimaryPatternCallback, same_pattern_filter));
|
| }
|
|
|
| if (remove_mask & REMOVE_SITE_USAGE_DATA || remove_mask & REMOVE_HISTORY) {
|
| - HostContentSettingsMapFactory::GetForProfile(profile_)
|
| - ->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_APP_BANNER);
|
| + ClearSettingsForOneTypeWithPredicate(
|
| + HostContentSettingsMapFactory::GetForProfile(profile_),
|
| + CONTENT_SETTINGS_TYPE_APP_BANNER,
|
| + base::Bind(&ForwardPrimaryPatternCallback, same_pattern_filter));
|
| }
|
|
|
| if (remove_mask & REMOVE_PASSWORDS) {
|
| @@ -728,7 +768,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| base::Bind(&BrowsingDataRemover::OnClearedPasswords,
|
| weak_ptr_factory_.GetWeakPtr());
|
| password_store->RemoveLoginsByURLAndTime(
|
| - same_origin_filter, delete_begin_, delete_end_, on_cleared_passwords);
|
| + same_domain_filter, delete_begin_, delete_end_, on_cleared_passwords);
|
| }
|
| }
|
|
|
| @@ -761,6 +801,7 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| }
|
| }
|
|
|
| + // TODO(dmurph): Support all backends with filter (crbug.com/113621).
|
| if (remove_mask & REMOVE_FORM_DATA) {
|
| content::RecordAction(UserMetricsAction("ClearBrowsingData_Autofill"));
|
| scoped_refptr<autofill::AutofillWebDataService> web_data_service =
|
| @@ -864,10 +905,15 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
|
| }
|
|
|
| + content::StoragePartition::CookieMatcherFunction cookie_matcher;
|
| + if (!filter_builder.IsEmptyBlacklist()) {
|
| + cookie_matcher = filter_builder.BuildDomainCookieFilter();
|
| + }
|
| storage_partition->ClearData(
|
| - storage_partition_remove_mask, quota_storage_remove_mask, remove_url,
|
| - base::Bind(&DoesOriginMatchMask, origin_type_mask_), delete_begin_,
|
| - delete_end_,
|
| + storage_partition_remove_mask, quota_storage_remove_mask,
|
| + base::Bind(&DoesOriginMatchMaskAndUrls, origin_type_mask_,
|
| + same_domain_filter),
|
| + cookie_matcher, delete_begin_, delete_end_,
|
| base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| }
|
| @@ -950,8 +996,10 @@ void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
|
| offline_pages::IsOfflinePagesEnabled()) {
|
| waiting_for_clear_offline_page_data_ = true;
|
| offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile_)
|
| - ->ClearAll(base::Bind(&BrowsingDataRemover::OnClearedOfflinePageData,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| + ->DeletePagesByURLPredicate(
|
| + same_domain_filter,
|
| + base::Bind(&BrowsingDataRemover::OnClearedOfflinePageData,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
| #endif
|
|
|
| @@ -990,6 +1038,24 @@ void BrowsingDataRemover::OverrideWebappRegistryForTesting(
|
| }
|
| #endif
|
|
|
| +void BrowsingDataRemover::ClearSettingsForOneTypeWithPredicate(
|
| + HostContentSettingsMap* content_settings_map,
|
| + ContentSettingsType content_type,
|
| + const base::Callback<bool(const ContentSettingsPattern& primary_pattern,
|
| + const ContentSettingsPattern& secondary_pattern)>&
|
| + predicate) {
|
| + ContentSettingsForOneType settings;
|
| + content_settings_map->GetSettingsForOneType(content_type, std::string(),
|
| + &settings);
|
| + for (const ContentSettingPatternSource& setting : settings) {
|
| + if (predicate.Run(setting.primary_pattern, setting.secondary_pattern)) {
|
| + content_settings_map->SetWebsiteSettingCustomScope(
|
| + setting.primary_pattern, setting.secondary_pattern, content_type,
|
| + std::string(), nullptr);
|
| + }
|
| + }
|
| +}
|
| +
|
| base::Time BrowsingDataRemover::CalculateBeginDeleteTime(
|
| TimePeriod time_period) {
|
| base::TimeDelta diff;
|
|
|