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