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