autofill_xml_parser.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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_XML_PARSER_H_ 6#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_XML_PARSER_H_ 7 8#include <string> 9#include <vector> 10 11#include "base/basictypes.h" 12#include "base/compiler_specific.h" 13#include "base/memory/scoped_ptr.h" 14#include "components/autofill/core/browser/autofill_server_field_info.h" 15#include "components/autofill/core/browser/field_types.h" 16#include "components/autofill/core/browser/form_structure.h" 17#include "third_party/libjingle/source/talk/xmllite/xmlparser.h" 18 19namespace autofill { 20 21struct AutocheckoutPageMetaData; 22 23// The base class that contains common functionality between 24// AutofillQueryXmlParser and AutofillUploadXmlParser. 25class AutofillXmlParser : public buzz::XmlParseHandler { 26 public: 27 AutofillXmlParser(); 28 virtual ~AutofillXmlParser(); 29 30 // Returns true if no parsing errors were encountered. 31 bool succeeded() const { return succeeded_; } 32 33 private: 34 // A callback for the end of an </element>, called by Expat. 35 // |context| is a parsing context used to resolve element/attribute names. 36 // |name| is the name of the element. 37 virtual void EndElement(buzz::XmlParseContext* context, 38 const char* name) OVERRIDE; 39 40 // The callback for character data between tags (<element>text...</element>). 41 // |context| is a parsing context used to resolve element/attribute names. 42 // |text| is a pointer to the beginning of character data (not null 43 // terminated). 44 // |len| is the length of the string pointed to by text. 45 virtual void CharacterData(buzz::XmlParseContext* context, 46 const char* text, 47 int len) OVERRIDE; 48 49 // The callback for parsing errors. 50 // |context| is a parsing context used to resolve names. 51 // |error_code| is a code representing the parsing error. 52 virtual void Error(buzz::XmlParseContext* context, 53 XML_Error error_code) OVERRIDE; 54 55 // True if parsing succeeded. 56 bool succeeded_; 57 58 DISALLOW_COPY_AND_ASSIGN(AutofillXmlParser); 59}; 60 61// The XML parse handler for parsing Autofill query responses. A typical 62// response looks like: 63// 64// <autofillqueryresponse experimentid="1"> 65// <field autofilltype="0" /> 66// <field autofilltype="1" /> 67// <field autofilltype="3" /> 68// <field autofilltype="2" /> 69// </autofillqueryresponse> 70// 71// Fields are returned in the same order they were sent to the server. 72// autofilltype: The server's guess at what type of field this is. 0 73// is unknown, other types are documented in 74// components/autofill/core/browser/field_types.h. 75class AutofillQueryXmlParser : public AutofillXmlParser { 76 public: 77 AutofillQueryXmlParser(std::vector<AutofillServerFieldInfo>* field_infos, 78 UploadRequired* upload_required, 79 std::string* experiment_id, 80 AutocheckoutPageMetaData* page_meta_data); 81 virtual ~AutofillQueryXmlParser(); 82 83 private: 84 // A callback for the beginning of a new <element>, called by Expat. 85 // |context| is a parsing context used to resolve element/attribute names. 86 // |name| is the name of the element. 87 // |attrs| is the list of attributes (names and values) for the element. 88 virtual void StartElement(buzz::XmlParseContext* context, 89 const char* name, 90 const char** attrs) OVERRIDE; 91 92 // A helper function to parse a |WebElementDescriptor|. 93 // |context| is the current parsing context. 94 // |attrs| is the list of attributes (names and values) for the element. 95 // |element_descriptor| will be populated by this function. 96 void ParseElementDescriptor(buzz::XmlParseContext* context, 97 const char* const* attrs, 98 WebElementDescriptor* element_descriptor); 99 100 // A callback for the end of an </element>, called by Expat. 101 // |context| is a parsing context used to resolve element/attribute names. 102 // |name| is the name of the element. 103 virtual void EndElement(buzz::XmlParseContext* context, 104 const char* name) OVERRIDE; 105 106 // The callback for character data between tags (<element>text...</element>). 107 // |context| is a parsing context used to resolve element/attribute names. 108 // |text| is a pointer to the beginning of character data (not null 109 // terminated). 110 // |len| is the length of the string pointed to by text. 111 virtual void CharacterData(buzz::XmlParseContext* context, 112 const char* text, 113 int len) OVERRIDE; 114 115 // A helper function to retrieve integer values from strings. Raises an 116 // XML parse error if it fails. 117 // |context| is the current parsing context. 118 // |value| is the string to convert. 119 int GetIntValue(buzz::XmlParseContext* context, const char* attribute); 120 121 // The parsed <field type, default value> pairs. 122 std::vector<AutofillServerFieldInfo>* field_infos_; 123 124 // A flag indicating whether the client should upload Autofill data when this 125 // form is submitted. 126 UploadRequired* upload_required_; 127 128 // The server experiment to which this query response belongs. 129 // For the default server implementation, this is empty. 130 std::string* experiment_id_; 131 132 // Page metadata for multipage autofill flow. 133 AutocheckoutPageMetaData* page_meta_data_; 134 135 // The click element the parser is currently processing. 136 WebElementDescriptor* current_click_element_; 137 138 // Number of page whose type is currently being parsed. 139 int current_page_number_for_page_types_; 140 141 // Whether the instance is currently parsing inside 'type' tags. 142 bool is_in_type_section_; 143 144 DISALLOW_COPY_AND_ASSIGN(AutofillQueryXmlParser); 145}; 146 147// The XML parser for handling Autofill upload responses. Typical upload 148// responses look like: 149// 150// <autofilluploadresponse negativeuploadrate="0.00125" positiveuploadrate="1"/> 151// 152// The positive upload rate is the percentage of uploads to send to the server 153// when something in the users profile matches what they have entered in a form. 154// The negative upload rate is the percentage of uploads to send when nothing in 155// the form matches what's in the users profile. 156// The negative upload rate is typically much lower than the positive upload 157// rate. 158class AutofillUploadXmlParser : public AutofillXmlParser { 159 public: 160 AutofillUploadXmlParser(double* positive_upload_rate, 161 double* negative_upload_rate); 162 163 private: 164 // A callback for the beginning of a new <element>, called by Expat. 165 // |context| is a parsing context used to resolve element/attribute names. 166 // |name| is the name of the element. 167 // |attrs| is the list of attributes (names and values) for the element. 168 virtual void StartElement(buzz::XmlParseContext* context, 169 const char* name, 170 const char** attrs) OVERRIDE; 171 172 // A helper function to retrieve double values from strings. Raises an XML 173 // parse error if it fails. 174 // |context| is the current parsing context. 175 // |value| is the string to convert. 176 double GetDoubleValue(buzz::XmlParseContext* context, const char* attribute); 177 178 // True if parsing succeeded. 179 bool succeeded_; 180 181 double* positive_upload_rate_; 182 double* negative_upload_rate_; 183 184 DISALLOW_COPY_AND_ASSIGN(AutofillUploadXmlParser); 185}; 186 187} // namespace autofill 188 189#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_XML_PARSER_H_ 190