1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_DOWNLOAD_H_ 6 #define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_DOWNLOAD_H_ 7 8 #include <stddef.h> 9 #include <list> 10 #include <map> 11 #include <string> 12 #include <utility> 13 #include <vector> 14 15 #include "base/compiler_specific.h" 16 #include "base/gtest_prod_util.h" 17 #include "base/time/time.h" 18 #include "components/autofill/core/browser/autofill_type.h" 19 #include "net/url_request/url_fetcher_delegate.h" 20 21 class PrefService; 22 23 namespace net { 24 class URLFetcher; 25 } // namespace net 26 27 namespace autofill { 28 29 class AutofillDriver; 30 class AutofillMetrics; 31 class FormStructure; 32 33 // Handles getting and updating Autofill heuristics. 34 class AutofillDownloadManager : public net::URLFetcherDelegate { 35 public: 36 enum RequestType { REQUEST_QUERY, REQUEST_UPLOAD, }; 37 38 // An interface used to notify clients of AutofillDownloadManager. 39 class Observer { 40 public: 41 // Called when field type predictions are successfully received from the 42 // server. |response_xml| contains the server response. 43 virtual void OnLoadedServerPredictions(const std::string& response_xml) = 0; 44 45 // These notifications are used to help with testing. 46 // Called when heuristic either successfully considered for upload and 47 // not send or uploaded. OnUploadedPossibleFieldTypes()48 virtual void OnUploadedPossibleFieldTypes() {} 49 // Called when there was an error during the request. 50 // |form_signature| - the signature of the requesting form. 51 // |request_type| - type of request that failed. 52 // |http_error| - HTTP error code. OnServerRequestError(const std::string & form_signature,RequestType request_type,int http_error)53 virtual void OnServerRequestError(const std::string& form_signature, 54 RequestType request_type, 55 int http_error) {} 56 57 protected: ~Observer()58 virtual ~Observer() {} 59 }; 60 61 // |driver| and |pref_service| must outlive this instance. 62 // |observer| - observer to notify on successful completion or error. 63 AutofillDownloadManager(AutofillDriver* driver, 64 PrefService* pref_service, 65 Observer* observer); 66 virtual ~AutofillDownloadManager(); 67 68 // Starts a query request to Autofill servers. The observer is called with the 69 // list of the fields of all requested forms. 70 // |forms| - array of forms aggregated in this request. 71 bool StartQueryRequest(const std::vector<FormStructure*>& forms, 72 const AutofillMetrics& metric_logger); 73 74 // Starts an upload request for the given |form|, unless throttled by the 75 // server. The probability of the request going over the wire is 76 // GetPositiveUploadRate() if |form_was_autofilled| is true, or 77 // GetNegativeUploadRate() otherwise. The observer will be called even if 78 // there was no actual trip over the wire. 79 // |available_field_types| should contain the types for which we have data 80 // stored on the local client. 81 bool StartUploadRequest(const FormStructure& form, 82 bool form_was_autofilled, 83 const ServerFieldTypeSet& available_field_types); 84 85 private: 86 friend class AutofillDownloadTest; 87 FRIEND_TEST_ALL_PREFIXES(AutofillDownloadTest, QueryAndUploadTest); 88 89 struct FormRequestData; 90 typedef std::list<std::pair<std::string, std::string> > QueryRequestCache; 91 92 // Initiates request to Autofill servers to download/upload heuristics. 93 // |form_xml| - form structure XML to upload/download. 94 // |request_data| - form signature hash(es) and indicator if it was a query. 95 // |request_data.query| - if true the data is queried and observer notified 96 // with new data, if available. If false heuristic data is uploaded to our 97 // servers. 98 bool StartRequest(const std::string& form_xml, 99 const FormRequestData& request_data); 100 101 // Each request is page visited. We store last |max_form_cache_size| 102 // request, to avoid going over the wire. Set to 16 in constructor. Warning: 103 // the search is linear (newest first), so do not make the constant very big. set_max_form_cache_size(size_t max_form_cache_size)104 void set_max_form_cache_size(size_t max_form_cache_size) { 105 max_form_cache_size_ = max_form_cache_size; 106 } 107 108 // Caches query request. |forms_in_query| is a vector of form signatures in 109 // the query. |query_data| is the successful data returned over the wire. 110 void CacheQueryRequest(const std::vector<std::string>& forms_in_query, 111 const std::string& query_data); 112 // Returns true if query is in the cache, while filling |query_data|, false 113 // otherwise. |forms_in_query| is a vector of form signatures in the query. 114 bool CheckCacheForQueryRequest(const std::vector<std::string>& forms_in_query, 115 std::string* query_data) const; 116 // Concatenates |forms_in_query| into one signature. 117 std::string GetCombinedSignature( 118 const std::vector<std::string>& forms_in_query) const; 119 120 // net::URLFetcherDelegate implementation: 121 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 122 123 // Probability of the form upload. Between 0 (no upload) and 1 (upload all). 124 // GetPositiveUploadRate() is for matched forms, 125 // GetNegativeUploadRate() for non-matched. 126 double GetPositiveUploadRate() const; 127 double GetNegativeUploadRate() const; 128 void SetPositiveUploadRate(double rate); 129 void SetNegativeUploadRate(double rate); 130 131 // The AutofillDriver that this instance will use. Must not be null, and must 132 // outlive this instance. 133 AutofillDriver* const driver_; // WEAK 134 135 // The PrefService that this instance will use. Must not be null, and must 136 // outlive this instance. 137 PrefService* const pref_service_; // WEAK 138 139 // The observer to notify when server predictions are successfully received. 140 // Must not be null. 141 AutofillDownloadManager::Observer* const observer_; // WEAK 142 143 // For each requested form for both query and upload we create a separate 144 // request and save its info. As url fetcher is identified by its address 145 // we use a map between fetchers and info. 146 std::map<net::URLFetcher*, FormRequestData> url_fetchers_; 147 148 // Cached QUERY requests. 149 QueryRequestCache cached_forms_; 150 size_t max_form_cache_size_; 151 152 // Time when next query/upload requests are allowed. If 50x HTTP received, 153 // exponential back off is initiated, so this times will be in the future 154 // for awhile. 155 base::Time next_query_request_; 156 base::Time next_upload_request_; 157 158 // |positive_upload_rate_| is for matched forms, 159 // |negative_upload_rate_| for non matched. 160 double positive_upload_rate_; 161 double negative_upload_rate_; 162 163 // Needed for unit-test. 164 int fetcher_id_for_unittest_; 165 }; 166 167 } // namespace autofill 168 169 #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_DOWNLOAD_H_ 170