Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Unified Diff: chrome/browser/autofill/form_structure.cc

Issue 355003: Implement FormStructure and an initial method, EncodeUploadRequest. This als... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/autofill/form_structure.h ('k') | chrome/browser/webdata/web_database_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/autofill/form_structure.cc
===================================================================
--- chrome/browser/autofill/form_structure.cc (revision 0)
+++ chrome/browser/autofill/form_structure.cc (revision 0)
@@ -0,0 +1,154 @@
+// Copyright (c) 2009 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 "chrome/browser/autofill/form_structure.h"
+
+#include "base/basictypes.h"
+#include "base/logging.h"
+#include "base/sha1.h"
+#include "base/string_util.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/autofill/field_types.h"
+#include "third_party/libjingle/files/talk/xmllite/xmlelement.h"
+#include "webkit/glue/form_field.h"
+#include "webkit/glue/form_field_values.h"
+
+const char* kFormMethodGet = "get";
+const char* kFormMethodPost = "post";
+
+// XML attribute names
+const char* const kAttributeClientVersion = "clientversion";
+const char* const kAttributeAutoFillUsed = "autofillused";
+const char* const kAttributeSignature = "signature";
+const char* const kAttributeFormSignature = "formsignature";
+const char* const kAttributeDataPresent = "datapresent";
+
+const char* const kXMLElementForm = "form";
+const char* const kXMLElementField = "field";
+const char* const kAttributeAutoFillType = "autofilltype";
+
+namespace {
+
+static std::string Hash64Bit(const std::string& str) {
+ std::string hash_bin = base::SHA1HashString(str);
+ DCHECK(hash_bin.length() == 20);
+
+ uint64 hash64 = (((static_cast<uint64>(hash_bin[0])) & 0xFF) << 56) |
+ (((static_cast<uint64>(hash_bin[1])) & 0xFF) << 48) |
+ (((static_cast<uint64>(hash_bin[2])) & 0xFF) << 40) |
+ (((static_cast<uint64>(hash_bin[3])) & 0xFF) << 32) |
+ (((static_cast<uint64>(hash_bin[4])) & 0xFF) << 24) |
+ (((static_cast<uint64>(hash_bin[5])) & 0xFF) << 16) |
+ (((static_cast<uint64>(hash_bin[6])) & 0xFF) << 8) |
+ ((static_cast<uint64>(hash_bin[7])) & 0xFF);
+
+ return Uint64ToString(hash64);
+}
+
+} // namespace
+
+FormStructure::FormStructure(const webkit_glue::FormFieldValues& values)
+ : form_name_(UTF16ToUTF8(values.form_name)),
+ source_url_(values.source_url),
+ target_url_(values.target_url) {
+ // Copy the form fields.
+ std::vector<webkit_glue::FormField>::const_iterator field;
+ for (field = values.elements.begin();
+ field != values.elements.end(); field++) {
+ fields_.push_back(AutoFillField(*field));
+ }
+
+ std::string method = UTF16ToUTF8(values.method);
+ if (method == kFormMethodPost) {
+ method_ = POST;
+ } else {
+ // Either the method is 'get', or we don't know. In this case we default
+ // to GET.
+ method_ = GET;
+ }
+}
+
+bool FormStructure::EncodeUploadRequest(bool auto_fill_used,
+ std::string* encoded_xml) const {
+ bool auto_fillable = IsAutoFillable();
+ DCHECK(auto_fillable); // Caller should've checked for search pages.
+ if (!auto_fillable)
+ return false;
+
+ buzz::XmlElement autofill_upload(buzz::QName("autofillupload"));
+
+ // Attributes for the <autofillupload> element.
+ //
+ // TODO(jhawkins): Work with toolbar devs to make a spec for autofill clients.
+ // For now these values are hacked from the toolbar code.
+ autofill_upload.SetAttr(buzz::QName(kAttributeClientVersion),
+ "6.1.1715.1442/en (GGLL)");
+
+ autofill_upload.SetAttr(buzz::QName(kAttributeFormSignature),
+ FormSignature());
+
+ autofill_upload.SetAttr(buzz::QName(kAttributeAutoFillUsed),
+ auto_fill_used ? "true" : "false");
+
+ // TODO(jhawkins): Hook this up to the personal data manager.
+ // personaldata_manager_->GetDataPresent();
+ autofill_upload.SetAttr(buzz::QName(kAttributeDataPresent), "");
+
+ // Add the child nodes for the form fields.
+ std::vector<AutoFillField>::const_iterator field;
+ for (field = fields_.begin(); field != fields_.end(); field++) {
+ FieldTypeSet types = field->possible_types();
+ for (FieldTypeSet::const_iterator type = types.begin();
+ type != types.end(); type++) {
+ buzz::XmlElement *field_element = new buzz::XmlElement(
+ buzz::QName(kXMLElementField));
+
+ field_element->SetAttr(buzz::QName(kAttributeSignature),
+ field->FieldSignature());
+
+ field_element->SetAttr(buzz::QName(kAttributeAutoFillType),
+ IntToString(*type));
+
+ autofill_upload.AddElement(field_element);
+ }
+ }
+
+ // Obtain the XML structure as a string.
+ *encoded_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ *encoded_xml += autofill_upload.Str().c_str();
+
+ return true;
+}
+
+std::string FormStructure::FormSignature() const {
+ std::string form_string = target_url_.host() +
+ "&" +
+ form_name_ +
+ form_signature_field_names_;
+
+ return Hash64Bit(form_string);
+}
+
+bool FormStructure::IsAutoFillable() const {
+ if (fields_.size() == 0)
+ return false;
+
+ // Rule out http(s)://*/search?...
+ // e.g. http://www.google.com/search?q=...
+ // http://search.yahoo.com/search?p=...
+ if (target_url_.path() == "/search")
+ return false;
+
+ // Disqualify all forms that are likely to be search boxes (like google.com).
+ if (fields_.size() == 1) {
+ std::string name = UTF16ToUTF8(fields_[0].name());
+ if (name == "q")
+ return false;
+ }
+
+ if (method_ == GET)
+ return false;
+
+ return true;
+}
Property changes on: chrome/browser/autofill/form_structure.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « chrome/browser/autofill/form_structure.h ('k') | chrome/browser/webdata/web_database_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698