| Index: net/base/cookie_monster.h | 
| =================================================================== | 
| --- net/base/cookie_monster.h	(revision 100345) | 
| +++ net/base/cookie_monster.h	(working copy) | 
| @@ -9,6 +9,7 @@ | 
| #pragma once | 
|  | 
| #include <map> | 
| +#include <queue> | 
| #include <string> | 
| #include <utility> | 
| #include <vector> | 
| @@ -27,6 +28,7 @@ | 
|  | 
| namespace base { | 
| class Histogram; | 
| +class TimeTicks; | 
| } | 
|  | 
| namespace net { | 
| @@ -138,19 +140,19 @@ | 
| // 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 |list| 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 base::Callback<void(bool)> 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, | 
| @@ -161,16 +163,10 @@ | 
| const SetCookiesCallback& callback); | 
|  | 
|  | 
| -  // Helper function that adds all cookies from |cookie_monster| into this | 
| -  // instance. | 
| -  bool InitializeFrom(const CookieList& list); | 
| - | 
| // 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 +174,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,38 +181,27 @@ | 
|  | 
| // 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(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, | 
| const DeleteCallback& callback); | 
|  | 
| // Deletes all cookies that match the host of the given URL | 
| // 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 +243,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 +281,20 @@ | 
| static const int kDefaultCookieableSchemesCount; | 
|  | 
| private: | 
| +  // For queueing the cookie monster calls. | 
| +  class CookieMonsterTask; | 
| +  class DeleteAllCreatedBetweenTask; | 
| +  class DeleteAllForHostTask; | 
| +  class DeleteAllTask; | 
| +  class DeleteCookieTask; | 
| +  class DeleteCanonicalCookieTask; | 
| +  class GetAllCookiesForURLWithOptionsTask; | 
| +  class GetAllCookiesTask; | 
| +  class GetCookiesWithOptionsTask; | 
| +  class GetCookiesWithInfoTask; | 
| +  class SetCookieWithDetailsTask; | 
| +  class SetCookieWithOptionsTask; | 
| + | 
| // Testing support. | 
| // For SetCookieWithCreationTime. | 
| FRIEND_TEST_ALL_PREFIXES(CookieMonsterTest, | 
| @@ -397,6 +383,47 @@ | 
|  | 
| virtual ~CookieMonster(); | 
|  | 
| +  // The following are synchronous calls to which the asynchronous methods | 
| +  // delegate either immediately (if the store is loaded) or through a deferred | 
| +  // task (if the store is not yet loaded). | 
| +  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); | 
| + | 
| +  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,18 @@ | 
| // Should only be called by InitIfNecessary(). | 
| void InitStore(); | 
|  | 
| +  // Stores cookies loaded from the backing store and invokes any deferred | 
| +  // calls. |beginning_time| should be the moment PersistentCookieStore::Load | 
| +  // was invoked and is used for reporting histogram_time_load_. | 
| +  void OnLoaded(base::TimeTicks beginning_time, | 
| +                const std::vector<CanonicalCookie*>& cookies); | 
| + | 
| +  // Stores the loaded cookies. | 
| +  void StoreLoadedCookies(const std::vector<CanonicalCookie*>& cookies); | 
| + | 
| +  // Invokes deferred calls. | 
| +  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 +568,10 @@ | 
| // ugly and increment when we've seen the same time twice. | 
| base::Time CurrentTime(); | 
|  | 
| +  // Run the cookie request task if cookie loaded, otherwise added the task | 
| +  // to task queue. | 
| +  void DoCookieTask(const scoped_refptr<CookieMonsterTask>& task_item); | 
| + | 
| // Histogram variables; see CookieMonster::InitializeHistograms() in | 
| // cookie_monster.cc for details. | 
| base::Histogram* histogram_expiration_duration_minutes_; | 
| @@ -547,6 +593,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<scoped_refptr<CookieMonsterTask> > queue_; | 
| + | 
| // Indicates whether this cookie monster uses the new effective domain | 
| // key scheme or not. | 
| ExpiryAndKeyScheme expiry_and_key_scheme_; | 
| @@ -861,9 +915,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; | 
|  |