Home | History | Annotate | Download | only in glue
      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
     16 using WebKit::WebFormControlElement;
     17 using WebKit::WebElement;
     18 using WebKit::WebInputElement;
     19 using WebKit::WebOptionElement;
     20 using WebKit::WebSelectElement;
     21 using WebKit::WebVector;
     22 #endif
     23 
     24 namespace webkit_glue {
     25 
     26 FormField::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.
     34 FormField::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 
     66 FormField::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 
     80 FormField::~FormField() {
     81 }
     82 
     83 bool 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 
     92 bool FormField::operator!=(const FormField& field) const {
     93   return !operator==(field);
     94 }
     95 
     96 bool 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 
    104 std::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