Move remaining Autofill code to //components/autofill.

This leaves behind all browser tests, the AutofillCCInfobarDelegate
and PersonalDataManagerFactory, which remain Chrome-specific.

All source files were moved using //tools/git/move_source_file.py,
which updates includes of moved files, sorts include order, and
updates header guards.

The only manual bits of this change were:
- Move .proto file
- Move .cc.utf8 file
- Update .gypi files
- Update DEPS files
- Remove an unnecessary include from autofill_manager.cc

[email protected]
BUG=140037


Review URL: https://chromiumcodereview.appspot.com/12434004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187173 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/components/autofill/browser/autofill_xml_parser.cc b/components/autofill/browser/autofill_xml_parser.cc
new file mode 100644
index 0000000..a4e5a3d
--- /dev/null
+++ b/components/autofill/browser/autofill_xml_parser.cc
@@ -0,0 +1,197 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/browser/autofill_xml_parser.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "base/logging.h"
+#include "components/autofill/browser/autofill_server_field_info.h"
+#include "third_party/libjingle/source/talk/xmllite/qname.h"
+
+AutofillXmlParser::AutofillXmlParser()
+    : succeeded_(true) {
+}
+
+AutofillXmlParser::~AutofillXmlParser() {}
+
+void AutofillXmlParser::CharacterData(
+    buzz::XmlParseContext* context, const char* text, int len) {
+}
+
+void AutofillXmlParser::EndElement(buzz::XmlParseContext* context,
+                                   const char* name) {
+}
+
+void AutofillXmlParser::Error(buzz::XmlParseContext* context,
+                              XML_Error error_code) {
+  succeeded_ = false;
+}
+
+AutofillQueryXmlParser::AutofillQueryXmlParser(
+    std::vector<AutofillServerFieldInfo>* field_infos,
+    UploadRequired* upload_required,
+    std::string* experiment_id)
+    : field_infos_(field_infos),
+      upload_required_(upload_required),
+      current_page_number_(-1),
+      total_pages_(-1),
+      experiment_id_(experiment_id) {
+  DCHECK(upload_required_);
+  DCHECK(experiment_id_);
+}
+
+AutofillQueryXmlParser::~AutofillQueryXmlParser() {}
+
+void AutofillQueryXmlParser::StartElement(buzz::XmlParseContext* context,
+                                          const char* name,
+                                          const char** attrs) {
+  buzz::QName qname = context->ResolveQName(name, false);
+  const std::string& element = qname.LocalPart();
+  if (element.compare("autofillqueryresponse") == 0) {
+    // We check for the upload required attribute below, but if it's not
+    // present, we use the default upload rates. Likewise, by default we assume
+    // an empty experiment id.
+    *upload_required_ = USE_UPLOAD_RATES;
+    *experiment_id_ = std::string();
+
+    // |attrs| is a NULL-terminated list of (attribute, value) pairs.
+    while (*attrs) {
+      buzz::QName attribute_qname = context->ResolveQName(*attrs, true);
+      ++attrs;
+      const std::string& attribute_name = attribute_qname.LocalPart();
+      if (attribute_name.compare("uploadrequired") == 0) {
+        if (strcmp(*attrs, "true") == 0)
+          *upload_required_ = UPLOAD_REQUIRED;
+        else if (strcmp(*attrs, "false") == 0)
+          *upload_required_ = UPLOAD_NOT_REQUIRED;
+      } else if (attribute_name.compare("experimentid") == 0) {
+        *experiment_id_ = *attrs;
+      }
+      ++attrs;
+    }
+  } else if (element.compare("field") == 0) {
+    if (!*attrs) {
+      // Missing the "autofilltype" attribute, abort.
+      context->RaiseError(XML_ERROR_ABORTED);
+      return;
+    }
+
+    // Determine the field type from the attribute value.  There should be one
+    // attribute (autofilltype) with an integer value.
+    AutofillServerFieldInfo field_info;
+    field_info.field_type = UNKNOWN_TYPE;
+
+    // |attrs| is a NULL-terminated list of (attribute, value) pairs.
+    while (*attrs) {
+      buzz::QName attribute_qname = context->ResolveQName(*attrs, true);
+      ++attrs;
+      const std::string& attribute_name = attribute_qname.LocalPart();
+      if (attribute_name.compare("autofilltype") == 0) {
+        int value = GetIntValue(context, *attrs);
+        if (value >= 0 && value < MAX_VALID_FIELD_TYPE)
+          field_info.field_type = static_cast<AutofillFieldType>(value);
+        else
+          field_info.field_type = NO_SERVER_DATA;
+      } else if (field_info.field_type == FIELD_WITH_DEFAULT_VALUE &&
+                 attribute_name.compare("defaultvalue") == 0) {
+        field_info.default_value = *attrs;
+      }
+      ++attrs;
+    }
+
+    // Record this field type, default value pair.
+    field_infos_->push_back(field_info);
+  } else if (element.compare("autofill_flow") == 0) {
+    // |attrs| is a NULL-terminated list of (attribute, value) pairs.
+    while (*attrs) {
+      buzz::QName attribute_qname = context->ResolveQName(*attrs, true);
+      ++attrs;
+      const std::string& attribute_name = attribute_qname.LocalPart();
+      if (attribute_name.compare("page_no") == 0)
+        current_page_number_ = GetIntValue(context, *attrs);
+      else if (attribute_name.compare("total_pages") == 0)
+        total_pages_ = GetIntValue(context, *attrs);
+      ++attrs;
+    }
+  } else if (element.compare("page_advance_button") == 0) {
+    // |attrs| is a NULL-terminated list of (attribute, value) pairs.
+    // If both id and css_selector are set, the first one to appear will take
+    // precedence.
+    while (*attrs) {
+      buzz::QName attribute_qname = context->ResolveQName(*attrs, true);
+      ++attrs;
+      const std::string& attribute_name = attribute_qname.LocalPart();
+      buzz::QName value_qname = context->ResolveQName(*attrs, true);
+      ++attrs;
+      const std::string& attribute_value = value_qname.LocalPart();
+      if (attribute_name.compare("id") == 0 && !attribute_value.empty()) {
+        proceed_element_descriptor_.reset(new autofill::WebElementDescriptor());
+        proceed_element_descriptor_->retrieval_method =
+            autofill::WebElementDescriptor::ID;
+        proceed_element_descriptor_->descriptor = attribute_value;
+        break;
+      } else if (attribute_name.compare("css_selector") == 0 &&
+                 !attribute_value.empty()) {
+        proceed_element_descriptor_.reset(new autofill::WebElementDescriptor());
+        proceed_element_descriptor_->retrieval_method =
+            autofill::WebElementDescriptor::CSS_SELECTOR;
+        proceed_element_descriptor_->descriptor = attribute_value;
+        break;
+      }
+    }
+  }
+}
+
+int AutofillQueryXmlParser::GetIntValue(buzz::XmlParseContext* context,
+                                        const char* attribute) {
+  char* attr_end = NULL;
+  int value = strtol(attribute, &attr_end, 10);
+  if (attr_end != NULL && attr_end == attribute) {
+    context->RaiseError(XML_ERROR_SYNTAX);
+    return 0;
+  }
+  return value;
+}
+
+AutofillUploadXmlParser::AutofillUploadXmlParser(double* positive_upload_rate,
+                                                 double* negative_upload_rate)
+    : succeeded_(false),
+      positive_upload_rate_(positive_upload_rate),
+      negative_upload_rate_(negative_upload_rate) {
+  DCHECK(positive_upload_rate_);
+  DCHECK(negative_upload_rate_);
+}
+
+void AutofillUploadXmlParser::StartElement(buzz::XmlParseContext* context,
+                                           const char* name,
+                                           const char** attrs) {
+  buzz::QName qname = context->ResolveQName(name, false);
+  const std::string &element = qname.LocalPart();
+  if (element.compare("autofilluploadresponse") == 0) {
+    // Loop over all attributes to get the upload rates.
+    while (*attrs) {
+      buzz::QName attribute_qname = context->ResolveQName(attrs[0], true);
+      const std::string &attribute_name = attribute_qname.LocalPart();
+      if (attribute_name.compare("positiveuploadrate") == 0) {
+        *positive_upload_rate_ = GetDoubleValue(context, attrs[1]);
+      } else if (attribute_name.compare("negativeuploadrate") == 0) {
+        *negative_upload_rate_ = GetDoubleValue(context, attrs[1]);
+      }
+      attrs += 2;  // We peeked at attrs[0] and attrs[1], skip past both.
+    }
+  }
+}
+
+double AutofillUploadXmlParser::GetDoubleValue(buzz::XmlParseContext* context,
+                                               const char* attribute) {
+  char* attr_end = NULL;
+  double value = strtod(attribute, &attr_end);
+  if (attr_end != NULL && attr_end == attribute) {
+    context->RaiseError(XML_ERROR_SYNTAX);
+    return 0.0;
+  }
+  return value;
+}