1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_AUTOFILL_FORM_STRUCTURE_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOFILL_FORM_STRUCTURE_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_field.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_type.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/field_types.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/form_data.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace buzz { 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class XmlElement; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace buzz 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum RequestMethod { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GET, 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch POST 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum UploadRequired { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UPLOAD_NOT_REQUIRED, 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UPLOAD_REQUIRED, 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch USE_UPLOAD_RATES 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass AutofillMetrics; 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// FormStructure stores a single HTML form together with the values entered 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// in the fields along with additional information needed by Autofill. 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FormStructure { 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit FormStructure(const webkit_glue::FormData& form); 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual ~FormStructure(); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Runs several heuristics against the form fields to determine their possible 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // types. 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void DetermineHeuristicTypes(); 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Encodes the XML upload request from this FormStructure. 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool EncodeUploadRequest(bool autofill_used, std::string* encoded_xml) const; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Encodes the XML query request for the set of forms. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // All fields are returned in one XML. For example, there are three forms, 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // with 2, 4, and 3 fields. The returned XML would have type info for 9 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // fields, first two of which would be for the first form, next 4 for the 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // second, and the rest is for the third. 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool EncodeQueryRequest(const ScopedVector<FormStructure>& forms, 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<std::string>* encoded_signatures, 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string* encoded_xml); 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Parses the field types from the server query response. |forms| must be the 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // same as the one passed to EncodeQueryRequest when constructing the query. 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ParseQueryResponse(const std::string& response_xml, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<FormStructure*>& forms, 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen UploadRequired* upload_required, 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillMetrics& metric_logger); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The unique signature for this form, composed of the target url domain, 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the form name, and the form field names in a 64-bit hash. 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string FormSignature() const; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Runs a quick heuristic to rule out forms that are obviously not 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // auto-fillable, like google/yahoo/msn search, etc. The requirement that the 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // form's method be POST is only applied if |require_method_post| is true. 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsAutofillable(bool require_method_post) const; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Resets |autofill_count_| and counts the number of auto-fillable fields. 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is used when we receive server data for form fields. At that time, 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we may have more known fields than just the number of fields we matched 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // heuristically. 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateAutofillCount(); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if this form matches the structural requirements for Autofill. 824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The requirement that the form's method be POST is only applied if 834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // |require_method_post| is true. 844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool ShouldBeParsed(bool require_method_post) const; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Sets the field types and experiment id to be those set for |cached_form|. 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateFromCache(const FormStructure& cached_form); 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Logs quality metrics for |this|, which should be a user-submitted form. 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This method should only be called after the possible field types have been 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // set for each field. 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void LogQualityMetrics(const AutofillMetrics& metric_logger) const; 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the possible types for the field at |index|. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_possible_types(int index, const FieldTypeSet& types); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillField* field(int index) const; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t field_count() const; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the number of fields that are able to be autofilled. 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t autofill_count() const { return autofill_count_; } 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used for iterating over the fields. 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<AutofillField*>::const_iterator begin() const { 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return fields_.begin(); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<AutofillField*>::const_iterator end() const { 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return fields_.end(); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& source_url() const { return source_url_; } 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual std::string server_experiment_id() const; 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool operator==(const webkit_glue::FormData& form) const; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool operator!=(const webkit_glue::FormData& form) const; 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected: 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // For tests. 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ScopedVector<AutofillField>* fields() { return &fields_; } 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen friend class FormStructureTest; 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // 64-bit hash of the string - used in FormSignature and unit-tests. 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static std::string Hash64Bit(const std::string& str); 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum EncodeRequestType { 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QUERY, 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UPLOAD, 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Associates the field with the heuristic type for each of the field views. 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetHeuristicFieldInfo(FieldTypeMap* field_types_map); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds form info to |encompassing_xml_element|. |request_type| indicates if 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it is a query or upload. 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool EncodeFormRequest(EncodeRequestType request_type, 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch buzz::XmlElement* encompassing_xml_element) const; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Helper for EncodeUploadRequest() that collects presense of all data in the 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // form structure and converts it to string for uploading. 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string ConvertPresenceBitsToString() const; 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The name of the form. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 form_name_; 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The source URL. 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL source_url_; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The target URL. 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL target_url_; 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_credit_card_field_; 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_autofillable_field_; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_password_fields_; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The number of fields able to be auto-filled. 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t autofill_count_; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A vector of all the input fields in the form. The vector is terminated by 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // a NULL entry. 162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ScopedVector<AutofillField> fields_; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The names of the form input elements, that are part of the form signature. 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The string starts with "&" and the names are also separated by the "&" 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // character. E.g.: "&form_input1_name&form_input2_name&...&form_inputN_name" 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string form_signature_field_names_; 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The server experiment corresponding to the server types returned for this 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // form. 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string server_experiment_id_; 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // GET or POST. 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RequestMethod method_; 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(FormStructure); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_AUTOFILL_FORM_STRUCTURE_H_ 180