• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23 
24 #ifndef HTMLInputElement_h
25 #define HTMLInputElement_h
26 
27 #include "HTMLFormControlElement.h"
28 #include "InputElement.h"
29 #include <wtf/OwnPtr.h>
30 
31 namespace WebCore {
32 
33 class DateComponents;
34 class FileList;
35 class HTMLDataListElement;
36 class HTMLImageLoader;
37 class HTMLOptionElement;
38 class KURL;
39 class VisibleSelection;
40 
41 class HTMLInputElement : public HTMLTextFormControlElement, public InputElement {
42 public:
43     enum InputType {
44         TEXT = 0, // TEXT must be 0.
45         PASSWORD,
46         ISINDEX,
47         CHECKBOX,
48         RADIO,
49         SUBMIT,
50         RESET,
51         FILE,
52         HIDDEN,
53         IMAGE,
54         BUTTON,
55         SEARCH,
56         RANGE,
57         EMAIL,
58         NUMBER,
59         TELEPHONE,
60         URL,
61         COLOR,
62         DATE,
63         DATETIME,
64         DATETIMELOCAL,
65         MONTH,
66         TIME,
67         WEEK,
68         // If you add new types or change the order of enum values, update numberOfTypes below.
69     };
70     static const int numberOfTypes = WEEK + 1;
71 
72     enum AutoCompleteSetting {
73         Uninitialized,
74         On,
75         Off
76     };
77 
78     HTMLInputElement(const QualifiedName&, Document*, HTMLFormElement* = 0);
79     virtual ~HTMLInputElement();
80 
endTagRequirement()81     virtual HTMLTagStatus endTagRequirement() const { return TagStatusForbidden; }
tagPriority()82     virtual int tagPriority() const { return 0; }
83 
84     virtual bool isKeyboardFocusable(KeyboardEvent*) const;
85     virtual bool isMouseFocusable() const;
isEnumeratable()86     virtual bool isEnumeratable() const { return inputType() != IMAGE; }
87     virtual void updateFocusAppearance(bool restorePreviousSelection);
88     virtual void aboutToUnload();
89     virtual bool shouldUseInputMethod() const;
90 
91     virtual const AtomicString& formControlName() const;
92 
93     bool autoComplete() const;
94 
95     // isChecked is used by the rendering tree/CSS while checked() is used by JS to determine checked state
isChecked()96     virtual bool isChecked() const { return checked() && (inputType() == CHECKBOX || inputType() == RADIO); }
isIndeterminate()97     virtual bool isIndeterminate() const { return indeterminate(); }
98 
readOnly()99     bool readOnly() const { return isReadOnlyFormControl(); }
100 
isTextFormControl()101     virtual bool isTextFormControl() const { return isTextField(); }
102 
103     virtual bool valueMissing() const;
104     virtual bool patternMismatch() const;
105     virtual bool tooLong() const;
106     // For ValidityState
107     bool rangeUnderflow() const;
108     bool rangeOverflow() const;
109     // Returns the minimum value for type=date, number, or range.  Don't call this for other types.
110     double minimum() const;
111     // Returns the maximum value for type=date, number, or range.  Don't call this for other types.
112     // This always returns a value which is >= minimum().
113     double maximum() const;
114     // Sets the "allowed value step" defined in the HTML spec to the specified double pointer.
115     // Returns false if there is no "allowed value step."
116     bool getAllowedValueStep(double*) const;
117     // For ValidityState.
118     bool stepMismatch() const;
119     // Implementations of HTMLInputElement::stepUp() and stepDown().
120     void stepUp(int, ExceptionCode&);
121     void stepDown(int, ExceptionCode&);
stepUp(ExceptionCode & ec)122     void stepUp(ExceptionCode& ec) { stepUp(1, ec); }
stepDown(ExceptionCode & ec)123     void stepDown(ExceptionCode& ec) { stepDown(1, ec); }
124 
isTextButton()125     bool isTextButton() const { return m_type == SUBMIT || m_type == RESET || m_type == BUTTON; }
isRadioButton()126     virtual bool isRadioButton() const { return m_type == RADIO; }
127     virtual bool isTextField() const;
isSearchField()128     virtual bool isSearchField() const { return m_type == SEARCH; }
isInputTypeHidden()129     virtual bool isInputTypeHidden() const { return m_type == HIDDEN; }
isPasswordField()130     virtual bool isPasswordField() const { return m_type == PASSWORD; }
131 
checked()132     bool checked() const { return m_checked; }
133     void setChecked(bool, bool sendChangeEvent = false);
indeterminate()134     bool indeterminate() const { return m_indeterminate; }
135     void setIndeterminate(bool);
136     virtual int size() const;
137     virtual const AtomicString& formControlType() const;
138     void setType(const String&);
139 
140     virtual const String& suggestedValue() const;
141     void setSuggestedValue(const String&);
142 
143     virtual String value() const;
144     virtual void setValue(const String&, bool sendChangeEvent = false);
145     virtual void setValueForUser(const String&);
146 
147     double valueAsDate() const;
148     void setValueAsDate(double, ExceptionCode&);
149 
150     double valueAsNumber() const;
151     void setValueAsNumber(double, ExceptionCode&);
152 
153     virtual String placeholder() const;
154     virtual void setPlaceholder(const String&);
155 
156     virtual bool searchEventsShouldBeDispatched() const;
157 
158     String valueWithDefault() const;
159 
160     virtual void setValueFromRenderer(const String&);
161     void setFileListFromRenderer(const Vector<String>&);
162 
163     virtual bool saveFormControlState(String& value) const;
164     virtual void restoreFormControlState(const String&);
165 
166     virtual bool canStartSelection() const;
167 
168     bool canHaveSelection() const;
select()169     virtual void select() { HTMLTextFormControlElement::select(); }
170 
171     virtual void accessKeyAction(bool sendToAnyElement);
172 
173     virtual bool mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const;
174     virtual void parseMappedAttribute(MappedAttribute*);
175 
176     virtual void copyNonAttributeProperties(const Element* source);
177 
178     virtual void attach();
179     virtual bool rendererIsNeeded(RenderStyle*);
180     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
181     virtual void detach();
182     virtual bool appendFormData(FormDataList&, bool);
183 
184     virtual bool isSuccessfulSubmitButton() const;
185     virtual bool isActivatedSubmit() const;
186     virtual void setActivatedSubmit(bool flag);
187 
inputType()188     InputType inputType() const { return static_cast<InputType>(m_type); }
189     void setInputType(const String&);
190 
191     // Report if this input type uses height & width attributes
respectHeightAndWidthAttrs()192     bool respectHeightAndWidthAttrs() const { return inputType() == IMAGE || inputType() == HIDDEN; }
193 
194     virtual void reset();
195 
196     virtual void* preDispatchEventHandler(Event*);
197     virtual void postDispatchEventHandler(Event*, void* dataFromPreDispatch);
198     virtual void defaultEventHandler(Event*);
199 
200     String altText() const;
201 
202     virtual bool isURLAttribute(Attribute*) const;
203 
maxResults()204     int maxResults() const { return m_maxResults; }
205 
206     String defaultValue() const;
207     void setDefaultValue(const String&);
208 
209     bool defaultChecked() const;
210     void setDefaultChecked(bool);
211 
212     void setDefaultName(const AtomicString&);
213 
214     String accept() const;
215     void setAccept(const String&);
216 
217     String accessKey() const;
218     void setAccessKey(const String&);
219 
220     String align() const;
221     void setAlign(const String&);
222 
223     String alt() const;
224     void setAlt(const String&);
225 
226     void setSize(unsigned);
227 
228     KURL src() const;
229     void setSrc(const String&);
230 
231 #if ENABLE(DATALIST)
232     HTMLElement* list() const;
233     HTMLOptionElement* selectedOption() const;
234 #endif
235 
236     int maxLength() const;
237     void setMaxLength(int, ExceptionCode&);
238 
239     bool multiple() const;
240     void setMultiple(bool);
241 
242     String useMap() const;
243     void setUseMap(const String&);
244 
isAutofilled()245     virtual bool isAutofilled() const { return m_autofilled; }
246     void setAutofilled(bool value = true);
247 
248     FileList* files();
249 
250     virtual void cacheSelection(int start, int end);
251     void addSearchResult();
252     void onSearch();
253 
254     virtual String sanitizeValue(const String&) const;
255 
256     virtual void documentDidBecomeActive();
257 
258     virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
259 
260     virtual bool willValidate() const;
261 
262     // Converts the specified string to a floating number.
263     // If the conversion fails, the return value is false. Take care that leading or trailing unnecessary characters make failures.  This returns false for an empty string input.
264     // The double* parameter may be 0.
265     static bool formStringToDouble(const String&, double*);
266     // Converts the specified number to a string. This is an implementation of
267     // HTML5's "algorithm to convert a number to a string" for NUMBER/RANGE types.
268     static String formStringFromDouble(double);
269     // Parses the specified string as the InputType, and returns true if it is successfully parsed.
270     // An instance pointed by the DateComponents* parameter will have parsed values and be
271     // modified even if the parsing fails.  The DateComponents* parameter may be 0.
272     static bool formStringToDateComponents(InputType, const String&, DateComponents*);
273 
274 protected:
275     virtual void willMoveToNewOwnerDocument();
276     virtual void didMoveToNewOwnerDocument();
277 
278 private:
279     bool storesValueSeparateFromAttribute() const;
280 
281     bool needsActivationCallback();
282     void registerForActivationCallbackIfNeeded();
283     void unregisterForActivationCallbackIfNeeded();
284 
supportsPlaceholder()285     virtual bool supportsPlaceholder() const { return isTextField(); }
isEmptyValue()286     virtual bool isEmptyValue() const { return value().isEmpty(); }
287     virtual void handleFocusEvent();
288     virtual void handleBlurEvent();
cachedSelectionStart()289     virtual int cachedSelectionStart() const { return m_data.cachedSelectionStart(); }
cachedSelectionEnd()290     virtual int cachedSelectionEnd() const { return m_data.cachedSelectionEnd(); }
291 
isOptionalFormControl()292     virtual bool isOptionalFormControl() const { return !isRequiredFormControl(); }
293     virtual bool isRequiredFormControl() const;
294 
295     PassRefPtr<HTMLFormElement> createTemporaryFormForIsIndex();
296     // Helper for getAllowedValueStep();
297     bool getStepParameters(double* defaultStep, double* stepScaleFactor) const;
298     // Helper for stepUp()/stepDown().  Adds step value * count to the current value.
299     void applyStep(double count, ExceptionCode&);
300     // Helper for applyStepForNumberOrRange().
301     double stepBase() const;
302 
303     // Parses the specified string for the current type, and return
304     // the double value for the parsing result if the parsing
305     // succeeds; Returns defaultValue otherwise. This function can
306     // return NaN or Infinity only if defaultValue is NaN or Infinity.
307     double parseToDouble(const String&, double defaultValue) const;
308 
309     // Generates a suitable string for the specified DateComponents and the
310     // step value, and calls setValue() with it.
311     void setDateValue(const DateComponents&);
312 
313 
314 #if ENABLE(DATALIST)
315     HTMLDataListElement* dataList() const;
316 #endif
317 
318     InputElementData m_data;
319     int m_xPos;
320     int m_yPos;
321     short m_maxResults;
322     OwnPtr<HTMLImageLoader> m_imageLoader;
323     RefPtr<FileList> m_fileList;
324     unsigned m_type : 5; // InputType
325     bool m_checked : 1;
326     bool m_defaultChecked : 1;
327     bool m_useDefaultChecked : 1;
328     bool m_indeterminate : 1;
329     bool m_haveType : 1;
330     bool m_activeSubmit : 1;
331     unsigned m_autocomplete : 2; // AutoCompleteSetting
332     bool m_autofilled : 1;
333     bool m_inited : 1;
334 #if ENABLE(DATALIST)
335     bool m_hasNonEmptyList : 1;
336 #endif
337 };
338 
339 } //namespace
340 
341 #endif
342