OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/browsing_data/browsing_data_remover_impl.h" | 5 #include "chrome/browser/browsing_data/browsing_data_remover_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
46 using content::BrowsingDataFilterBuilder; | 46 using content::BrowsingDataFilterBuilder; |
47 using content::DOMStorageContext; | 47 using content::DOMStorageContext; |
48 | 48 |
49 namespace { | 49 namespace { |
50 | 50 |
51 template <typename T> | 51 template <typename T> |
52 void IgnoreArgumentHelper(const base::Closure& callback, T unused_argument) { | 52 void IgnoreArgumentHelper(const base::Closure& callback, T unused_argument) { |
53 callback.Run(); | 53 callback.Run(); |
54 } | 54 } |
55 | 55 |
56 // Returns whether |origin| matches |origin_type_mask| given the special | |
57 // storage |policy|; and if |predicate| is not null, then also whether | |
58 // it matches |predicate|. If |origin_type_mask| contains embedder-specific | |
59 // datatypes, |embedder_matcher| must not be null; the decision for those | |
60 // datatypes will be delegated to it. | |
61 bool DoesOriginMatchMaskAndURLs( | |
62 int origin_type_mask, | |
63 const base::Callback<bool(const GURL&)>& predicate, | |
64 const BrowsingDataRemoverDelegate::EmbedderOriginTypeMatcher& | |
65 embedder_matcher, | |
66 const GURL& origin, | |
67 storage::SpecialStoragePolicy* policy) { | |
68 if (!predicate.is_null() && !predicate.Run(origin)) | |
69 return false; | |
70 | |
71 const std::vector<std::string>& schemes = url::GetWebStorageSchemes(); | |
72 bool is_web_scheme = | |
73 (std::find(schemes.begin(), schemes.end(), origin.GetOrigin().scheme()) != | |
74 schemes.end()); | |
75 | |
76 // If a websafe origin is unprotected, it matches iff UNPROTECTED_WEB. | |
77 if ((!policy || !policy->IsStorageProtected(origin.GetOrigin())) && | |
78 is_web_scheme && | |
79 (origin_type_mask & BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB)) { | |
80 return true; | |
81 } | |
82 origin_type_mask &= ~BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB; | |
83 | |
84 // Hosted applications (protected and websafe origins) iff PROTECTED_WEB. | |
85 if (policy && policy->IsStorageProtected(origin.GetOrigin()) && | |
86 is_web_scheme && | |
87 (origin_type_mask & BrowsingDataRemover::ORIGIN_TYPE_PROTECTED_WEB)) { | |
88 return true; | |
89 } | |
90 origin_type_mask &= ~BrowsingDataRemover::ORIGIN_TYPE_PROTECTED_WEB; | |
91 | |
92 DCHECK(embedder_matcher || !origin_type_mask) | |
93 << "The mask contains embedder-defined origin types, but there is no " | |
94 << "embedder delegate matcher to process them."; | |
95 | |
96 if (!embedder_matcher.is_null()) | |
97 return embedder_matcher.Run(origin_type_mask, origin, policy); | |
98 | |
99 return false; | |
100 } | |
101 | |
56 // Another convenience method to turn a callback without arguments into one that | 102 // Another convenience method to turn a callback without arguments into one that |
57 // accepts (and ignores) a single argument. | 103 // accepts (and ignores) a single argument. |
58 template <typename T> | 104 template <typename T> |
59 base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) { | 105 base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) { |
60 return base::Bind(&IgnoreArgumentHelper<T>, callback); | 106 return base::Bind(&IgnoreArgumentHelper<T>, callback); |
61 } | 107 } |
62 | 108 |
63 bool DoesOriginMatchMaskAndUrls( | |
64 const base::WeakPtr<BrowsingDataRemoverImpl>& remover_weak_ptr, | |
65 int origin_type_mask, | |
66 const base::Callback<bool(const GURL&)>& predicate, | |
67 const GURL& origin, | |
68 storage::SpecialStoragePolicy* special_storage_policy) { | |
69 // If BrowsingDataRemoverImpl is null, it is not possible to determine which | |
70 // origins should have their data deleted, and so we do not delete | |
71 // anything. This is not a problem, because this can only happen shortly | |
72 // before shutdown and thus the deletion would likely not be able to | |
73 // finish anyway. | |
74 if (!remover_weak_ptr) | |
75 return false; | |
76 | |
77 return predicate.Run(origin) && | |
78 remover_weak_ptr->DoesOriginMatchMask(origin_type_mask, origin, | |
79 special_storage_policy); | |
80 } | |
81 | |
82 void ClearHttpAuthCacheOnIOThread( | 109 void ClearHttpAuthCacheOnIOThread( |
83 scoped_refptr<net::URLRequestContextGetter> context_getter, | 110 scoped_refptr<net::URLRequestContextGetter> context_getter, |
84 base::Time delete_begin) { | 111 base::Time delete_begin) { |
85 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 112 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
86 | 113 |
87 net::HttpNetworkSession* http_session = context_getter->GetURLRequestContext() | 114 net::HttpNetworkSession* http_session = context_getter->GetURLRequestContext() |
88 ->http_transaction_factory() | 115 ->http_transaction_factory() |
89 ->GetSession(); | 116 ->GetSession(); |
90 DCHECK(http_session); | 117 DCHECK(http_session); |
91 http_session->http_auth_cache()->ClearEntriesAddedWithin(base::Time::Now() - | 118 http_session->http_auth_cache()->ClearEntriesAddedWithin(base::Time::Now() - |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
206 | 233 |
207 BrowsingDataRemoverDelegate* | 234 BrowsingDataRemoverDelegate* |
208 BrowsingDataRemoverImpl::GetEmbedderDelegate() const { | 235 BrowsingDataRemoverImpl::GetEmbedderDelegate() const { |
209 return embedder_delegate_.get(); | 236 return embedder_delegate_.get(); |
210 } | 237 } |
211 | 238 |
212 bool BrowsingDataRemoverImpl::DoesOriginMatchMask( | 239 bool BrowsingDataRemoverImpl::DoesOriginMatchMask( |
213 int origin_type_mask, | 240 int origin_type_mask, |
214 const GURL& origin, | 241 const GURL& origin, |
215 storage::SpecialStoragePolicy* policy) const { | 242 storage::SpecialStoragePolicy* policy) const { |
216 const std::vector<std::string>& schemes = url::GetWebStorageSchemes(); | 243 BrowsingDataRemoverDelegate::EmbedderOriginTypeMatcher embedder_matcher; |
217 bool is_web_scheme = | 244 if (embedder_delegate_) |
218 (std::find(schemes.begin(), schemes.end(), origin.GetOrigin().scheme()) != | 245 embedder_matcher = embedder_delegate_->GetOriginTypeMatcher(); |
219 schemes.end()); | |
220 | 246 |
221 // If a websafe origin is unprotected, it matches iff UNPROTECTED_WEB. | 247 return DoesOriginMatchMaskAndURLs(origin_type_mask, |
222 if ((!policy || !policy->IsStorageProtected(origin.GetOrigin())) && | 248 base::Callback<bool(const GURL&)>(), |
223 is_web_scheme && (origin_type_mask & ORIGIN_TYPE_UNPROTECTED_WEB)) { | 249 embedder_matcher, origin, policy); |
224 return true; | |
225 } | |
226 origin_type_mask &= ~ORIGIN_TYPE_UNPROTECTED_WEB; | |
227 | |
228 // Hosted applications (protected and websafe origins) iff PROTECTED_WEB. | |
229 if (policy && policy->IsStorageProtected(origin.GetOrigin()) && | |
230 is_web_scheme && (origin_type_mask & ORIGIN_TYPE_PROTECTED_WEB)) { | |
231 return true; | |
232 } | |
233 origin_type_mask &= ~ORIGIN_TYPE_PROTECTED_WEB; | |
234 | |
235 DCHECK(embedder_delegate_ || !origin_type_mask) | |
236 << "The mask contains embedder-defined origin types, but there is no " | |
237 << "embedder delegate to process them."; | |
238 | |
239 if (embedder_delegate_) { | |
240 return embedder_delegate_->DoesOriginMatchEmbedderMask(origin_type_mask, | |
241 origin, policy); | |
242 } | |
243 | |
244 return false; | |
245 } | 250 } |
246 | 251 |
247 void BrowsingDataRemoverImpl::Remove(const base::Time& delete_begin, | 252 void BrowsingDataRemoverImpl::Remove(const base::Time& delete_begin, |
248 const base::Time& delete_end, | 253 const base::Time& delete_end, |
249 int remove_mask, | 254 int remove_mask, |
250 int origin_type_mask) { | 255 int origin_type_mask) { |
251 RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, | 256 RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, |
252 std::unique_ptr<BrowsingDataFilterBuilder>(), nullptr); | 257 std::unique_ptr<BrowsingDataFilterBuilder>(), nullptr); |
253 } | 258 } |
254 | 259 |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
494 | 499 |
495 // If cookies are supposed to be conditionally deleted from the storage | 500 // If cookies are supposed to be conditionally deleted from the storage |
496 // partition, create a cookie matcher function. | 501 // partition, create a cookie matcher function. |
497 content::StoragePartition::CookieMatcherFunction cookie_matcher; | 502 content::StoragePartition::CookieMatcherFunction cookie_matcher; |
498 if (!filter_builder.IsEmptyBlacklist() && | 503 if (!filter_builder.IsEmptyBlacklist() && |
499 (storage_partition_remove_mask & | 504 (storage_partition_remove_mask & |
500 content::StoragePartition::REMOVE_DATA_MASK_COOKIES)) { | 505 content::StoragePartition::REMOVE_DATA_MASK_COOKIES)) { |
501 cookie_matcher = filter_builder.BuildCookieFilter(); | 506 cookie_matcher = filter_builder.BuildCookieFilter(); |
502 } | 507 } |
503 | 508 |
509 BrowsingDataRemoverDelegate::EmbedderOriginTypeMatcher embedder_matcher; | |
510 if (embedder_delegate_) | |
511 embedder_matcher = embedder_delegate_->GetOriginTypeMatcher(); | |
512 | |
504 storage_partition->ClearData( | 513 storage_partition->ClearData( |
505 storage_partition_remove_mask, quota_storage_remove_mask, | 514 storage_partition_remove_mask, quota_storage_remove_mask, |
506 base::Bind(&DoesOriginMatchMaskAndUrls, weak_ptr_factory_.GetWeakPtr(), | 515 base::Bind(&DoesOriginMatchMaskAndURLs, origin_type_mask_, filter, |
507 origin_type_mask_, filter), | 516 embedder_matcher), |
508 cookie_matcher, delete_begin_, delete_end_, | 517 cookie_matcher, delete_begin_, delete_end_, |
509 clear_storage_partition_data_.GetCompletionCallback()); | 518 clear_storage_partition_data_.GetCompletionCallback()); |
510 } | 519 } |
511 | 520 |
512 ////////////////////////////////////////////////////////////////////////////// | 521 ////////////////////////////////////////////////////////////////////////////// |
513 // CACHE | 522 // CACHE |
514 if (remove_mask & DATA_TYPE_CACHE) { | 523 if (remove_mask & DATA_TYPE_CACHE) { |
515 base::RecordAction(UserMetricsAction("ClearBrowsingData_Cache")); | 524 base::RecordAction(UserMetricsAction("ClearBrowsingData_Cache")); |
516 | 525 |
517 // TODO(msramek): Clear the cache of all renderers. | 526 // TODO(msramek): Clear the cache of all renderers. |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
640 // All removal tasks have finished. Inform the observers that we're idle. | 649 // All removal tasks have finished. Inform the observers that we're idle. |
641 SetRemoving(false); | 650 SetRemoving(false); |
642 return; | 651 return; |
643 } | 652 } |
644 | 653 |
645 // Yield to the UI thread before executing the next removal task. | 654 // Yield to the UI thread before executing the next removal task. |
646 // TODO(msramek): Consider also adding a backoff if too many tasks | 655 // TODO(msramek): Consider also adding a backoff if too many tasks |
647 // are scheduled. | 656 // are scheduled. |
648 BrowserThread::PostTask( | 657 BrowserThread::PostTask( |
649 BrowserThread::UI, FROM_HERE, | 658 BrowserThread::UI, FROM_HERE, |
650 base::Bind(&BrowsingDataRemoverImpl::RunNextTask, | 659 base::Bind(&BrowsingDataRemoverImpl::RunNextTask, GetWeakPtr())); |
651 weak_ptr_factory_.GetWeakPtr())); | |
652 } | 660 } |
653 | 661 |
654 void BrowsingDataRemoverImpl::NotifyIfDone() { | 662 void BrowsingDataRemoverImpl::NotifyIfDone() { |
655 // TODO(brettw) http://crbug.com/305259: This should also observe session | 663 // TODO(brettw) http://crbug.com/305259: This should also observe session |
656 // clearing (what about other things such as passwords, etc.?) and wait for | 664 // clearing (what about other things such as passwords, etc.?) and wait for |
657 // them to complete before continuing. | 665 // them to complete before continuing. |
658 | 666 |
659 if (!AllDone()) | 667 if (!AllDone()) |
660 return; | 668 return; |
661 | 669 |
662 if (completion_inhibitor_) { | 670 if (completion_inhibitor_) { |
663 completion_inhibitor_->OnBrowsingDataRemoverWouldComplete( | 671 completion_inhibitor_->OnBrowsingDataRemoverWouldComplete( |
664 this, base::Bind(&BrowsingDataRemoverImpl::Notify, | 672 this, base::Bind(&BrowsingDataRemoverImpl::Notify, GetWeakPtr())); |
665 weak_ptr_factory_.GetWeakPtr())); | |
666 return; | 673 return; |
667 } | 674 } |
668 | 675 |
669 Notify(); | 676 Notify(); |
670 } | 677 } |
678 | |
679 base::WeakPtr<BrowsingDataRemoverImpl> BrowsingDataRemoverImpl::GetWeakPtr() { | |
680 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
681 base::WeakPtr<BrowsingDataRemoverImpl> weak_ptr = | |
682 weak_ptr_factory_.GetWeakPtr(); | |
683 | |
684 // Immediately bind the weak pointer to the UI thread. This makes it easier | |
685 // to discover potential misuse on the IO thread. | |
686 weak_ptr.get(); | |
msramek
2017/04/06 12:06:39
I added the proactive UI thread binding here.
| |
687 | |
688 return weak_ptr; | |
689 } | |
OLD | NEW |