Chromium Code Reviews| Index: net/base/cookie_monster.cc |
| =================================================================== |
| --- net/base/cookie_monster.cc (revision 99705) |
| +++ net/base/cookie_monster.cc (working copy) |
| @@ -48,10 +48,12 @@ |
| #include <set> |
| #include "base/basictypes.h" |
| +#include "base/bind.h" |
| #include "base/format_macros.h" |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop.h" |
| +#include "base/message_loop_proxy.h" |
| #include "base/metrics/histogram.h" |
| #include "base/string_tokenizer.h" |
| #include "base/string_util.h" |
| @@ -420,6 +422,7 @@ |
| CookieMonster::CookieMonster(PersistentCookieStore* store, Delegate* delegate) |
| : initialized_(false), |
| + loaded_(false), |
| expiry_and_key_scheme_(expiry_and_key_default_), |
| store_(store), |
| last_access_threshold_( |
| @@ -435,6 +438,7 @@ |
| Delegate* delegate, |
| int last_access_threshold_milliseconds) |
| : initialized_(false), |
| + loaded_(false), |
| expiry_and_key_scheme_(expiry_and_key_default_), |
| store_(store), |
| last_access_threshold_(base::TimeDelta::FromMilliseconds( |
| @@ -568,6 +572,539 @@ |
| return (domain_string.empty() || domain_string[0] != '.'); |
| } |
| +// Task classes for queueing the coming request. |
| + |
| +class CookieMonster::CookieMonsterTask |
| + : public base::RefCountedThreadSafe<CookieMonsterTask> { |
|
Randy Smith (Not in Mondays)
2011/09/07 19:04:07
I feel as if RefCountedThreadSafe<> is what you wa
erikwright (departed)
2011/09/08 02:48:58
See the comment I have added on CookieMonsterTask:
|
| + public: |
| + // Runs the task and invokes the client callback on the thread that |
| + // originally constructed the task. |
| + virtual void Run() = 0; |
| + |
| + protected: |
| + explicit CookieMonsterTask(CookieMonster* cookie_monster); |
| + virtual ~CookieMonsterTask(); |
| + |
| + // Invokes the callback immediately, if the current thread is the one |
| + // that originated the task, or queues the callback for execution on the |
| + // appropriate thread. Maintains a reference to this CookieMonsterTask |
| + // instance until the callback completes. |
| + void InvokeCallback(base::Closure callback); |
| + |
| + CookieMonster* cookie_monster() { |
| + return cookie_monster_; |
| + } |
| + |
| + friend class base::RefCountedThreadSafe<CookieMonsterTask>; |
| + |
| + private: |
| + CookieMonster* cookie_monster_; |
| + scoped_refptr<base::MessageLoopProxy> thread_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CookieMonsterTask); |
| +}; |
| + |
| +CookieMonster::CookieMonsterTask::CookieMonsterTask( |
| + CookieMonster* cookie_monster) |
| + : cookie_monster_(cookie_monster), |
| + thread_(base::MessageLoopProxy::current()) { } |
| + |
| +CookieMonster::CookieMonsterTask::~CookieMonsterTask() { } |
| + |
| +void CookieMonster::CookieMonsterTask::InvokeCallback(base::Closure callback) { |
| + if (!callback.is_null()) { |
|
Randy Smith (Not in Mondays)
2011/09/07 19:04:07
nit: Probably easier to read code if you reverse t
erikwright (departed)
2011/09/08 02:48:58
Done.
|
| + if (thread_->BelongsToCurrentThread()) { |
| + callback.Run(); |
| + } else { |
| + thread_->PostTask(FROM_HERE, base::Bind( |
| + &CookieMonster::CookieMonsterTask::InvokeCallback, this, callback)); |
| + } |
| + } |
| +} |
| + |
| +// Task class for SetCookieWithDetails call. |
| +class CookieMonster::SetCookieWithDetailsTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + SetCookieWithDetailsTask( |
| + CookieMonster* cookie_monster, |
| + const GURL& url, const std::string& name, const std::string& value, |
| + const std::string& domain, const std::string& path, |
| + const base::Time& expiration_time, bool secure, bool http_only, |
| + const CookieMonster::SetCookiesCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + url_(url), |
| + name_(name), |
| + value_(value), |
| + domain_(domain), |
| + path_(path), |
| + expiration_time_(expiration_time), |
| + secure_(secure), |
| + http_only_(http_only), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + GURL url_; |
| + std::string name_; |
| + std::string value_; |
| + std::string domain_; |
| + std::string path_; |
| + base::Time expiration_time_; |
| + bool secure_; |
| + bool http_only_; |
| + CookieMonster::SetCookiesCallback callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SetCookieWithDetailsTask); |
| +}; |
| + |
| +void CookieMonster::SetCookieWithDetailsTask::Run() { |
| + bool success = this->cookie_monster()-> |
| + SetCookieWithDetails(url_, name_, value_, domain_, path_, |
| + expiration_time_, secure_, http_only_); |
| + if (!callback_.is_null()) { |
|
Randy Smith (Not in Mondays)
2011/09/07 19:04:07
This test (and its siblings) seems redundant with
erikwright (departed)
2011/09/08 02:48:58
Done.
|
| + this->InvokeCallback(base::Bind(&CookieMonster::SetCookiesCallback::Run, |
| + base::Unretained(&callback_), success)); |
| + } |
| +} |
| + |
| +// Task class for GetAllCookies call. |
| +class CookieMonster::GetAllCookiesTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + GetAllCookiesTask(CookieMonster* cookie_monster, |
| + const CookieMonster::GetCookieListCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + CookieMonster::GetCookieListCallback callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(GetAllCookiesTask); |
| +}; |
| + |
| +void CookieMonster::GetAllCookiesTask::Run() { |
| + if (!callback_.is_null()) { |
| + CookieList cookies = this->cookie_monster()->GetAllCookies(); |
| + this->InvokeCallback(base::Bind(&CookieMonster::GetCookieListCallback::Run, |
| + base::Unretained(&callback_), cookies)); |
| + } |
| +} |
| + |
| +// Task class for GetAllCookiesForURLWithOptions call. |
| +class CookieMonster::GetAllCookiesForURLWithOptionsTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + GetAllCookiesForURLWithOptionsTask( |
| + CookieMonster* cookie_monster, |
| + const GURL& url, |
| + const CookieOptions& options, |
| + const CookieMonster::GetCookieListCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + url_(url), |
| + options_(options), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + GURL url_; |
| + CookieOptions options_; |
| + CookieMonster::GetCookieListCallback callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(GetAllCookiesForURLWithOptionsTask); |
| +}; |
| + |
| +void CookieMonster::GetAllCookiesForURLWithOptionsTask::Run() { |
| + if (!callback_.is_null()) { |
| + CookieList cookies = this->cookie_monster()-> |
| + GetAllCookiesForURLWithOptions(url_, options_); |
| + this->InvokeCallback(base::Bind(&CookieMonster::GetCookieListCallback::Run, |
| + base::Unretained(&callback_), cookies)); |
| + } |
| +} |
| + |
| +// Task class for DeleteAll call. |
| +class CookieMonster::DeleteAllTask : public CookieMonster::CookieMonsterTask { |
| + public: |
| + DeleteAllTask(CookieMonster* cookie_monster, |
| + const CookieMonster::DeleteCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + 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)); |
| + } |
| +} |
| + |
| +// Task class for DeleteAllCreatedBetween call. |
| +class CookieMonster::DeleteAllCreatedBetweenTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + DeleteAllCreatedBetweenTask( |
| + CookieMonster* cookie_monster, |
| + const Time& delete_begin, |
| + const Time& delete_end, |
| + const CookieMonster::DeleteCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + delete_begin_(delete_begin), |
| + delete_end_(delete_end), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + 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()-> |
| + 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: |
| + DeleteAllForHostTask(CookieMonster* cookie_monster, |
| + const GURL& url, |
| + const CookieMonster::DeleteCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + url_(url), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + 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)); |
| + } |
| +} |
| + |
| +// Task class for DeleteCanonicalCookie call. |
| +class CookieMonster::DeleteCanonicalCookieTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + DeleteCanonicalCookieTask( |
| + CookieMonster* cookie_monster, |
| + const CookieMonster::CanonicalCookie& cookie, |
| + const CookieMonster::DeleteCookieCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + cookie_(cookie), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + CookieMonster::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)); |
| + } |
| +} |
| + |
| +// Task class for SetCookieWithOptions call. |
| +class CookieMonster::SetCookieWithOptionsTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + SetCookieWithOptionsTask(CookieMonster* cookie_monster, |
| + const GURL& url, |
| + const std::string& cookie_line, |
| + const CookieOptions& options, |
| + const CookieMonster::SetCookiesCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + url_(url), |
| + cookie_line_(cookie_line), |
| + options_(options), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + GURL url_; |
| + std::string cookie_line_; |
| + CookieOptions options_; |
| + CookieMonster::SetCookiesCallback callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SetCookieWithOptionsTask); |
| +}; |
| + |
| +void CookieMonster::SetCookieWithOptionsTask::Run() { |
| + bool result = this->cookie_monster()-> |
| + SetCookieWithOptions(url_, cookie_line_, options_); |
| + if (!callback_.is_null()) { |
| + this->InvokeCallback(base::Bind(&CookieMonster::SetCookiesCallback::Run, |
| + base::Unretained(&callback_), result)); |
| + } |
| +} |
| + |
| +// Task class for GetCookiesWithOptions call. |
| +class CookieMonster::GetCookiesWithOptionsTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + GetCookiesWithOptionsTask(CookieMonster* cookie_monster, |
| + GURL url, |
| + const CookieOptions& options, |
| + const CookieMonster::GetCookiesCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + url_(url), |
| + options_(options), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + GURL url_; |
| + CookieOptions options_; |
| + CookieMonster::GetCookiesCallback callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(GetCookiesWithOptionsTask); |
| +}; |
| + |
| +void CookieMonster::GetCookiesWithOptionsTask::Run() { |
| + std::string cookie = this->cookie_monster()-> |
| + GetCookiesWithOptions(url_, options_); |
| + if (!callback_.is_null()) { |
| + this->InvokeCallback(base::Bind(&CookieMonster::GetCookiesCallback::Run, |
| + base::Unretained(&callback_), cookie)); |
| + } |
| +} |
| + |
| +// Task class for GetCookiesWithInfo call. |
| +class CookieMonster::GetCookiesWithInfoTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + GetCookiesWithInfoTask(CookieMonster* cookie_monster, |
| + const GURL& url, |
| + const CookieOptions& options, |
| + const CookieMonster::GetCookieInfoCallback& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + url_(url), |
| + options_(options), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + GURL url_; |
| + CookieOptions options_; |
| + CookieMonster::GetCookieInfoCallback callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(GetCookiesWithInfoTask); |
| +}; |
| + |
| +void CookieMonster::GetCookiesWithInfoTask::Run() { |
| + if (!callback_.is_null()) { |
| + std::string cookie_line; |
| + std::vector<CookieMonster::CookieInfo> cookie_infos; |
| + this->cookie_monster()-> |
| + GetCookiesWithInfo(url_, options_, &cookie_line, &cookie_infos); |
| + this->InvokeCallback(base::Bind(&CookieMonster::GetCookieInfoCallback::Run, |
| + base::Unretained(&callback_), |
| + cookie_line, cookie_infos)); |
| + } |
| +} |
| + |
| +// Task class for DeleteCookie call. |
| +class CookieMonster::DeleteCookieTask |
| + : public CookieMonster::CookieMonsterTask { |
| + public: |
| + DeleteCookieTask(CookieMonster* cookie_monster, |
| + GURL url, |
| + const std::string& cookie_name, |
| + const base::Closure& callback) |
| + : CookieMonsterTask(cookie_monster), |
| + url_(url), |
| + cookie_name_(cookie_name), |
| + callback_(callback) { } |
| + |
| + virtual void Run() OVERRIDE; |
| + |
| + private: |
| + GURL url_; |
| + std::string cookie_name_; |
| + base::Closure callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(DeleteCookieTask); |
| +}; |
| + |
| +void CookieMonster::DeleteCookieTask::Run() { |
| + this->cookie_monster()->DeleteCookie(url_, cookie_name_); |
| + if (!callback_.is_null()) { |
| + this->InvokeCallback(callback_); |
| + } |
| +} |
| + |
| +// Asynchronous CookieMonster API |
| + |
| +void CookieMonster::SetCookieWithDetailsAsync( |
| + const GURL& url, const std::string& name, const std::string& value, |
| + const std::string& domain, const std::string& path, |
| + const base::Time& expiration_time, bool secure, bool http_only, |
| + const SetCookiesCallback& callback) { |
| + scoped_refptr<SetCookieWithDetailsTask> task = |
| + new SetCookieWithDetailsTask(this, url, name, value, domain, path, |
| + expiration_time, secure, http_only, |
| + callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::GetAllCookiesAsync(const GetCookieListCallback& callback) { |
| + scoped_refptr<GetAllCookiesTask> task = |
| + new GetAllCookiesTask(this, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| + |
| +void CookieMonster::GetAllCookiesForURLWithOptionsAsync( |
| + const GURL& url, |
| + const CookieOptions& options, |
| + const GetCookieListCallback& callback) { |
| + scoped_refptr<GetAllCookiesForURLWithOptionsTask> task = |
| + new GetAllCookiesForURLWithOptionsTask(this, url, options, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::GetAllCookiesForURLAsync( |
| + const GURL& url, const GetCookieListCallback& callback) { |
| + CookieOptions options; |
| + options.set_include_httponly(); |
| + scoped_refptr<GetAllCookiesForURLWithOptionsTask> task = |
| + new GetAllCookiesForURLWithOptionsTask(this, url, options, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::DeleteAllAsync(const DeleteCallback& callback) { |
| + scoped_refptr<DeleteAllTask> task = |
| + new DeleteAllTask(this, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::DeleteAllCreatedBetweenAsync( |
| + const Time& delete_begin, const Time& delete_end, |
| + const DeleteCallback& callback) { |
| + scoped_refptr<DeleteAllCreatedBetweenTask> task = |
| + new DeleteAllCreatedBetweenTask(this, delete_begin, delete_end, |
| + callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::DeleteAllForHostAsync( |
| + const GURL& url, const DeleteCallback& callback) { |
| + scoped_refptr<DeleteAllForHostTask> task = |
| + new DeleteAllForHostTask(this, url, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::DeleteCanonicalCookieAsync( |
| + const CanonicalCookie& cookie, |
| + const DeleteCookieCallback& callback) { |
| + scoped_refptr<DeleteCanonicalCookieTask> task = |
| + new DeleteCanonicalCookieTask(this, cookie, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::SetCookieWithOptionsAsync( |
| + const GURL& url, |
| + const std::string& cookie_line, |
| + const CookieOptions& options, |
| + const SetCookiesCallback& callback) { |
| + scoped_refptr<SetCookieWithOptionsTask> task = |
| + new SetCookieWithOptionsTask(this, url, cookie_line, options, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::GetCookiesWithOptionsAsync( |
| + const GURL& url, |
| + const CookieOptions& options, |
| + const GetCookiesCallback& callback) { |
| + scoped_refptr<GetCookiesWithOptionsTask> task = |
| + new GetCookiesWithOptionsTask(this, url, options, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::GetCookiesWithInfoAsync( |
| + const GURL& url, |
| + const CookieOptions& options, |
| + const GetCookieInfoCallback& callback) { |
| + scoped_refptr<GetCookiesWithInfoTask> task = |
| + new GetCookiesWithInfoTask(this, url, options, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::DeleteCookieAsync(const GURL& url, |
| + const std::string& cookie_name, |
| + const base::Closure& callback) { |
| + scoped_refptr<DeleteCookieTask> task = |
| + new DeleteCookieTask(this, url, cookie_name, callback); |
| + |
| + DoCookieTask(task); |
| +} |
| + |
| +void CookieMonster::DoCookieTask( |
| + const scoped_refptr<CookieMonsterTask>& task_item) { |
| + InitIfNecessary(); |
| + |
| + { |
| + base::AutoLock autolock(lock_); |
| + if (!loaded_) { |
| + queue_.push(task_item); |
| + return; |
| + } |
| + } |
| + |
| + task_item->Run(); |
| +} |
| + |
| bool CookieMonster::SetCookieWithDetails( |
| const GURL& url, const std::string& name, const std::string& value, |
| const std::string& domain, const std::string& path, |
| @@ -577,8 +1114,6 @@ |
| if (!HasCookieableScheme(url)) |
| return false; |
| - InitIfNecessary(); |
| - |
| Time creation_time = CurrentTime(); |
| last_time_seen_ = creation_time; |
| @@ -601,17 +1136,6 @@ |
| return SetCanonicalCookie(&cc, creation_time, options); |
| } |
| -void CookieMonster::SetCookieWithDetailsAsync( |
| - const GURL& url, const std::string& name, const std::string& value, |
| - const std::string& domain, const std::string& path, |
| - const base::Time& expiration_time, bool secure, bool http_only, |
| - const SetCookiesCallback& callback) { |
| - bool success_ = SetCookieWithDetails(url, name, value, domain, path, |
| - expiration_time, secure, http_only); |
| - if (!callback.is_null()) |
| - callback.Run(success_); |
| -} |
| - |
| bool CookieMonster::InitializeFrom(const CookieList& list) { |
| base::AutoLock autolock(lock_); |
| InitIfNecessary(); |
| @@ -631,7 +1155,6 @@ |
| CookieList CookieMonster::GetAllCookies() { |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| // This function is being called to scrape the cookie list for management UI |
| // or similar. We shouldn't show expired cookies in this list since it will |
| @@ -662,16 +1185,10 @@ |
| return cookie_list; |
| } |
| -void CookieMonster::GetAllCookiesAsync(const GetCookieListCallback& callback) { |
| - if (!callback.is_null()) |
| - callback.Run(GetAllCookies()); |
| -} |
| - |
| CookieList CookieMonster::GetAllCookiesForURLWithOptions( |
| const GURL& url, |
| const CookieOptions& options) { |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| std::vector<CanonicalCookie*> cookie_ptrs; |
| FindCookiesForHostAndDomain(url, options, false, &cookie_ptrs); |
| @@ -685,14 +1202,6 @@ |
| return cookies; |
| } |
| -void CookieMonster::GetAllCookiesForURLWithOptionsAsync( |
| - const GURL& url, |
| - const CookieOptions& options, |
| - const GetCookieListCallback& callback) { |
| - if (!callback.is_null()) |
| - callback.Run(GetAllCookiesForURLWithOptions(url, options)); |
| -} |
| - |
| CookieList CookieMonster::GetAllCookiesForURL(const GURL& url) { |
| CookieOptions options; |
| options.set_include_httponly(); |
| @@ -700,16 +1209,8 @@ |
| return GetAllCookiesForURLWithOptions(url, options); |
| } |
| -void CookieMonster::GetAllCookiesForURLAsync( |
| - const GURL& url, const GetCookieListCallback& callback) { |
| - if (!callback.is_null()) |
| - callback.Run(GetAllCookiesForURL(url)); |
| -} |
| - |
| int CookieMonster::DeleteAll(bool sync_to_store) { |
| base::AutoLock autolock(lock_); |
| - if (sync_to_store) |
| - InitIfNecessary(); |
| int num_deleted = 0; |
| for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
| @@ -725,10 +1226,8 @@ |
| } |
| int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, |
| - const Time& delete_end, |
| - bool sync_to_store) { |
| + const Time& delete_end) { |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| int num_deleted = 0; |
| for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
| @@ -738,7 +1237,9 @@ |
| if (cc->CreationDate() >= delete_begin && |
| (delete_end.is_null() || cc->CreationDate() < delete_end)) { |
| - InternalDeleteCookie(curit, sync_to_store, DELETE_COOKIE_EXPLICIT); |
| + InternalDeleteCookie(curit, |
| + true, /*sync_to_store*/ |
| + DELETE_COOKIE_EXPLICIT); |
| ++num_deleted; |
| } |
| } |
| @@ -746,19 +1247,8 @@ |
| return num_deleted; |
| } |
| -void CookieMonster::DeleteAllCreatedBetweenAsync( |
| - const Time& delete_begin, const Time& delete_end, |
| - bool sync_to_store, |
| - const DeleteCallback& callback) { |
| - int num_deleted = DeleteAllCreatedBetween( |
| - delete_begin, delete_end, sync_to_store); |
| - if (!callback.is_null()) |
| - callback.Run(num_deleted); |
| -} |
| - |
| int CookieMonster::DeleteAllForHost(const GURL& url) { |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| if (!HasCookieableScheme(url)) |
| return 0; |
| @@ -787,16 +1277,8 @@ |
| return num_deleted; |
| } |
| -void CookieMonster::DeleteAllForHostAsync( |
| - const GURL& url, const DeleteCallback& callback) { |
| - int num_deleted = DeleteAllForHost(url); |
| - if (!callback.is_null()) |
| - callback.Run(num_deleted); |
| -} |
| - |
| bool CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain())); |
| its.first != its.second; ++its.first) { |
| @@ -809,14 +1291,6 @@ |
| return false; |
| } |
| -void CookieMonster::DeleteCanonicalCookieAsync( |
| - const CanonicalCookie& cookie, |
| - const DeleteCookieCallback& callback) { |
| - bool result = DeleteCanonicalCookie(cookie); |
| - if (!callback.is_null()) |
| - callback.Run(result); |
| -} |
| - |
| void CookieMonster::SetCookieableSchemes( |
| const char* schemes[], size_t num_schemes) { |
| base::AutoLock autolock(lock_); |
| @@ -865,25 +1339,12 @@ |
| return false; |
| } |
| - InitIfNecessary(); |
| - |
| return SetCookieWithCreationTimeAndOptions(url, cookie_line, Time(), options); |
| } |
| -void CookieMonster::SetCookieWithOptionsAsync( |
| - const GURL& url, |
| - const std::string& cookie_line, |
| - const CookieOptions& options, |
| - const SetCookiesCallback& callback) { |
| - bool result = SetCookieWithOptions(url, cookie_line, options); |
| - if (!callback.is_null()) |
| - callback.Run(result); |
| -} |
| - |
| std::string CookieMonster::GetCookiesWithOptions(const GURL& url, |
| const CookieOptions& options) { |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| if (!HasCookieableScheme(url)) |
| return std::string(); |
| @@ -903,14 +1364,6 @@ |
| return cookie_line; |
| } |
| -void CookieMonster::GetCookiesWithOptionsAsync( |
| - const GURL& url, const CookieOptions& options, |
| - const GetCookiesCallback& callback) { |
| - std::string cookie = GetCookiesWithOptions(url, options); |
| - if (!callback.is_null()) |
| - callback.Run(cookie); |
| -} |
| - |
| void CookieMonster::GetCookiesWithInfo(const GURL& url, |
| const CookieOptions& options, |
| std::string* cookie_line, |
| @@ -919,7 +1372,6 @@ |
| DCHECK(cookie_infos->empty()); |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| if (!HasCookieableScheme(url)) |
| return; |
| @@ -938,22 +1390,9 @@ |
| histogram_time_mac_->AddTime(TimeTicks::Now() - mac_start_time); |
| } |
| -void CookieMonster::GetCookiesWithInfoAsync( |
| - const GURL& url, |
| - const CookieOptions& options, |
| - const GetCookieInfoCallback& callback) { |
| - std::string cookie_line; |
| - std::vector<CookieInfo> cookie_infos; |
| - GetCookiesWithInfo(url, options, &cookie_line, &cookie_infos); |
| - |
| - if (!callback.is_null()) |
| - callback.Run(&cookie_line, &cookie_infos); |
| -} |
| - |
| void CookieMonster::DeleteCookie(const GURL& url, |
| const std::string& cookie_name) { |
| base::AutoLock autolock(lock_); |
| - InitIfNecessary(); |
| if (!HasCookieableScheme(url)) |
| return; |
| @@ -983,14 +1422,6 @@ |
| } |
| } |
| -void CookieMonster::DeleteCookieAsync(const GURL& url, |
| - const std::string& cookie_name, |
| - const base::Closure& callback) { |
| - DeleteCookie(url, cookie_name); |
| - if (!callback.is_null()) |
| - callback.Run(); |
| -} |
| - |
| CookieMonster* CookieMonster::GetCookieMonster() { |
| return this; |
| } |
| @@ -1002,6 +1433,7 @@ |
| bool CookieMonster::SetCookieWithCreationTime(const GURL& url, |
| const std::string& cookie_line, |
| const base::Time& creation_time) { |
| + DCHECK(!store_) << "This method is only to be used by unit-tests."; |
| base::AutoLock autolock(lock_); |
| if (!HasCookieableScheme(url)) { |
| @@ -1015,17 +1447,22 @@ |
| void CookieMonster::InitStore() { |
| DCHECK(store_) << "Store must exist to initialize"; |
| + store_->Load(base::Bind(&CookieMonster::OnLoaded, this)); |
| +} |
| - TimeTicks beginning_time(TimeTicks::Now()); |
| +void CookieMonster::OnLoaded(const std::vector<CanonicalCookie*>& cookies) { |
| + StoreLoadedCookies(cookies); |
| + // Invoke the task queue of cookie request. |
| + InvokeQueue(); |
| +} |
| +void CookieMonster::StoreLoadedCookies( |
| + const std::vector<CanonicalCookie*>& cookies) { |
| // Initialize the store and sync in any saved persistent cookies. We don't |
| // care if it's expired, insert it so it can be garbage collected, removed, |
| // and sync'd. |
| - std::vector<CanonicalCookie*> cookies; |
| - // Reserve space for the maximum amount of cookies a database should have. |
| - // This prevents multiple vector growth / copies as we append cookies. |
| - cookies.reserve(kMaxCookies); |
| - store_->Load(&cookies); |
| + base::AutoLock autolock(lock_); |
| + TimeTicks beginning_time(TimeTicks::Now()); |
| // Avoid ever letting cookies with duplicate creation times into the store; |
| // that way we don't have to worry about what sections of code are safe |
| @@ -1068,6 +1505,22 @@ |
| histogram_time_load_->AddTime(TimeTicks::Now() - beginning_time); |
| } |
| +void CookieMonster::InvokeQueue() { |
| + while (true) { |
| + scoped_refptr<CookieMonsterTask> request_task; |
| + { |
| + base::AutoLock autolock(lock_); |
| + if (queue_.empty()) { |
| + loaded_ = true; |
| + break; |
| + } |
| + request_task = queue_.front(); |
| + queue_.pop(); |
| + } |
| + request_task->Run(); |
| + } |
| +} |
| + |
| void CookieMonster::EnsureCookiesMapIsValid() { |
| lock_.AssertAcquired(); |
| @@ -1166,7 +1619,7 @@ |
| for (CookieSet::iterator dupes_it = dupes.begin(); |
| dupes_it != dupes.end(); |
| ++dupes_it) { |
| - InternalDeleteCookie(*dupes_it, true /*sync_to_store*/, |
| + InternalDeleteCookie(*dupes_it, true, |
| DELETE_COOKIE_DUPLICATE_IN_BACKING_STORE); |
| } |
| } |
| @@ -1820,7 +2273,7 @@ |
| } |
| // Returns true if |c| occurs in |chars| |
| -// TODO maybe make this take an iterator, could check for end also? |
| +// TODO(erikwright): maybe make this take an iterator, could check for end also? |
| static inline bool CharIsA(const char c, const char* chars) { |
| return strchr(chars, c) != NULL; |
| } |
| @@ -1976,8 +2429,8 @@ |
| std::string::const_iterator start = cookie_line.begin(); |
| std::string::const_iterator it = start; |
| - // TODO Make sure we're stripping \r\n in the network code. Then we |
| - // can log any unexpected terminators. |
| + // TODO(erikwright): Make sure we're stripping \r\n in the network code. |
| + // Then we can log any unexpected terminators. |
| std::string::const_iterator end = FindFirstTerminator(cookie_line); |
| for (int pair_num = 0; pair_num < kMaxPairs && it != end; ++pair_num) { |