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());