Index: net/cookies/cookie_monster.cc |
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc |
index 63eff033910f4b9da46873c41918e89809c7c98a..84fc30dd67e4c8ac0df8d4e76930ce4ea39c3318 100644 |
--- a/net/cookies/cookie_monster.cc |
+++ b/net/cookies/cookie_monster.cc |
@@ -918,6 +918,32 @@ void CookieMonster::DeleteCookieTask::Run() { |
} |
} |
+// Task class for DeleteSessionCookies call. |
+class CookieMonster::DeleteSessionCookiesTask |
+ : public CookieMonster::CookieMonsterTask { |
+ public: |
+ DeleteSessionCookiesTask( |
+ CookieMonster* cookie_monster, |
+ const CookieMonster::DeleteCallback& callback) |
+ : CookieMonsterTask(cookie_monster), |
+ callback_(callback) { } |
+ |
+ virtual void Run() OVERRIDE; |
+ |
+ private: |
+ CookieMonster::DeleteCallback callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DeleteSessionCookiesTask); |
+}; |
+ |
+void CookieMonster::DeleteSessionCookiesTask::Run() { |
+ int num_deleted = this->cookie_monster()->DeleteSessionCookies(); |
+ if (!callback_.is_null()) { |
+ this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run, |
+ base::Unretained(&callback_), num_deleted)); |
+ } |
+} |
+ |
// Asynchronous CookieMonster API |
void CookieMonster::SetCookieWithDetailsAsync( |
@@ -1035,6 +1061,14 @@ void CookieMonster::DeleteCookieAsync(const GURL& url, |
DoCookieTaskForURL(task, url); |
} |
+void CookieMonster::DeleteSessionCookiesAsync( |
+ const CookieStore::DeleteCallback& callback) { |
+ scoped_refptr<DeleteSessionCookiesTask> task = |
+ new DeleteSessionCookiesTask(this, callback); |
+ |
+ DoCookieTask(task); |
+} |
+ |
void CookieMonster::DoCookieTask( |
const scoped_refptr<CookieMonsterTask>& task_item) { |
{ |
@@ -1390,6 +1424,26 @@ void CookieMonster::DeleteCookie(const GURL& url, |
} |
} |
+int CookieMonster::DeleteSessionCookies() { |
+ base::AutoLock autolock(lock_); |
+ |
+ int num_deleted = 0; |
+ for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
+ CookieMap::iterator curit = it; |
+ CanonicalCookie* cc = curit->second; |
+ ++it; |
+ |
+ if (!cc->IsPersistent()) { |
+ InternalDeleteCookie(curit, |
+ true, /*sync_to_store*/ |
+ DELETE_COOKIE_EXPIRED); |
+ ++num_deleted; |
+ } |
+ } |
+ |
+ return num_deleted; |
+} |
+ |
CookieMonster* CookieMonster::GetCookieMonster() { |
return this; |
} |