Index: net/base/cookie_monster.h |
=================================================================== |
--- net/base/cookie_monster.h (revision 96178) |
+++ net/base/cookie_monster.h (working copy) |
@@ -9,6 +9,7 @@ |
#pragma once |
#include <map> |
+#include <queue> |
#include <string> |
#include <utility> |
#include <vector> |
@@ -27,11 +28,13 @@ |
namespace base { |
class Histogram; |
+class MessageLoopProxy; |
} |
namespace net { |
class CookieList; |
+class CookieMonsterTask; |
// The cookie monster is the system for storing and retrieving cookies. It has |
// an in-memory list of all cookies, and synchronizes non-session cookies to an |
@@ -138,19 +141,20 @@ |
// i.e. it doesn't begin with a leading '.' character. |
static bool DomainIsHostOnly(const std::string& domain_string); |
+ // Helper function that adds all cookies from |cookie_monster| into this |
+ // instance. |
+ bool InitializeFrom(const CookieList& list); |
+ |
+ typedef base::Callback<void(const CookieList& cookies)> GetCookieListCallback; |
+ typedef base::Callback<void(int num_deleted)> DeleteCallback; |
+ typedef SetCookiesCallback DeleteCookieCallback; |
+ |
// Sets a cookie given explicit user-provided cookie attributes. The cookie |
// name, value, domain, etc. are each provided as separate strings. This |
// function expects each attribute to be well-formed. It will check for |
// disallowed characters (e.g. the ';' character is disallowed within the |
// cookie value attribute) and will return false without setting the cookie |
// if such characters are found. |
- bool SetCookieWithDetails(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); |
void SetCookieWithDetailsAsync(const GURL& url, |
const std::string& name, |
const std::string& value, |
@@ -160,17 +164,10 @@ |
bool secure, bool http_only, |
const SetCookiesCallback& callback); |
- |
- // Helper function that adds all cookies from |cookie_monster| into this |
- // instance. |
- bool InitializeFrom(CookieMonster* cookie_monster); |
- |
// Returns all the cookies, for use in management UI, etc. This does not mark |
// the cookies as having been accessed. |
// The returned cookies are ordered by longest path, then by earliest |
// creation date. |
- CookieList GetAllCookies(); |
- typedef base::Callback<void(const CookieList& cookies)> GetCookieListCallback; |
void GetAllCookiesAsync(const GetCookieListCallback& callback); |
// Returns all the cookies, for use in management UI, etc. Filters results |
@@ -178,8 +175,6 @@ |
// mark the cookies as having been accessed. |
// The returned cookies are ordered by longest path, then earliest |
// creation date. |
- CookieList GetAllCookiesForURLWithOptions(const GURL& url, |
- const CookieOptions& options); |
void GetAllCookiesForURLWithOptionsAsync( |
const GURL& url, |
const CookieOptions& options, |
@@ -187,19 +182,16 @@ |
// Invokes GetAllCookiesForURLWithOptions with options set to include HTTP |
// only cookies. |
- CookieList GetAllCookiesForURL(const GURL& url); |
void GetAllCookiesForURLAsync(const GURL& url, |
const GetCookieListCallback& callback); |
// Deletes all of the cookies. |
- int DeleteAll(bool sync_to_store); |
+ void DeleteAllAsync(bool sync_to_store, |
+ const DeleteCallback& callback); |
+ |
// Deletes all of the cookies that have a creation_date greater than or equal |
// to |delete_begin| and less than |delete_end| |
// Returns the number of cookies that have been deleted. |
- int DeleteAllCreatedBetween(const base::Time& delete_begin, |
- const base::Time& delete_end, |
- bool sync_to_store); |
- typedef base::Callback<void(int num_deleted)> DeleteCallback; |
void DeleteAllCreatedBetweenAsync(const base::Time& delete_begin, |
const base::Time& delete_end, |
bool sync_to_store, |
@@ -209,16 +201,10 @@ |
// regardless of path. This includes all http_only and secure cookies, |
// but does not include any domain cookies that may apply to this host. |
// Returns the number of cookies deleted. |
- int DeleteAllForHost(const GURL& url); |
- |
void DeleteAllForHostAsync(const GURL& url, |
const DeleteCallback& callback); |
// Deletes one specific cookie. |
- bool DeleteCanonicalCookie(const CanonicalCookie& cookie); |
- |
- typedef SetCookiesCallback DeleteCookieCallback; |
- |
void DeleteCanonicalCookieAsync(const CanonicalCookie& cookie, |
const DeleteCookieCallback& callback); |
@@ -260,42 +246,31 @@ |
// Sets the cookies specified by |cookie_list| returned from |url| |
// with options |options| in effect. |
- virtual bool SetCookieWithOptions(const GURL& url, |
- const std::string& cookie_line, |
- const CookieOptions& options); |
+ virtual void SetCookieWithOptionsAsync( |
+ const GURL& url, |
+ const std::string& cookie_line, |
+ const CookieOptions& options, |
+ const SetCookiesCallback& callback) OVERRIDE; |
- virtual void SetCookieWithOptionsAsync(const GURL& url, |
- const std::string& cookie_line, |
- const CookieOptions& options, |
- const SetCookiesCallback& callback); |
- |
// Gets all cookies that apply to |url| given |options|. |
// The returned cookies are ordered by longest path, then earliest |
// creation date. |
- virtual std::string GetCookiesWithOptions(const GURL& url, |
- const CookieOptions& options); |
- |
virtual void GetCookiesWithOptionsAsync( |
const GURL& url, |
const CookieOptions& options, |
- const GetCookiesCallback& callback); |
+ const GetCookiesCallback& callback) OVERRIDE; |
- virtual void GetCookiesWithInfo(const GURL& url, |
- const CookieOptions& options, |
- std::string* cookie_line, |
- std::vector<CookieInfo>* cookie_infos); |
+ virtual void GetCookiesWithInfoAsync( |
+ const GURL& url, |
+ const CookieOptions& options, |
+ const GetCookieInfoCallback& callback) OVERRIDE; |
- virtual void GetCookiesWithInfoAsync(const GURL& url, |
- const CookieOptions& options, |
- const GetCookieInfoCallback& callback); |
- |
// Deletes all cookies with that might apply to |url| that has |cookie_name|. |
- virtual void DeleteCookie(const GURL& url, const std::string& cookie_name); |
virtual void DeleteCookieAsync( |
const GURL& url, const std::string& cookie_name, |
- const base::Closure& callback); |
+ const base::Closure& callback) OVERRIDE; |
- virtual CookieMonster* GetCookieMonster(); |
+ virtual CookieMonster* GetCookieMonster() OVERRIDE; |
// Debugging method to perform various validation checks on the map. |
// Currently just checking that there are no null CanonicalCookie pointers |
@@ -309,6 +284,19 @@ |
static const int kDefaultCookieableSchemesCount; |
private: |
+ // For queueing the cookie monater calls. |
erikwright (departed)
2011/08/12 16:00:34
monater -> monster
ycxiao
2011/08/12 17:51:25
Done.
|
+ friend class DeleteAllCreatedBetweenTask; |
+ friend class DeleteAllForHostTask; |
+ friend class DeleteAllTask; |
+ friend class DeleteCookieTask; |
+ friend class DeleteCanonicalCookieTask; |
+ friend class GetAllCookiesForURLWithOptionsTask; |
+ friend class GetAllCookiesTask; |
+ friend class GetCookiesWithOptionsTask; |
+ friend class GetCookiesWithInfoTask; |
+ friend class SetCookieWithDetailsTask; |
+ friend class SetCookieWithOptionsTask; |
+ |
// Testing support. |
// For SetCookieWithCreationTime. |
FRIEND_TEST_ALL_PREFIXES(CookieMonsterTest, |
@@ -397,6 +385,45 @@ |
virtual ~CookieMonster(); |
+ bool SetCookieWithDetails(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); |
+ |
+ CookieList GetAllCookies(); |
+ |
+ CookieList GetAllCookiesForURLWithOptions(const GURL& url, |
+ const CookieOptions& options); |
+ |
+ CookieList GetAllCookiesForURL(const GURL& url); |
+ |
+ int DeleteAll(bool sync_to_store); |
+ |
+ int DeleteAllCreatedBetween(const base::Time& delete_begin, |
+ const base::Time& delete_end, |
+ bool sync_to_store); |
+ |
+ int DeleteAllForHost(const GURL& url); |
+ |
+ bool DeleteCanonicalCookie(const CanonicalCookie& cookie); |
+ |
+ bool SetCookieWithOptions(const GURL& url, |
+ const std::string& cookie_line, |
+ const CookieOptions& options); |
+ |
+ std::string GetCookiesWithOptions(const GURL& url, |
+ const CookieOptions& options); |
+ |
+ void GetCookiesWithInfo(const GURL& url, |
+ const CookieOptions& options, |
+ std::string* cookie_line, |
+ std::vector<CookieInfo>* cookie_infos); |
+ |
+ void DeleteCookie(const GURL& url, const std::string& cookie_name); |
+ |
bool SetCookieWithCreationTime(const GURL& url, |
const std::string& cookie_line, |
const base::Time& creation_time); |
@@ -407,8 +434,11 @@ |
// Note: this method should always be called with lock_ held. |
void InitIfNecessary() { |
if (!initialized_) { |
- if (store_) |
+ if (store_) { |
InitStore(); |
+ } else { |
+ loaded_ = true; |
+ } |
initialized_ = true; |
} |
} |
@@ -417,6 +447,16 @@ |
// Should only be called by InitIfNecessary(). |
void InitStore(); |
+ // Reads the existing cookies loaded form the backing store. |
+ void OnLoaded(const std::vector<CanonicalCookie*>& cookies); |
+ |
+ // Ininitalize the cookies. |
+ void StoreLoadedCookies(const std::vector<CanonicalCookie*>& cookies); |
+ |
+ // Invoke the queueing calls of CookieMonster when loading cookies from |
+ // the back store is complete. |
+ void InvokeQueue(); |
+ |
// Checks that |cookies_| matches our invariants, and tries to repair any |
// inconsistencies. (In other words, it does not have duplicate cookies). |
void EnsureCookiesMapIsValid(); |
@@ -526,6 +566,95 @@ |
// ugly and increment when we've seen the same time twice. |
base::Time CurrentTime(); |
+ // Store the parameters of cookie monster API. |
+ class CookieAPIParameters { |
erikwright (departed)
2011/08/12 16:00:34
Presumably you can now remove CookieAPIParameters?
ycxiao
2011/08/12 17:51:25
Done.
|
+ public: |
+ CookieAPIParameters() |
+ : secure(false), |
+ http_only(false), |
+ sync_to_store(false) { } |
+ |
+ GURL* url; |
+ CookieOptions options; |
+ std::string name; |
+ std::string value; |
+ std::string domain; |
+ std::string path; |
+ std::string cookie_line; |
+ bool secure; |
+ bool http_only; |
+ bool sync_to_store; |
+ base::Time delete_begin; |
+ base::Time delete_end; |
+ base::Time expiration_time; |
+ CanonicalCookie* cookie; |
+ }; |
+ |
+ // Run the cookie request task if cookie loaded, otherwise added the task |
+ // to task queue. |
+ void DoCookieTask(scoped_refptr<CookieMonsterTask> task_item); |
+ |
+ // // Task functions for queueing the coming request. |
+ |
+ // void SetCookieWithDetailsTask( |
+ // const SetCookiesCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void GetAllCookiesTask( |
+ // const GetCookieListCallback& callback, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void GetAllCookiesForURLWithOptionsTask( |
+ // const GetCookieListCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void GetAllCookiesForURLTask( |
+ // const GetCookieListCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void DeleteAllTask( |
+ // const DeleteCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void DeleteAllCreatedBetweenTask( |
+ // const DeleteCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void DeleteAllForHostTask( |
+ // const DeleteCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void DeleteCanonicalCookieTask( |
+ // const DeleteCookieCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void SetCookieWithOptionsTask( |
+ // const SetCookiesCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // // void GetCookiesWithOptionsTask( |
+ // // const GetCookiesCallback& callback, |
+ // // const CookieAPIParameters& para, |
+ // // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void GetCookiesWithInfoTask( |
+ // const GetCookieInfoCallback& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
+ // void DeleteCookieTask( |
+ // const base::Closure& callback, |
+ // const CookieAPIParameters& para, |
+ // scoped_refptr<base::MessageLoopProxy> thread); |
+ |
// Histogram variables; see CookieMonster::InitializeHistograms() in |
// cookie_monster.cc for details. |
base::Histogram* histogram_expiration_duration_minutes_; |
@@ -547,6 +676,14 @@ |
// lazily in InitStoreIfNecessary(). |
bool initialized_; |
+ // Indicates whether loading from the backend store is completed and |
+ // calls may be immediately processed. |
+ bool loaded_; |
+ |
+ // Queues calls to CookieMonster until loading from the backend store is |
+ // completed. |
+ std::queue<base::Closure> queue_; |
+ |
// Indicates whether this cookie monster uses the new effective domain |
// key scheme or not. |
ExpiryAndKeyScheme expiry_and_key_scheme_; |
@@ -617,6 +754,12 @@ |
// Supports the default copy constructor. |
+ // Creates a canonical cookie from parsed cookie. |
+ // Canonicalizes and validates inputs. May return NULL if an attribute |
+ // value is invalid. |
+ static CanonicalCookie* Create(const GURL& url, |
+ const ParsedCookie& pc); |
+ |
// Creates a canonical cookie from unparsed attribute values. |
// Canonicalizes and validates inputs. May return NULL if an attribute |
// value is invalid. |
@@ -855,9 +998,12 @@ |
public: |
virtual ~PersistentCookieStore() {} |
+ typedef base::Callback<void(const std::vector< |
+ CookieMonster::CanonicalCookie*>&)> LoadedCallback; |
+ |
// Initializes the store and retrieves the existing cookies. This will be |
// called only once at startup. |
- virtual bool Load(std::vector<CookieMonster::CanonicalCookie*>* cookies) = 0; |
+ virtual bool Load(const LoadedCallback& loaded_callback) = 0; |
virtual void AddCookie(const CanonicalCookie& cc) = 0; |
virtual void UpdateCookieAccessTime(const CanonicalCookie& cc) = 0; |