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,547 @@ |
return (domain_string.empty() || domain_string[0] != '.'); |
} |
+// Task classes for queueing the coming request. |
+ |
+class CookieMonster::CookieMonsterTask |
+ : public base::RefCountedThreadSafe<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() { } |
+ |
+// Unfortunately, one cannot re-bind a Callback with parameters into a closure. |
+// Therefore, the closure passed to InvokeCallback is a clumsy binding of |
+// Callback::Run on a wrapped Callback instance. Since Callback is not |
+// reference counted, we bind to an instance that is a member of the |
+// CookieMonsterTask subclass. Then, we cannot simply post the callback to a |
+// message loop because the underlying instance may be destroyed (along with the |
+// CookieMonsterTask instance) in the interim. Therefore, we post a callback |
+// bound to the CookieMonsterTask, which *is* reference counted (thus preventing |
+// destruction of the original callback), and which invokes the closure (which |
+// invokes the original callback with the returned data). |
+void CookieMonster::CookieMonsterTask::InvokeCallback(base::Closure callback) { |
+ 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()) { |
+ 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 +1122,6 @@ |
if (!HasCookieableScheme(url)) |
return false; |
- InitIfNecessary(); |
- |
Time creation_time = CurrentTime(); |
last_time_seen_ = creation_time; |
@@ -601,17 +1144,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 +1163,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 +1193,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 +1210,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 +1217,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 +1234,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 +1245,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 +1255,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 +1285,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 +1299,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 +1347,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 +1372,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 +1380,6 @@ |
DCHECK(cookie_infos->empty()); |
base::AutoLock autolock(lock_); |
- InitIfNecessary(); |
if (!HasCookieableScheme(url)) |
return; |
@@ -938,22 +1398,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 +1430,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 +1441,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)) { |
@@ -1016,16 +1456,26 @@ |
void CookieMonster::InitStore() { |
DCHECK(store_) << "Store must exist to initialize"; |
- TimeTicks beginning_time(TimeTicks::Now()); |
+ // We bind in the current time so that we can report the wall-clock time for |
+ // loading cookies. |
+ store_->Load(base::Bind(&CookieMonster::OnLoaded, this, TimeTicks::Now())); |
+} |
+void CookieMonster::OnLoaded(TimeTicks beginning_time, |
+ const std::vector<CanonicalCookie*>& cookies) { |
+ StoreLoadedCookies(cookies); |
+ histogram_time_load_->AddTime(TimeTicks::Now() - beginning_time); |
+ |
+ // 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_); |
// 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 |
@@ -1064,8 +1514,22 @@ |
// |
// In particular, the backing store might have given us duplicate cookies. |
EnsureCookiesMapIsValid(); |
+} |
- 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() { |
@@ -1166,7 +1630,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 +2284,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 +2440,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) { |