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