Index: net/cookies/cookie_monster.cc |
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc |
index c2b1871a5ca38bc84fe5591a43f978974152151e..003b31bc4416eb5ecf6a4367e26fb2370a2fb5d4 100644 |
--- a/net/cookies/cookie_monster.cc |
+++ b/net/cookies/cookie_monster.cc |
@@ -651,6 +651,40 @@ int CookieMonster::DeleteAllCreatedBetweenForHostTask::RunDeleteTask() { |
delete_begin_, delete_end_, url_); |
} |
+// Task class for DeleteAllCreatedBetweenForHost call. |
+class CookieMonster::DeleteAllCreatedBetweenWithPredicateTask |
+ : public DeleteTask<int> { |
+ public: |
+ 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), |
+ predicate_(predicate) {} |
+ |
+ // DeleteTask: |
+ int RunDeleteTask() override; |
+ |
+ protected: |
+ ~DeleteAllCreatedBetweenWithPredicateTask() override {} |
+ |
+ private: |
+ Time delete_begin_; |
+ Time delete_end_; |
+ base::Callback<bool(const CanonicalCookie&)> predicate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenWithPredicateTask); |
+}; |
+ |
+int CookieMonster::DeleteAllCreatedBetweenWithPredicateTask::RunDeleteTask() { |
+ return this->cookie_monster()->DeleteAllCreatedBetweenWithPredicate( |
+ delete_begin_, delete_end_, predicate_); |
+} |
+ |
// Task class for DeleteCanonicalCookie call. |
class CookieMonster::DeleteCanonicalCookieTask : public DeleteTask<int> { |
public: |
@@ -961,6 +995,21 @@ void CookieMonster::DeleteAllCreatedBetweenForHostAsync( |
DoCookieTaskForURL(task, url); |
} |
+void CookieMonster::DeleteAllCreatedBetweenWithPredicateAsync( |
+ const Time& delete_begin, |
+ const Time& delete_end, |
+ const base::Callback<bool(const CanonicalCookie&)>& predicate, |
+ const DeleteCallback& callback) { |
+ if (predicate.is_null()) { |
+ DeleteAllCreatedBetweenAsync(delete_begin, delete_end, callback); |
+ return; |
+ } |
+ scoped_refptr<DeleteAllCreatedBetweenWithPredicateTask> task = |
+ new DeleteAllCreatedBetweenWithPredicateTask( |
+ this, delete_begin, delete_end, predicate, callback); |
+ DoCookieTask(task); |
+} |
+ |
void CookieMonster::DeleteSessionCookiesAsync( |
const CookieStore::DeleteCallback& callback) { |
scoped_refptr<DeleteSessionCookiesTask> task = |
@@ -1181,6 +1230,27 @@ int CookieMonster::DeleteAllCreatedBetweenForHost(const Time delete_begin, |
return num_deleted; |
} |
+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 (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
+ CookieMap::iterator curit = it; |
+ CanonicalCookie* cc = curit->second; |
+ ++it; |
+ |
+ if (cc->CreationDate() >= delete_begin && |
+ (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, |