Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(376)

Side by Side Diff: chrome/browser/browsing_data/browsing_data_remover_impl.cc

Issue 2781083002: Fix the multi-threaded access to WeakPtr<BrowsingDataRemoverImpl> (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 callback.Run(); 53 callback.Run();
54 } 54 }
55 55
56 // Another convenience method to turn a callback without arguments into one that 56 // Another convenience method to turn a callback without arguments into one that
57 // accepts (and ignores) a single argument. 57 // accepts (and ignores) a single argument.
58 template <typename T> 58 template <typename T>
59 base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) { 59 base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) {
60 return base::Bind(&IgnoreArgumentHelper<T>, callback); 60 return base::Bind(&IgnoreArgumentHelper<T>, callback);
61 } 61 }
62 62
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( 63 void ClearHttpAuthCacheOnIOThread(
83 scoped_refptr<net::URLRequestContextGetter> context_getter, 64 scoped_refptr<net::URLRequestContextGetter> context_getter,
84 base::Time delete_begin) { 65 base::Time delete_begin) {
85 DCHECK_CURRENTLY_ON(BrowserThread::IO); 66 DCHECK_CURRENTLY_ON(BrowserThread::IO);
86 67
87 net::HttpNetworkSession* http_session = context_getter->GetURLRequestContext() 68 net::HttpNetworkSession* http_session = context_getter->GetURLRequestContext()
88 ->http_transaction_factory() 69 ->http_transaction_factory()
89 ->GetSession(); 70 ->GetSession();
90 DCHECK(http_session); 71 DCHECK(http_session);
91 http_session->http_auth_cache()->ClearEntriesAddedWithin(base::Time::Now() - 72 http_session->http_auth_cache()->ClearEntriesAddedWithin(base::Time::Now() -
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 weak_ptr_factory_.GetWeakPtr()); 128 weak_ptr_factory_.GetWeakPtr());
148 } 129 }
149 130
150 void BrowsingDataRemoverImpl::SubTask::CompletionCallback() { 131 void BrowsingDataRemoverImpl::SubTask::CompletionCallback() {
151 DCHECK_CURRENTLY_ON(BrowserThread::UI); 132 DCHECK_CURRENTLY_ON(BrowserThread::UI);
152 DCHECK(is_pending_); 133 DCHECK(is_pending_);
153 is_pending_ = false; 134 is_pending_ = false;
154 forward_callback_.Run(); 135 forward_callback_.Run();
155 } 136 }
156 137
138 BrowsingDataRemoverImpl::OriginMaskAndURLMatcher::OriginMaskAndURLMatcher() {}
139 BrowsingDataRemoverImpl::OriginMaskAndURLMatcher::~OriginMaskAndURLMatcher() {}
140
141 bool BrowsingDataRemoverImpl::OriginMaskAndURLMatcher::
142 DoesOriginMatchMaskAndURLs(
143 int origin_type_mask,
144 const base::Callback<bool(const GURL&)>& predicate,
145 const GURL& origin,
146 storage::SpecialStoragePolicy* policy) const {
147 if (!predicate.is_null() && !predicate.Run(origin))
148 return false;
149
150 const std::vector<std::string>& schemes = url::GetWebStorageSchemes();
151 bool is_web_scheme =
152 (std::find(schemes.begin(), schemes.end(), origin.GetOrigin().scheme()) !=
153 schemes.end());
154
155 // If a websafe origin is unprotected, it matches iff UNPROTECTED_WEB.
156 if ((!policy || !policy->IsStorageProtected(origin.GetOrigin())) &&
157 is_web_scheme && (origin_type_mask & ORIGIN_TYPE_UNPROTECTED_WEB)) {
158 return true;
159 }
160 origin_type_mask &= ~ORIGIN_TYPE_UNPROTECTED_WEB;
161
162 // Hosted applications (protected and websafe origins) iff PROTECTED_WEB.
163 if (policy && policy->IsStorageProtected(origin.GetOrigin()) &&
164 is_web_scheme && (origin_type_mask & ORIGIN_TYPE_PROTECTED_WEB)) {
165 return true;
166 }
167 origin_type_mask &= ~ORIGIN_TYPE_PROTECTED_WEB;
168
169 DCHECK(embedder_matcher_ || !origin_type_mask)
170 << "The mask contains embedder-defined origin types, but there is no "
171 << "embedder delegate matcher to process them.";
172
173 if (embedder_matcher_)
174 return embedder_matcher_.Run(origin_type_mask, origin, policy);
175
176 return false;
177 }
178
157 BrowsingDataRemoverImpl::BrowsingDataRemoverImpl( 179 BrowsingDataRemoverImpl::BrowsingDataRemoverImpl(
158 content::BrowserContext* browser_context) 180 content::BrowserContext* browser_context)
159 : browser_context_(browser_context), 181 : browser_context_(browser_context),
160 remove_mask_(-1), 182 remove_mask_(-1),
161 origin_type_mask_(-1), 183 origin_type_mask_(-1),
162 is_removing_(false), 184 is_removing_(false),
163 sub_task_forward_callback_( 185 sub_task_forward_callback_(
164 base::Bind(&BrowsingDataRemoverImpl::NotifyIfDone, 186 base::Bind(&BrowsingDataRemoverImpl::NotifyIfDone,
165 base::Unretained(this))), 187 base::Unretained(this))),
166 synchronous_clear_operations_(sub_task_forward_callback_), 188 synchronous_clear_operations_(sub_task_forward_callback_),
167 clear_embedder_data_(sub_task_forward_callback_), 189 clear_embedder_data_(sub_task_forward_callback_),
168 clear_cache_(sub_task_forward_callback_), 190 clear_cache_(sub_task_forward_callback_),
169 clear_channel_ids_(sub_task_forward_callback_), 191 clear_channel_ids_(sub_task_forward_callback_),
170 clear_http_auth_cache_(sub_task_forward_callback_), 192 clear_http_auth_cache_(sub_task_forward_callback_),
171 clear_storage_partition_data_(sub_task_forward_callback_), 193 clear_storage_partition_data_(sub_task_forward_callback_),
194 origin_mask_and_url_matcher_(new OriginMaskAndURLMatcher()),
172 weak_ptr_factory_(this) { 195 weak_ptr_factory_(this) {
173 DCHECK(browser_context_); 196 DCHECK(browser_context_);
174 } 197 }
175 198
176 BrowsingDataRemoverImpl::~BrowsingDataRemoverImpl() { 199 BrowsingDataRemoverImpl::~BrowsingDataRemoverImpl() {
177 if (!task_queue_.empty()) { 200 if (!task_queue_.empty()) {
178 VLOG(1) << "BrowsingDataRemoverImpl shuts down with " << task_queue_.size() 201 VLOG(1) << "BrowsingDataRemoverImpl shuts down with " << task_queue_.size()
179 << " pending tasks"; 202 << " pending tasks";
180 } 203 }
181 204
(...skipping 13 matching lines...) Expand all
195 } 218 }
196 219
197 void BrowsingDataRemoverImpl::SetRemoving(bool is_removing) { 220 void BrowsingDataRemoverImpl::SetRemoving(bool is_removing) {
198 DCHECK_NE(is_removing_, is_removing); 221 DCHECK_NE(is_removing_, is_removing);
199 is_removing_ = is_removing; 222 is_removing_ = is_removing;
200 } 223 }
201 224
202 void BrowsingDataRemoverImpl::SetEmbedderDelegate( 225 void BrowsingDataRemoverImpl::SetEmbedderDelegate(
203 std::unique_ptr<BrowsingDataRemoverDelegate> embedder_delegate) { 226 std::unique_ptr<BrowsingDataRemoverDelegate> embedder_delegate) {
204 embedder_delegate_ = std::move(embedder_delegate); 227 embedder_delegate_ = std::move(embedder_delegate);
228
229 if (embedder_delegate_) {
230 origin_mask_and_url_matcher_->set_embedder_matcher(
231 embedder_delegate_->GetMaskMatcherFunction());
232 }
205 } 233 }
206 234
207 BrowsingDataRemoverDelegate* 235 BrowsingDataRemoverDelegate*
208 BrowsingDataRemoverImpl::GetEmbedderDelegate() const { 236 BrowsingDataRemoverImpl::GetEmbedderDelegate() const {
209 return embedder_delegate_.get(); 237 return embedder_delegate_.get();
210 } 238 }
211 239
212 bool BrowsingDataRemoverImpl::DoesOriginMatchMask( 240 bool BrowsingDataRemoverImpl::DoesOriginMatchMask(
213 int origin_type_mask, 241 int origin_type_mask,
214 const GURL& origin, 242 const GURL& origin,
215 storage::SpecialStoragePolicy* policy) const { 243 storage::SpecialStoragePolicy* policy) const {
216 const std::vector<std::string>& schemes = url::GetWebStorageSchemes(); 244 return origin_mask_and_url_matcher_->DoesOriginMatchMaskAndURLs(
217 bool is_web_scheme = 245 origin_type_mask, base::Callback<bool(const GURL&)>(), origin, policy);
218 (std::find(schemes.begin(), schemes.end(), origin.GetOrigin().scheme()) !=
219 schemes.end());
220
221 // If a websafe origin is unprotected, it matches iff UNPROTECTED_WEB.
222 if ((!policy || !policy->IsStorageProtected(origin.GetOrigin())) &&
223 is_web_scheme && (origin_type_mask & ORIGIN_TYPE_UNPROTECTED_WEB)) {
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 } 246 }
246 247
247 void BrowsingDataRemoverImpl::Remove(const base::Time& delete_begin, 248 void BrowsingDataRemoverImpl::Remove(const base::Time& delete_begin,
248 const base::Time& delete_end, 249 const base::Time& delete_end,
249 int remove_mask, 250 int remove_mask,
250 int origin_type_mask) { 251 int origin_type_mask) {
251 RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, 252 RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask,
252 std::unique_ptr<BrowsingDataFilterBuilder>(), nullptr); 253 std::unique_ptr<BrowsingDataFilterBuilder>(), nullptr);
253 } 254 }
254 255
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 // partition, create a cookie matcher function. 497 // partition, create a cookie matcher function.
497 content::StoragePartition::CookieMatcherFunction cookie_matcher; 498 content::StoragePartition::CookieMatcherFunction cookie_matcher;
498 if (!filter_builder.IsEmptyBlacklist() && 499 if (!filter_builder.IsEmptyBlacklist() &&
499 (storage_partition_remove_mask & 500 (storage_partition_remove_mask &
500 content::StoragePartition::REMOVE_DATA_MASK_COOKIES)) { 501 content::StoragePartition::REMOVE_DATA_MASK_COOKIES)) {
501 cookie_matcher = filter_builder.BuildCookieFilter(); 502 cookie_matcher = filter_builder.BuildCookieFilter();
502 } 503 }
503 504
504 storage_partition->ClearData( 505 storage_partition->ClearData(
505 storage_partition_remove_mask, quota_storage_remove_mask, 506 storage_partition_remove_mask, quota_storage_remove_mask,
506 base::Bind(&DoesOriginMatchMaskAndUrls, weak_ptr_factory_.GetWeakPtr(), 507 base::Bind(&OriginMaskAndURLMatcher::DoesOriginMatchMaskAndURLs,
507 origin_type_mask_, filter), 508 origin_mask_and_url_matcher_, origin_type_mask_, filter),
508 cookie_matcher, delete_begin_, delete_end_, 509 cookie_matcher, delete_begin_, delete_end_,
509 clear_storage_partition_data_.GetCompletionCallback()); 510 clear_storage_partition_data_.GetCompletionCallback());
510 } 511 }
511 512
512 ////////////////////////////////////////////////////////////////////////////// 513 //////////////////////////////////////////////////////////////////////////////
513 // CACHE 514 // CACHE
514 if (remove_mask & DATA_TYPE_CACHE) { 515 if (remove_mask & DATA_TYPE_CACHE) {
515 base::RecordAction(UserMetricsAction("ClearBrowsingData_Cache")); 516 base::RecordAction(UserMetricsAction("ClearBrowsingData_Cache"));
516 517
517 // TODO(msramek): Clear the cache of all renderers. 518 // TODO(msramek): Clear the cache of all renderers.
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 662
662 if (completion_inhibitor_) { 663 if (completion_inhibitor_) {
663 completion_inhibitor_->OnBrowsingDataRemoverWouldComplete( 664 completion_inhibitor_->OnBrowsingDataRemoverWouldComplete(
664 this, base::Bind(&BrowsingDataRemoverImpl::Notify, 665 this, base::Bind(&BrowsingDataRemoverImpl::Notify,
665 weak_ptr_factory_.GetWeakPtr())); 666 weak_ptr_factory_.GetWeakPtr()));
666 return; 667 return;
667 } 668 }
668 669
669 Notify(); 670 Notify();
670 } 671 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698