1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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_AUTOFILL_XML_PARSER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOFILL_AUTOFILL_XML_PARSER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/field_types.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/form_structure.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/expat/files/lib/expat.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/libjingle/source/talk/xmllite/xmlparser.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The base class that contains common functionality between
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// AutofillQueryXmlParser and AutofillUploadXmlParser.
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutofillXmlParser : public buzz::XmlParseHandler {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutofillXmlParser();
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if no parsing errors were encountered.
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool succeeded() const { return succeeded_; }
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A callback for the end of an </element>, called by Expat.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |context| is a parsing context used to resolve element/attribute names.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |name| is the name of the element.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EndElement(buzz::XmlParseContext* context, const char* name);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The callback for character data between tags (<element>text...</element>).
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |context| is a parsing context used to resolve element/attribute names.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |text| is a pointer to the beginning of character data (not null
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // terminated).
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |len| is the length of the string pointed to by text.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CharacterData(buzz::XmlParseContext* context, const char* text,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             int len);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The callback for parsing errors.
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |context| is a parsing context used to resolve names.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |error_code| is a code representing the parsing error.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Error(buzz::XmlParseContext* context, XML_Error error_code);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if parsing succeeded.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool succeeded_;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(AutofillXmlParser);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The XML parse handler for parsing Autofill query responses.  A typical
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// response looks like:
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// <autofillqueryresponse experimentid="1">
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   <field autofilltype="0" />
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   <field autofilltype="1" />
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   <field autofilltype="3" />
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   <field autofilltype="2" />
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// </autofillqueryresponse>
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Fields are returned in the same order they were sent to the server.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// autofilltype: The server's guess at what type of field this is.  0 is
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// unknown, other types are documented in chrome/browser/autofill/field_types.h.
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutofillQueryXmlParser : public AutofillXmlParser {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutofillQueryXmlParser(std::vector<AutofillFieldType>* field_types,
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                         UploadRequired* upload_required,
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                         std::string* experiment_id);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A callback for the beginning of a new <element>, called by Expat.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |context| is a parsing context used to resolve element/attribute names.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |name| is the name of the element.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |attrs| is the list of attributes (names and values) for the element.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartElement(buzz::XmlParseContext* context, const char* name,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const char** attrs);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A helper function to retrieve integer values from strings.  Raises an
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // XML parse error if it fails.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |context| is the current parsing context.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |value| is the string to convert.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetIntValue(buzz::XmlParseContext* context, const char* attribute);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The parsed field types.
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<AutofillFieldType>* field_types_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A flag indicating whether the client should upload Autofill data when this
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // form is submitted.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UploadRequired* upload_required_;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The server experiment to which this query response belongs.
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // For the default server implementation, this is empty.
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string* experiment_id_;
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(AutofillQueryXmlParser);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The XML parser for handling Autofill upload responses.  Typical upload
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// responses look like:
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// <autofilluploadresponse negativeuploadrate="0.00125" positiveuploadrate="1"/>
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The positive upload rate is the percentage of uploads to send to the server
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// when something in the users profile matches what they have entered in a form.
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The negative upload rate is the percentage of uploads to send when nothing in
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the form matches what's in the users profile.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The negative upload rate is typically much lower than the positive upload
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// rate.
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutofillUploadXmlParser : public AutofillXmlParser {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutofillUploadXmlParser(double* positive_upload_rate,
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          double* negative_upload_rate);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A callback for the beginning of a new <element>, called by Expat.
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |context| is a parsing context used to resolve element/attribute names.
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |name| is the name of the element.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |attrs| is the list of attributes (names and values) for the element.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartElement(buzz::XmlParseContext* context, const char* name,
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const char** attrs);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A helper function to retrieve double values from strings.  Raises an XML
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // parse error if it fails.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |context| is the current parsing context.
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |value| is the string to convert.
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  double GetDoubleValue(buzz::XmlParseContext* context, const char* attribute);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if parsing succeeded.
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool succeeded_;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  double* positive_upload_rate_;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  double* negative_upload_rate_;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(AutofillUploadXmlParser);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_AUTOFILL_AUTOFILL_XML_PARSER_H_
139