| 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 b157897e73a9e8c3a7e57764097d673c1f18a5c0..28bbd4af54fac29bb5d67306484e32fab2871dc0 100644
|
| --- a/chrome/browser/browsing_data/browsing_data_remover_impl.cc
|
| +++ b/chrome/browser/browsing_data/browsing_data_remover_impl.cc
|
| @@ -60,25 +60,6 @@ base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) {
|
| return base::Bind(&IgnoreArgumentHelper<T>, callback);
|
| }
|
|
|
| -bool DoesOriginMatchMaskAndUrls(
|
| - const base::WeakPtr<BrowsingDataRemoverImpl>& remover_weak_ptr,
|
| - int origin_type_mask,
|
| - const base::Callback<bool(const GURL&)>& predicate,
|
| - const GURL& origin,
|
| - storage::SpecialStoragePolicy* special_storage_policy) {
|
| - // If BrowsingDataRemoverImpl is null, it is not possible to determine which
|
| - // origins should have their data deleted, and so we do not delete
|
| - // anything. This is not a problem, because this can only happen shortly
|
| - // before shutdown and thus the deletion would likely not be able to
|
| - // finish anyway.
|
| - if (!remover_weak_ptr)
|
| - return false;
|
| -
|
| - return predicate.Run(origin) &&
|
| - remover_weak_ptr->DoesOriginMatchMask(origin_type_mask, origin,
|
| - special_storage_policy);
|
| -}
|
| -
|
| void ClearHttpAuthCacheOnIOThread(
|
| scoped_refptr<net::URLRequestContextGetter> context_getter,
|
| base::Time delete_begin) {
|
| @@ -154,6 +135,47 @@ void BrowsingDataRemoverImpl::SubTask::CompletionCallback() {
|
| forward_callback_.Run();
|
| }
|
|
|
| +BrowsingDataRemoverImpl::OriginMaskAndURLMatcher::OriginMaskAndURLMatcher() {}
|
| +BrowsingDataRemoverImpl::OriginMaskAndURLMatcher::~OriginMaskAndURLMatcher() {}
|
| +
|
| +bool BrowsingDataRemoverImpl::OriginMaskAndURLMatcher::
|
| + DoesOriginMatchMaskAndURLs(
|
| + int origin_type_mask,
|
| + const base::Callback<bool(const GURL&)>& predicate,
|
| + const GURL& origin,
|
| + storage::SpecialStoragePolicy* policy) const {
|
| + if (!predicate.is_null() && !predicate.Run(origin))
|
| + return false;
|
| +
|
| + const std::vector<std::string>& schemes = url::GetWebStorageSchemes();
|
| + bool is_web_scheme =
|
| + (std::find(schemes.begin(), schemes.end(), origin.GetOrigin().scheme()) !=
|
| + schemes.end());
|
| +
|
| + // If a websafe origin is unprotected, it matches iff UNPROTECTED_WEB.
|
| + if ((!policy || !policy->IsStorageProtected(origin.GetOrigin())) &&
|
| + is_web_scheme && (origin_type_mask & ORIGIN_TYPE_UNPROTECTED_WEB)) {
|
| + return true;
|
| + }
|
| + origin_type_mask &= ~ORIGIN_TYPE_UNPROTECTED_WEB;
|
| +
|
| + // Hosted applications (protected and websafe origins) iff PROTECTED_WEB.
|
| + if (policy && policy->IsStorageProtected(origin.GetOrigin()) &&
|
| + is_web_scheme && (origin_type_mask & ORIGIN_TYPE_PROTECTED_WEB)) {
|
| + return true;
|
| + }
|
| + origin_type_mask &= ~ORIGIN_TYPE_PROTECTED_WEB;
|
| +
|
| + DCHECK(embedder_matcher_ || !origin_type_mask)
|
| + << "The mask contains embedder-defined origin types, but there is no "
|
| + << "embedder delegate matcher to process them.";
|
| +
|
| + if (embedder_matcher_)
|
| + return embedder_matcher_.Run(origin_type_mask, origin, policy);
|
| +
|
| + return false;
|
| +}
|
| +
|
| BrowsingDataRemoverImpl::BrowsingDataRemoverImpl(
|
| content::BrowserContext* browser_context)
|
| : browser_context_(browser_context),
|
| @@ -169,6 +191,7 @@ BrowsingDataRemoverImpl::BrowsingDataRemoverImpl(
|
| clear_channel_ids_(sub_task_forward_callback_),
|
| clear_http_auth_cache_(sub_task_forward_callback_),
|
| clear_storage_partition_data_(sub_task_forward_callback_),
|
| + origin_mask_and_url_matcher_(new OriginMaskAndURLMatcher()),
|
| weak_ptr_factory_(this) {
|
| DCHECK(browser_context_);
|
| }
|
| @@ -202,6 +225,11 @@ void BrowsingDataRemoverImpl::SetRemoving(bool is_removing) {
|
| void BrowsingDataRemoverImpl::SetEmbedderDelegate(
|
| std::unique_ptr<BrowsingDataRemoverDelegate> embedder_delegate) {
|
| embedder_delegate_ = std::move(embedder_delegate);
|
| +
|
| + if (embedder_delegate_) {
|
| + origin_mask_and_url_matcher_->set_embedder_matcher(
|
| + embedder_delegate_->GetMaskMatcherFunction());
|
| + }
|
| }
|
|
|
| BrowsingDataRemoverDelegate*
|
| @@ -213,35 +241,8 @@ bool BrowsingDataRemoverImpl::DoesOriginMatchMask(
|
| int origin_type_mask,
|
| const GURL& origin,
|
| storage::SpecialStoragePolicy* policy) const {
|
| - const std::vector<std::string>& schemes = url::GetWebStorageSchemes();
|
| - bool is_web_scheme =
|
| - (std::find(schemes.begin(), schemes.end(), origin.GetOrigin().scheme()) !=
|
| - schemes.end());
|
| -
|
| - // If a websafe origin is unprotected, it matches iff UNPROTECTED_WEB.
|
| - if ((!policy || !policy->IsStorageProtected(origin.GetOrigin())) &&
|
| - is_web_scheme && (origin_type_mask & ORIGIN_TYPE_UNPROTECTED_WEB)) {
|
| - return true;
|
| - }
|
| - origin_type_mask &= ~ORIGIN_TYPE_UNPROTECTED_WEB;
|
| -
|
| - // Hosted applications (protected and websafe origins) iff PROTECTED_WEB.
|
| - if (policy && policy->IsStorageProtected(origin.GetOrigin()) &&
|
| - is_web_scheme && (origin_type_mask & ORIGIN_TYPE_PROTECTED_WEB)) {
|
| - return true;
|
| - }
|
| - origin_type_mask &= ~ORIGIN_TYPE_PROTECTED_WEB;
|
| -
|
| - DCHECK(embedder_delegate_ || !origin_type_mask)
|
| - << "The mask contains embedder-defined origin types, but there is no "
|
| - << "embedder delegate to process them.";
|
| -
|
| - if (embedder_delegate_) {
|
| - return embedder_delegate_->DoesOriginMatchEmbedderMask(origin_type_mask,
|
| - origin, policy);
|
| - }
|
| -
|
| - return false;
|
| + return origin_mask_and_url_matcher_->DoesOriginMatchMaskAndURLs(
|
| + origin_type_mask, base::Callback<bool(const GURL&)>(), origin, policy);
|
| }
|
|
|
| void BrowsingDataRemoverImpl::Remove(const base::Time& delete_begin,
|
| @@ -503,8 +504,8 @@ void BrowsingDataRemoverImpl::RemoveImpl(
|
|
|
| storage_partition->ClearData(
|
| storage_partition_remove_mask, quota_storage_remove_mask,
|
| - base::Bind(&DoesOriginMatchMaskAndUrls, weak_ptr_factory_.GetWeakPtr(),
|
| - origin_type_mask_, filter),
|
| + base::Bind(&OriginMaskAndURLMatcher::DoesOriginMatchMaskAndURLs,
|
| + origin_mask_and_url_matcher_, origin_type_mask_, filter),
|
| cookie_matcher, delete_begin_, delete_end_,
|
| clear_storage_partition_data_.GetCompletionCallback());
|
| }
|
|
|