1dc0f95d653279beabeb9817299e2902918ba123eKristian 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#include "chrome/browser/autofill/autofill_field.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/sha1.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic std::string Hash32Bit(const std::string& str) {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string hash_bin = base::SHA1HashString(str);
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_EQ(20U, hash_bin.length());
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  uint32 hash32 = ((hash_bin[0] & 0xFF) << 24) |
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  ((hash_bin[1] & 0xFF) << 16) |
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  ((hash_bin[2] & 0xFF) << 8) |
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   (hash_bin[3] & 0xFF);
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return base::UintToString(hash32);
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutofillField::AutofillField()
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : server_type_(NO_SERVER_DATA),
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      heuristic_type_(UNKNOWN_TYPE) {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutofillField::AutofillField(const webkit_glue::FormField& field,
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const string16& unique_name)
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : webkit_glue::FormField(field),
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      unique_name_(unique_name),
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      server_type_(NO_SERVER_DATA),
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      heuristic_type_(UNKNOWN_TYPE) {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutofillField::~AutofillField() {}
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid AutofillField::set_heuristic_type(AutofillFieldType type) {
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (type >= 0 && type < MAX_VALID_FIELD_TYPE) {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    heuristic_type_ = type;
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    NOTREACHED();
4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // This case should not be reachable; but since this has potential
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // implications on data uploaded to the server, better safe than sorry.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    heuristic_type_ = UNKNOWN_TYPE;
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutofillFieldType AutofillField::type() const {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (server_type_ != NO_SERVER_DATA)
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return server_type_;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return heuristic_type_;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool AutofillField::IsEmpty() const {
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return value.empty();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string AutofillField::FieldSignature() const {
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string field_name = UTF16ToUTF8(name);
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string type = UTF16ToUTF8(form_control_type);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string field_string = field_name + "&" + type;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return Hash32Bit(field_string);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool AutofillField::IsFieldFillable() const {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return type() != UNKNOWN_TYPE;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
75