1// Copyright (c) 2010 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#include "webkit/glue/form_field.h"
6
7#include "base/string_util.h"
8#include "base/utf_string_conversions.h"
9#ifndef ANDROID
10#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
11#include "third_party/WebKit/Source/WebKit/chromium/public/WebOptionElement.h"
12#include "third_party/WebKit/Source/WebKit/chromium/public/WebSelectElement.h"
13#endif
14
15#ifndef ANDROID
16using WebKit::WebFormControlElement;
17using WebKit::WebElement;
18using WebKit::WebInputElement;
19using WebKit::WebOptionElement;
20using WebKit::WebSelectElement;
21using WebKit::WebVector;
22#endif
23
24namespace webkit_glue {
25
26FormField::FormField()
27    : max_length(0),
28      is_autofilled(false) {
29}
30
31#ifndef ANDROID
32// TODO(jhawkins): This constructor should probably be deprecated and the
33// functionality moved to FormManager.
34FormField::FormField(WebFormControlElement element)
35    : max_length(0),
36      is_autofilled(false) {
37  name = element.nameForAutofill();
38
39  // TODO(jhawkins): Extract the field label.  For now we just use the field
40  // name.
41  label = name;
42
43  form_control_type = element.formControlType();
44  if (form_control_type == ASCIIToUTF16("text")) {
45    const WebInputElement& input_element = element.toConst<WebInputElement>();
46    value = input_element.value();
47    max_length = input_element.size();
48    is_autofilled = input_element.isAutofilled();
49  } else if (form_control_type == ASCIIToUTF16("select-one")) {
50    WebSelectElement select_element = element.to<WebSelectElement>();
51    value = select_element.value();
52
53    // For select-one elements copy option strings.
54    WebVector<WebElement> list_items = select_element.listItems();
55    option_strings.reserve(list_items.size());
56    for (size_t i = 0; i < list_items.size(); ++i) {
57      if (list_items[i].hasTagName("option"))
58        option_strings.push_back(list_items[i].to<WebOptionElement>().value());
59    }
60  }
61
62  TrimWhitespace(value, TRIM_LEADING, &value);
63}
64#endif
65
66FormField::FormField(const string16& label,
67                     const string16& name,
68                     const string16& value,
69                     const string16& form_control_type,
70                     int max_length,
71                     bool is_autofilled)
72  : label(label),
73    name(name),
74    value(value),
75    form_control_type(form_control_type),
76    max_length(max_length),
77    is_autofilled(is_autofilled) {
78}
79
80FormField::~FormField() {
81}
82
83bool FormField::operator==(const FormField& field) const {
84  // A FormField stores a value, but the value is not part of the identity of
85  // the field, so we don't want to compare the values.
86  return (label == field.label &&
87          name == field.name &&
88          form_control_type == field.form_control_type &&
89          max_length == field.max_length);
90}
91
92bool FormField::operator!=(const FormField& field) const {
93  return !operator==(field);
94}
95
96bool FormField::StrictlyEqualsHack(const FormField& field) const {
97  return (label == field.label &&
98          name == field.name &&
99          value == field.value &&
100          form_control_type == field.form_control_type &&
101          max_length == field.max_length);
102}
103
104std::ostream& operator<<(std::ostream& os, const FormField& field) {
105  return os
106      << UTF16ToUTF8(field.label)
107      << " "
108      << UTF16ToUTF8(field.name)
109      << " "
110      << UTF16ToUTF8(field.value)
111      << " "
112      << UTF16ToUTF8(field.form_control_type)
113      << " "
114      << field.max_length;
115}
116
117}  // namespace webkit_glue
118