Chromium Code Reviews| Index: net/cookies/cookie_monster.cc | 
| diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc | 
| index f24637735fd44a3be289b58bec803081a1e25739..0abbd90d9a04fd4060e130beec6679cb50135ebf 100644 | 
| --- a/net/cookies/cookie_monster.cc | 
| +++ b/net/cookies/cookie_monster.cc | 
| @@ -530,51 +530,98 @@ void CookieMonster::GetAllCookiesForURLWithOptionsTask::Run() { | 
| } | 
| } | 
| -// Task class for DeleteAll call. | 
| -class CookieMonster::DeleteAllTask : public CookieMonster::CookieMonsterTask { | 
| +// Base task class for Delete*Task. | 
| +template <typename Callback, typename Result> | 
| +class CookieMonster::DeleteTask : public CookieMonster::CookieMonsterTask { | 
| public: | 
| - DeleteAllTask(CookieMonster* cookie_monster, | 
| - const CookieMonster::DeleteCallback& callback) | 
| + DeleteTask(CookieMonster* cookie_monster, | 
| + const Callback& callback) | 
| : CookieMonsterTask(cookie_monster), | 
| callback_(callback) { | 
| } | 
| + // Runs the delete task and returns a result. | 
| + virtual Result RunDeleteTask() = 0; | 
| + | 
| // CookieMonster::CookieMonsterTask: | 
| virtual void Run() OVERRIDE; | 
| + void FlushDone(const base::Closure& callback); | 
| + | 
| + private: | 
| + Callback callback_; | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(DeleteTask); | 
| +}; | 
| + | 
| +template <typename Callback, typename Result> | 
| +base::Closure RunDeleteTaskAndBindCallback( | 
| + CookieMonster::DeleteTask<Callback, Result>* task, | 
| + const Callback& callback) { | 
| + return base::Bind(callback, task->RunDeleteTask()); | 
| +} | 
| + | 
| +template <typename Callback> | 
| 
 
philipj_slow
2013/09/05 14:39:12
I wanted to do this:
template <>
base::Closure Ru
 
erikwright (departed)
2013/09/05 20:28:18
Presumably in cookie_monster.h the declaration of
 
 | 
| +base::Closure RunDeleteTaskAndBindCallback( | 
| + CookieMonster::DeleteTask<Callback, void>* task, | 
| + const Callback& callback) { | 
| + task->RunDeleteTask(); | 
| + return callback; | 
| +} | 
| + | 
| +template <typename Callback, typename Result> | 
| +void CookieMonster::DeleteTask<Callback, Result>::Run() { | 
| + this->cookie_monster()->FlushStore( | 
| + base::Bind(&CookieMonster::DeleteTask<Callback, Result>::FlushDone, this, | 
| + RunDeleteTaskAndBindCallback(this, callback_))); | 
| +} | 
| + | 
| +template <typename Callback, typename Result> | 
| +void CookieMonster::DeleteTask<Callback, Result>::FlushDone( | 
| + const base::Closure& callback) { | 
| + if (!callback.is_null()) { | 
| + this->InvokeCallback(callback); | 
| + } | 
| +} | 
| + | 
| +// Task class for DeleteAll call. | 
| +class CookieMonster::DeleteAllTask | 
| + : public CookieMonster::DeleteTask<CookieMonster::DeleteCallback, int> { | 
| + public: | 
| + DeleteAllTask(CookieMonster* cookie_monster, | 
| + const CookieMonster::DeleteCallback& callback) | 
| + : DeleteTask(cookie_monster, callback) { | 
| + } | 
| + | 
| + // CookieMonster::DeleteTask: | 
| + virtual int RunDeleteTask() OVERRIDE; | 
| + | 
| protected: | 
| virtual ~DeleteAllTask() {} | 
| private: | 
| - CookieMonster::DeleteCallback callback_; | 
| - | 
| DISALLOW_COPY_AND_ASSIGN(DeleteAllTask); | 
| }; | 
| -void CookieMonster::DeleteAllTask::Run() { | 
| - int num_deleted = this->cookie_monster()->DeleteAll(true); | 
| - if (!callback_.is_null()) { | 
| - this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run, | 
| - base::Unretained(&callback_), num_deleted)); | 
| - } | 
| +int CookieMonster::DeleteAllTask::RunDeleteTask() { | 
| + return this->cookie_monster()->DeleteAll(true); | 
| } | 
| // Task class for DeleteAllCreatedBetween call. | 
| class CookieMonster::DeleteAllCreatedBetweenTask | 
| - : public CookieMonster::CookieMonsterTask { | 
| + : public CookieMonster::DeleteTask<CookieMonster::DeleteCallback, int> { | 
| public: | 
| DeleteAllCreatedBetweenTask(CookieMonster* cookie_monster, | 
| const Time& delete_begin, | 
| const Time& delete_end, | 
| const CookieMonster::DeleteCallback& callback) | 
| - : CookieMonsterTask(cookie_monster), | 
| + : DeleteTask(cookie_monster, callback), | 
| delete_begin_(delete_begin), | 
| - delete_end_(delete_end), | 
| - callback_(callback) { | 
| + delete_end_(delete_end) { | 
| } | 
| - // CookieMonster::CookieMonsterTask: | 
| - virtual void Run() OVERRIDE; | 
| + // CookieMonster::DeleteTask: | 
| + virtual int RunDeleteTask() OVERRIDE; | 
| protected: | 
| virtual ~DeleteAllCreatedBetweenTask() {} | 
| @@ -582,56 +629,45 @@ class CookieMonster::DeleteAllCreatedBetweenTask | 
| private: | 
| Time delete_begin_; | 
| Time delete_end_; | 
| - CookieMonster::DeleteCallback callback_; | 
| DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenTask); | 
| }; | 
| -void CookieMonster::DeleteAllCreatedBetweenTask::Run() { | 
| - int num_deleted = this->cookie_monster()-> | 
| +int CookieMonster::DeleteAllCreatedBetweenTask::RunDeleteTask() { | 
| + return this->cookie_monster()-> | 
| DeleteAllCreatedBetween(delete_begin_, delete_end_); | 
| - if (!callback_.is_null()) { | 
| - this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run, | 
| - base::Unretained(&callback_), num_deleted)); | 
| - } | 
| } | 
| // Task class for DeleteAllForHost call. | 
| class CookieMonster::DeleteAllForHostTask | 
| - : public CookieMonster::CookieMonsterTask { | 
| + : public CookieMonster::DeleteTask<CookieMonster::DeleteCallback, int> { | 
| public: | 
| DeleteAllForHostTask(CookieMonster* cookie_monster, | 
| const GURL& url, | 
| const CookieMonster::DeleteCallback& callback) | 
| - : CookieMonsterTask(cookie_monster), | 
| - url_(url), | 
| - callback_(callback) { | 
| + : DeleteTask(cookie_monster, callback), | 
| + url_(url) { | 
| } | 
| - // CookieMonster::CookieMonsterTask: | 
| - virtual void Run() OVERRIDE; | 
| + // CookieMonster::DeleteTask: | 
| + virtual int RunDeleteTask() OVERRIDE; | 
| protected: | 
| virtual ~DeleteAllForHostTask() {} | 
| private: | 
| GURL url_; | 
| - CookieMonster::DeleteCallback callback_; | 
| DISALLOW_COPY_AND_ASSIGN(DeleteAllForHostTask); | 
| }; | 
| -void CookieMonster::DeleteAllForHostTask::Run() { | 
| - int num_deleted = this->cookie_monster()->DeleteAllForHost(url_); | 
| - if (!callback_.is_null()) { | 
| - this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run, | 
| - base::Unretained(&callback_), num_deleted)); | 
| - } | 
| +int CookieMonster::DeleteAllForHostTask::RunDeleteTask() { | 
| + return this->cookie_monster()->DeleteAllForHost(url_); | 
| } | 
| // Task class for DeleteAllCreatedBetweenForHost call. | 
| class CookieMonster::DeleteAllCreatedBetweenForHostTask | 
| - : public CookieMonster::CookieMonsterTask { | 
| + : public CookieMonster::DeleteTask<CookieMonster::DeleteCallback, int> { | 
| public: | 
| DeleteAllCreatedBetweenForHostTask( | 
| CookieMonster* cookie_monster, | 
| @@ -639,15 +675,14 @@ class CookieMonster::DeleteAllCreatedBetweenForHostTask | 
| Time delete_end, | 
| const GURL& url, | 
| const CookieMonster::DeleteCallback& callback) | 
| - : CookieMonsterTask(cookie_monster), | 
| + : DeleteTask(cookie_monster, callback), | 
| delete_begin_(delete_begin), | 
| delete_end_(delete_end), | 
| - url_(url), | 
| - callback_(callback) { | 
| + url_(url) { | 
| } | 
| - // CookieMonster::CookieMonsterTask: | 
| - virtual void Run() OVERRIDE; | 
| + // CookieMonster::DeleteTask: | 
| + virtual int RunDeleteTask() OVERRIDE; | 
| protected: | 
| virtual ~DeleteAllCreatedBetweenForHostTask() {} | 
| @@ -656,51 +691,40 @@ class CookieMonster::DeleteAllCreatedBetweenForHostTask | 
| Time delete_begin_; | 
| Time delete_end_; | 
| GURL url_; | 
| - CookieMonster::DeleteCallback callback_; | 
| DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenForHostTask); | 
| }; | 
| -void CookieMonster::DeleteAllCreatedBetweenForHostTask::Run() { | 
| - int num_deleted = this->cookie_monster()->DeleteAllCreatedBetweenForHost( | 
| +int CookieMonster::DeleteAllCreatedBetweenForHostTask::RunDeleteTask() { | 
| + return this->cookie_monster()->DeleteAllCreatedBetweenForHost( | 
| delete_begin_, delete_end_, url_); | 
| - if (!callback_.is_null()) { | 
| - this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run, | 
| - base::Unretained(&callback_), num_deleted)); | 
| - } | 
| } | 
| // Task class for DeleteCanonicalCookie call. | 
| class CookieMonster::DeleteCanonicalCookieTask | 
| - : public CookieMonster::CookieMonsterTask { | 
| + : public CookieMonster::DeleteTask<CookieMonster::DeleteCookieCallback, bool> { | 
| public: | 
| DeleteCanonicalCookieTask(CookieMonster* cookie_monster, | 
| const CanonicalCookie& cookie, | 
| const CookieMonster::DeleteCookieCallback& callback) | 
| - : CookieMonsterTask(cookie_monster), | 
| - cookie_(cookie), | 
| - callback_(callback) { | 
| + : DeleteTask(cookie_monster, callback), | 
| + cookie_(cookie) { | 
| } | 
| - // CookieMonster::CookieMonsterTask: | 
| - virtual void Run() OVERRIDE; | 
| + // CookieMonster::DeleteTask: | 
| + virtual bool RunDeleteTask() OVERRIDE; | 
| protected: | 
| virtual ~DeleteCanonicalCookieTask() {} | 
| private: | 
| CanonicalCookie cookie_; | 
| - CookieMonster::DeleteCookieCallback callback_; | 
| DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask); | 
| }; | 
| -void CookieMonster::DeleteCanonicalCookieTask::Run() { | 
| - bool result = this->cookie_monster()->DeleteCanonicalCookie(cookie_); | 
| - if (!callback_.is_null()) { | 
| - this->InvokeCallback(base::Bind(&CookieMonster::DeleteCookieCallback::Run, | 
| - base::Unretained(&callback_), result)); | 
| - } | 
| +bool CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() { | 
| + return this->cookie_monster()->DeleteCanonicalCookie(cookie_); | 
| } | 
| // Task class for SetCookieWithOptions call. | 
| @@ -782,19 +806,19 @@ void CookieMonster::GetCookiesWithOptionsTask::Run() { | 
| // Task class for DeleteCookie call. | 
| class CookieMonster::DeleteCookieTask | 
| - : public CookieMonster::CookieMonsterTask { | 
| + : public CookieMonster::DeleteTask<base::Closure, void> { | 
| public: | 
| DeleteCookieTask(CookieMonster* cookie_monster, | 
| const GURL& url, | 
| const std::string& cookie_name, | 
| const base::Closure& callback) | 
| - : CookieMonsterTask(cookie_monster), | 
| + : DeleteTask(cookie_monster, callback), | 
| url_(url), | 
| - cookie_name_(cookie_name), | 
| - callback_(callback) { } | 
| + cookie_name_(cookie_name) { | 
| + } | 
| - // CookieMonster::CookieMonsterTask: | 
| - virtual void Run() OVERRIDE; | 
| + // CookieMonster::DeleteTask: | 
| + virtual void RunDeleteTask() OVERRIDE; | 
| protected: | 
| virtual ~DeleteCookieTask() {} | 
| @@ -802,45 +826,36 @@ class CookieMonster::DeleteCookieTask | 
| private: | 
| GURL url_; | 
| std::string cookie_name_; | 
| - base::Closure callback_; | 
| DISALLOW_COPY_AND_ASSIGN(DeleteCookieTask); | 
| }; | 
| -void CookieMonster::DeleteCookieTask::Run() { | 
| +void CookieMonster::DeleteCookieTask::RunDeleteTask() { | 
| this->cookie_monster()->DeleteCookie(url_, cookie_name_); | 
| - if (!callback_.is_null()) { | 
| - this->InvokeCallback(callback_); | 
| - } | 
| } | 
| // Task class for DeleteSessionCookies call. | 
| class CookieMonster::DeleteSessionCookiesTask | 
| - : public CookieMonster::CookieMonsterTask { | 
| + : public CookieMonster::DeleteTask<CookieMonster::DeleteCallback, int> { | 
| public: | 
| DeleteSessionCookiesTask(CookieMonster* cookie_monster, | 
| const CookieMonster::DeleteCallback& callback) | 
| - : CookieMonsterTask(cookie_monster), callback_(callback) { | 
| + : DeleteTask(cookie_monster, callback) { | 
| } | 
| - // CookieMonster::CookieMonsterTask: | 
| - virtual void Run() OVERRIDE; | 
| + // CookieMonster::DeleteTask: | 
| + virtual int RunDeleteTask() OVERRIDE; | 
| protected: | 
| virtual ~DeleteSessionCookiesTask() {} | 
| 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)); | 
| - } | 
| +int CookieMonster::DeleteSessionCookiesTask::RunDeleteTask() { | 
| + return this->cookie_monster()->DeleteSessionCookies(); | 
| } | 
| // Task class for HasCookiesForETLDP1Task call. |