Promote GetAllCookiesAsync from CookieMonster to CookieStore.
This means that more classes can just use the CookieStore interface,
rather than depending on a particular implementation of it.
BUG=579653
Review URL: https://codereview.chromium.org/1618943002
Cr-Commit-Position: refs/heads/master@{#371080}
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm
index a7d20d77..ee12b25 100644
--- a/ios/net/cookies/cookie_store_ios.mm
+++ b/ios/net/cookies/cookie_store_ios.mm
@@ -210,6 +210,15 @@
return [cookies sortedArrayUsingFunction:CompareCookies context:manager];
}
+// Gets all cookies from the system cookie store.
+NSArray* GetAllCookies(NSHTTPCookieStorage* system_store,
+ CookieCreationTimeManager* manager) {
+ NSArray* cookies = [system_store cookies];
+
+ // Sort cookies by decreasing path length, then creation time, as per RFC6265.
+ return [cookies sortedArrayUsingFunction:CompareCookies context:manager];
+}
+
// Builds a cookie line (such as "key1=value1; key2=value2") from an array of
// cookies.
std::string BuildCookieLine(NSArray* cookies,
@@ -475,18 +484,44 @@
NSArray* cookies = GetCookiesForURL(system_store_,
url, creation_time_manager_.get());
- net::CookieList cookie_list;
- cookie_list.reserve([cookies count]);
- for (NSHTTPCookie* cookie in cookies) {
- base::Time created = creation_time_manager_->GetCreationTime(cookie);
- cookie_list.push_back(CanonicalCookieFromSystemCookie(cookie, created));
- }
+ net::CookieList cookie_list = CanonicalCookieListFromSystemCookies(
+ cookies);
if (!callback.is_null())
callback.Run(cookie_list);
break;
}
}
+void CookieStoreIOS::GetAllCookiesAsync(const GetCookieListCallback& callback) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+
+ switch (synchronization_state_) {
+ case NOT_SYNCHRONIZED:
+ cookie_monster_->GetAllCookiesAsync(callback);
+ break;
+ case SYNCHRONIZING:
+ tasks_pending_synchronization_.push_back(base::Bind(
+ &CookieStoreIOS::GetAllCookiesAsync, this, callback));
+ break;
+ case SYNCHRONIZED:
+ if (!SystemCookiesAllowed()) {
+ // If cookies are not allowed, the cookies are stashed in the
+ // CookieMonster, so get them from there.
+ cookie_monster_->GetAllCookiesAsync(callback);
+ return;
+ }
+
+ NSArray* cookies = GetAllCookies(system_store_,
+ creation_time_manager_.get());
+ net::CookieList cookie_list = CanonicalCookieListFromSystemCookies(
+ cookies);
+ if (!callback.is_null()) {
+ callback.Run(cookie_list);
+ }
+ break;
+ }
+}
+
void CookieStoreIOS::DeleteCookieAsync(const GURL& url,
const std::string& cookie_name,
const base::Closure& callback) {
@@ -990,6 +1025,17 @@
callback.Run();
}
+net::CookieList
+CookieStoreIOS::CanonicalCookieListFromSystemCookies(NSArray* cookies) {
+ net::CookieList cookie_list;
+ cookie_list.reserve([cookies count]);
+ for (NSHTTPCookie* cookie in cookies) {
+ base::Time created = creation_time_manager_->GetCreationTime(cookie);
+ cookie_list.push_back(CanonicalCookieFromSystemCookie(cookie, created));
+ }
+ return cookie_list;
+}
+
CookieStoreIOS::SetCookiesCallback CookieStoreIOS::WrapSetCallback(
const SetCookiesCallback& callback) {
DCHECK(thread_checker_.CalledOnValidThread());