Index: net/cookies/cookie_monster.cc |
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc |
index aaecaf9a2657da8be6e1c6ad442a3a2805d86efd..7846bc30a12f89a5ce11d5fc9b45dc794e28c028 100644 |
--- a/net/cookies/cookie_monster.cc |
+++ b/net/cookies/cookie_monster.cc |
@@ -591,37 +591,38 @@ int CookieMonster::DeleteAllCreatedBetweenTask::RunDeleteTask() { |
delete_end_); |
} |
-// Task class for DeleteAllCreatedBetweenForHost call. |
-class CookieMonster::DeleteAllCreatedBetweenForHostTask |
+// Task class for DeleteAllCreatedBetweenWithPredicate call. |
+class CookieMonster::DeleteAllCreatedBetweenWithPredicateTask |
: public DeleteTask<int> { |
public: |
- DeleteAllCreatedBetweenForHostTask(CookieMonster* cookie_monster, |
- Time delete_begin, |
- Time delete_end, |
- const GURL& url, |
- const DeleteCallback& callback) |
+ DeleteAllCreatedBetweenWithPredicateTask( |
+ CookieMonster* cookie_monster, |
+ Time delete_begin, |
+ Time delete_end, |
+ base::Callback<bool(const CanonicalCookie&)> predicate, |
+ const DeleteCallback& callback) |
: DeleteTask<int>(cookie_monster, callback), |
delete_begin_(delete_begin), |
delete_end_(delete_end), |
- url_(url) {} |
+ predicate_(predicate) {} |
// DeleteTask: |
int RunDeleteTask() override; |
protected: |
- ~DeleteAllCreatedBetweenForHostTask() override {} |
+ ~DeleteAllCreatedBetweenWithPredicateTask() override {} |
private: |
Time delete_begin_; |
Time delete_end_; |
- GURL url_; |
+ base::Callback<bool(const CanonicalCookie&)> predicate_; |
- DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenForHostTask); |
+ DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenWithPredicateTask); |
}; |
-int CookieMonster::DeleteAllCreatedBetweenForHostTask::RunDeleteTask() { |
- return this->cookie_monster()->DeleteAllCreatedBetweenForHost( |
- delete_begin_, delete_end_, url_); |
+int CookieMonster::DeleteAllCreatedBetweenWithPredicateTask::RunDeleteTask() { |
+ return this->cookie_monster()->DeleteAllCreatedBetweenWithPredicate( |
+ delete_begin_, delete_end_, predicate_); |
} |
// Task class for DeleteCanonicalCookie call. |
@@ -922,16 +923,19 @@ void CookieMonster::DeleteAllCreatedBetweenAsync( |
DoCookieTask(task); |
} |
-void CookieMonster::DeleteAllCreatedBetweenForHostAsync( |
- const Time delete_begin, |
- const Time delete_end, |
- const GURL& url, |
+void CookieMonster::DeleteAllCreatedBetweenWithPredicateAsync( |
+ const Time& delete_begin, |
+ const Time& delete_end, |
+ const base::Callback<bool(const CanonicalCookie&)>& predicate, |
const DeleteCallback& callback) { |
- scoped_refptr<DeleteAllCreatedBetweenForHostTask> task = |
- new DeleteAllCreatedBetweenForHostTask(this, delete_begin, delete_end, |
- url, callback); |
- |
- DoCookieTaskForURL(task, url); |
+ if (predicate.is_null()) { |
+ callback.Run(0); |
+ return; |
+ } |
+ scoped_refptr<DeleteAllCreatedBetweenWithPredicateTask> task = |
+ new DeleteAllCreatedBetweenWithPredicateTask( |
+ this, delete_begin, delete_end, predicate, callback); |
+ DoCookieTask(task); |
} |
void CookieMonster::DeleteSessionCookiesAsync( |
@@ -1124,42 +1128,30 @@ int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, |
return num_deleted; |
} |
-int CookieMonster::DeleteAllCreatedBetweenForHost(const Time delete_begin, |
- const Time delete_end, |
- const GURL& url) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- |
- if (!HasCookieableScheme(url)) |
- return 0; |
- |
- const std::string host(url.host()); |
- |
- // We store host cookies in the store by their canonical host name; |
- // domain cookies are stored with a leading ".". So this is a pretty |
- // simple lookup and per-cookie delete. |
+int CookieMonster::DeleteAllCreatedBetweenWithPredicate( |
+ const base::Time& delete_begin, |
+ const base::Time& delete_end, |
+ const base::Callback<bool(const CanonicalCookie&)>& predicate) { |
int num_deleted = 0; |
- for (CookieMapItPair its = cookies_.equal_range(GetKey(host)); |
- its.first != its.second;) { |
- CookieMap::iterator curit = its.first; |
- ++its.first; |
- |
- const CanonicalCookie* const cc = curit->second; |
+ for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
+ CookieMap::iterator curit = it; |
+ CanonicalCookie* cc = curit->second; |
+ ++it; |
- // Delete only on a match as a host cookie. |
- if (cc->IsHostCookie() && cc->IsDomainMatch(host) && |
- cc->CreationDate() >= delete_begin && |
+ if (cc->CreationDate() >= delete_begin && |
// The assumption that null |delete_end| is equivalent to |
// Time::Max() is confusing. |
- (delete_end.is_null() || cc->CreationDate() < delete_end)) { |
- num_deleted++; |
- |
- InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); |
+ (delete_end.is_null() || cc->CreationDate() < delete_end) && |
+ predicate.Run(*cc)) { |
+ InternalDeleteCookie(curit, true, /*sync_to_store*/ |
+ DELETE_COOKIE_EXPLICIT); |
+ ++num_deleted; |
} |
} |
+ |
return num_deleted; |
} |
- |
bool CookieMonster::SetCookieWithOptions(const GURL& url, |
const std::string& cookie_line, |
const CookieOptions& options) { |