Integration with Toolbar autofill servers.
Still to do:
  1. Update upload rates based on response
  2. Differentiate autofilled/not uploads
  3. Do not query if there is no items in autofill
  4. Fix forms to correspond to the data queried by toolbar
BUG=none
TEST=Should request data from toolbar servers
Review URL: http://codereview.chromium.org/1119004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@42260 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/autofill/autofill_download.h b/chrome/browser/autofill/autofill_download.h
new file mode 100644
index 0000000..c9e6ed2
--- /dev/null
+++ b/chrome/browser/autofill/autofill_download.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_AUTOFILL_AUTOFILL_DOWNLOAD_H_
+#define CHROME_BROWSER_AUTOFILL_AUTOFILL_DOWNLOAD_H_
+
+#include <map>
+#include <string>
+
+#include "base/scoped_ptr.h"
+#include "base/scoped_vector.h"
+#include "base/string16.h"
+#include "chrome/browser/autofill/autofill_profile.h"
+#include "chrome/browser/autofill/field_types.h"
+#include "chrome/browser/autofill/form_structure.h"
+#include "chrome/browser/net/url_fetcher.h"
+
+// Handles getting and updating AutoFill heuristics.
+class AutoFillDownloadManager : public URLFetcher::Delegate {
+ public:
+  // An interface used to notify clients of AutoFillDownloadManager.
+  class Observer {
+   public:
+    // Called when heuristic successfully received from server.
+    // |form_signature| - the signature of the requesting form.
+    // |heuristic_xml| - server response.
+    virtual void OnLoadedAutoFillHeuristics(
+        const std::string& form_signature,
+        const std::string& heuristic_xml) = 0;
+    // Called when heuristic either successfully considered for upload and
+    // not send or uploaded.
+    // |form_signature| - the signature of the requesting form.
+    virtual void OnUploadedAutoFillHeuristics(
+        const std::string& form_signature) = 0;
+    // Called when there was an error during the request.
+    // |form_signature| - the signature of the requesting form.
+    // |http_error| - http error code.
+    virtual void OnHeuristicsRequestError(const std::string& form_signature,
+                                          int http_error) = 0;
+   protected:
+    virtual ~Observer() {}
+  };
+
+  AutoFillDownloadManager();
+  virtual ~AutoFillDownloadManager();
+
+  // |observer| - observer to notify on successful completion or error.
+  void SetObserver(AutoFillDownloadManager::Observer *observer);
+
+  // Initiates request to AutoFill servers to download/upload heuristics
+  // |form_xml| - form structure XML to upload/download.
+  // |form_signature| - form signature hash.
+  // |query_data| - if true the data is queried and observer notified with new
+  // data, if available. If false heuristic data is uploaded to our servers.
+  // |form_was_matched| - if |query_data| is false indicates if the form was
+  // matched. Ignored otherwise.
+  bool StartRequest(const std::string& form_xml,
+                    const std::string& form_signature,
+                    bool query_data,
+                    bool form_was_matched);
+
+  bool CancelRequest(const std::string& form_signature, bool query_data);
+
+ protected:
+  // URLFetcher::Delegate implementation:
+  virtual void OnURLFetchComplete(const URLFetcher* source,
+                                  const GURL& url,
+                                  const URLRequestStatus& status,
+                                  int response_code,
+                                  const ResponseCookies& cookies,
+                                  const std::string& data);
+
+ private:
+  struct FormRequestData {
+    std::string form_signature;
+    bool query;
+  };
+
+  // For each requested form for both query and upload we create a separate
+  // request and save its info. As url fetcher is identified by its address
+  // we use a map between fetchers and info.
+  std::map<URLFetcher *, FormRequestData> url_fetchers_;
+  AutoFillDownloadManager::Observer *observer_;
+};
+
+#endif  // CHROME_BROWSER_AUTOFILL_AUTOFILL_DOWNLOAD_H_
+