2011-05-19 Kent Tamura <tkent@chromium.org>
[WebKit.git] / Source / WebCore / html / HTMLInputElement.h
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, 2010 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
29 namespace WebCore {
30
31 class FileList;
32 class HTMLDataListElement;
33 class HTMLOptionElement;
34 class InputType;
35 class KURL;
36
37 class HTMLInputElement : public HTMLTextFormControlElement {
38 public:
39     static PassRefPtr<HTMLInputElement> create(const QualifiedName&, Document*, HTMLFormElement*, bool createdByParser);
40     virtual ~HTMLInputElement();
41
42     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitspeechchange);
43
44     virtual HTMLInputElement* toInputElement() { return this; }
45
46     bool autoComplete() const;
47
48     // For ValidityState
49     bool typeMismatch() const;
50     // valueMissing() ignores the specified string value for CHECKBOX and RADIO.
51     bool valueMissing(const String&) const;
52     bool patternMismatch(const String&) const;
53     bool tooLong(const String&, NeedsToCheckDirtyFlag) const;
54     bool rangeUnderflow(const String&) const;
55     bool rangeOverflow(const String&) const;
56     // Returns the minimum value for type=date, number, or range.  Don't call this for other types.
57     double minimum() const;
58     // Returns the maximum value for type=date, number, or range.  Don't call this for other types.
59     // This always returns a value which is >= minimum().
60     double maximum() const;
61     // Sets the "allowed value step" defined in the HTML spec to the specified double pointer.
62     // Returns false if there is no "allowed value step."
63     bool getAllowedValueStep(double*) const;
64     bool getAllowedValueStepWithDecimalPlaces(double*, unsigned*) const;
65     // For ValidityState.
66     bool stepMismatch(const String&) const;
67     String minimumString() const;
68     String maximumString() const;
69     String stepBaseString() const;
70     String stepString() const;
71     String typeMismatchText() const;
72     String valueMissingText() const;
73
74     // Implementations of HTMLInputElement::stepUp() and stepDown().
75     void stepUp(int, ExceptionCode&);
76     void stepDown(int, ExceptionCode&);
77     void stepUp(ExceptionCode& ec) { stepUp(1, ec); }
78     void stepDown(ExceptionCode& ec) { stepDown(1, ec); }
79     // stepUp()/stepDown() for user-interaction.
80     bool isSteppable() const;
81     void stepUpFromRenderer(int);
82
83     bool isTextButton() const;
84
85     virtual bool isRadioButton() const;
86     bool isTextField() const;
87     bool isSearchField() const;
88     bool isInputTypeHidden() const;
89     bool isPasswordField() const;
90     bool isCheckbox() const;
91     bool isRangeControl() const;
92
93     // FIXME: It's highly likely that any call site calling this function should instead
94     // be using a different one. Many input elements behave like text fields, and in addition
95     // any unknown input type is treated as text. Consider, for example, isTextField or
96     // isTextField && !isPasswordField.
97     bool isText() const;
98
99     bool isEmailField() const;
100     bool isFileUpload() const;
101     bool isImageButton() const;
102     bool isNumberField() const;
103     bool isSubmitButton() const;
104     bool isTelephoneField() const;
105     bool isURLField() const;
106
107 #if ENABLE(INPUT_SPEECH)
108     bool isSpeechEnabled() const;
109 #endif
110
111     bool checked() const { return m_isChecked; }
112     void setChecked(bool, bool sendChangeEvent = false);
113
114     // 'indeterminate' is a state independent of the checked state that causes the control to draw in a way that hides the actual state.
115     bool indeterminate() const { return m_isIndeterminate; }
116     void setIndeterminate(bool);
117
118     // isChecked is used by the rendering tree/CSS while checked() is used by JS to determine checked state
119     virtual bool isChecked() const;
120     virtual bool isIndeterminate() const { return indeterminate(); }
121
122     int size() const;
123
124     void setType(const String&);
125
126     String value() const;
127     void setValue(const String&, bool sendChangeEvent = false);
128     void setValueForUser(const String&);
129     // Checks if the specified string would be a valid value.
130     // We should not call this for types with no string value such as CHECKBOX and RADIO.
131     bool isValidValue(const String&) const;
132
133     String sanitizeValue(const String&) const;
134
135     // The value which is drawn by a renderer.
136     String visibleValue() const;
137     String convertFromVisibleValue(const String&) const;
138     // Returns true if the specified string can be set as the value of HTMLInputElement.
139     bool isAcceptableValue(const String&) const;
140
141     const String& suggestedValue() const;
142     void setSuggestedValue(const String&);
143
144     double valueAsDate() const;
145     void setValueAsDate(double, ExceptionCode&);
146
147     double valueAsNumber() const;
148     void setValueAsNumber(double, ExceptionCode&);
149
150     virtual String placeholder() const;
151     virtual void setPlaceholder(const String&);
152
153     String valueWithDefault() const;
154
155     void setValueFromRenderer(const String&);
156     void setFileListFromRenderer(const Vector<String>&);
157
158     bool canHaveSelection() const;
159
160     virtual bool rendererIsNeeded(RenderStyle*);
161     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
162     virtual void detach();
163
164     // FIXME: For isActivatedSubmit and setActivatedSubmit, we should use the NVI-idiom here by making
165     // it private virtual in all classes and expose a public method in HTMLFormControlElement to call
166     // the private virtual method.
167     virtual bool isActivatedSubmit() const;
168     virtual void setActivatedSubmit(bool flag);
169
170     String altText() const;
171
172     int maxResults() const { return m_maxResults; }
173
174     String defaultValue() const;
175     void setDefaultValue(const String&);
176
177     void setDefaultName(const AtomicString&);
178
179     String accept() const;
180     String alt() const;
181
182     void setSize(unsigned);
183
184     KURL src() const;
185
186     virtual int maxLength() const;
187     void setMaxLength(int, ExceptionCode&);
188
189     bool multiple() const;
190
191     bool isAutofilled() const { return m_isAutofilled; }
192     void setAutofilled(bool = true);
193
194     FileList* files();
195
196     void addSearchResult();
197     void onSearch();
198     bool searchEventsShouldBeDispatched() const;
199
200 #if ENABLE(DATALIST)
201     HTMLElement* list() const;
202     HTMLOptionElement* selectedOption() const;
203 #endif
204
205 #if ENABLE(WCSS)
206     void setWapInputFormat(String& mask);
207 #endif
208
209     // These functions are public so they can be used in InputType classes.
210     // Otherwise, they would be private.
211     CheckedRadioButtons& checkedRadioButtons() const;
212     void updateCheckedRadioButtons();
213 #if ENABLE(WCSS)
214     bool isConformToInputMask(const String&) const;
215 #endif
216
217     bool lastChangeWasUserEdit() const;
218     void cacheSelection(int start, int end);
219
220     static const int maximumLength;
221
222 protected:
223     HTMLInputElement(const QualifiedName&, Document*, HTMLFormElement*, bool createdByParser);
224
225     virtual void defaultEventHandler(Event*);
226
227 private:
228     enum AutoCompleteSetting { Uninitialized, On, Off };
229
230     virtual void willMoveToNewOwnerDocument();
231     virtual void didMoveToNewOwnerDocument();
232
233     virtual bool isKeyboardFocusable(KeyboardEvent*) const;
234     virtual bool isMouseFocusable() const;
235     virtual bool isEnumeratable() const;
236     virtual void updateFocusAppearance(bool restorePreviousSelection);
237     virtual void aboutToUnload();
238     virtual bool shouldUseInputMethod() const;
239
240     virtual const AtomicString& formControlName() const;
241
242     virtual bool isTextFormControl() const { return isTextField(); }
243
244     virtual bool canTriggerImplicitSubmission() const { return isTextField(); }
245
246     virtual const AtomicString& formControlType() const;
247
248     virtual bool saveFormControlState(String& value) const;
249     virtual void restoreFormControlState(const String&);
250
251     virtual bool canStartSelection() const;
252
253     virtual void accessKeyAction(bool sendToAnyElement);
254
255     virtual bool mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const;
256     virtual void parseMappedAttribute(Attribute*);
257     virtual void finishParsingChildren();
258
259     virtual void copyNonAttributeProperties(const Element* source);
260
261     virtual void attach();
262
263     virtual bool appendFormData(FormDataList&, bool);
264
265     virtual bool isSuccessfulSubmitButton() const;
266
267     virtual void reset();
268
269     virtual void* preDispatchEventHandler(Event*);
270     virtual void postDispatchEventHandler(Event*, void* dataFromPreDispatch);
271
272     virtual bool isURLAttribute(Attribute*) const;
273
274     virtual bool hasUnacceptableValue() const;
275
276     virtual bool isInRange() const;
277     virtual bool isOutOfRange() const;
278
279     virtual void documentDidBecomeActive();
280
281     virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
282
283     bool needsActivationCallback();
284     void registerForActivationCallbackIfNeeded();
285     void unregisterForActivationCallbackIfNeeded();
286
287     bool supportsMaxLength() const { return isTextType(); }
288     bool isTextType() const;
289
290     virtual bool supportsPlaceholder() const;
291     virtual bool isEmptyValue() const { return value().isEmpty(); }
292     virtual bool isEmptySuggestedValue() const { return suggestedValue().isEmpty(); }
293     virtual void handleFocusEvent();
294     virtual void handleBlurEvent();
295     virtual int cachedSelectionStart() const { return m_cachedSelectionStart; }
296     virtual int cachedSelectionEnd() const { return m_cachedSelectionEnd; }
297
298     virtual bool isOptionalFormControl() const { return !isRequiredFormControl(); }
299     virtual bool isRequiredFormControl() const;
300     virtual bool recalcWillValidate() const;
301
302     void updateType();
303
304     // Helper for stepUp()/stepDown().  Adds step value * count to the current value.
305     void applyStep(double count, ExceptionCode&);
306
307 #if ENABLE(DATALIST)
308     HTMLDataListElement* dataList() const;
309 #endif
310     void notifyFormStateChanged();
311     void parseMaxLengthAttribute(Attribute*);
312     void updateValueIfNeeded();
313 #if ENABLE(WCSS)
314     bool isConformToInputMask(UChar, unsigned) const;
315     String validateInputMask(String&);
316 #endif
317
318     AtomicString m_name;
319     String m_value;
320     String m_suggestedValue;
321     int m_size;
322     int m_maxLength;
323     int m_cachedSelectionStart;
324     int m_cachedSelectionEnd;
325 #if ENABLE(WCSS)
326     String m_inputFormatMask;
327     unsigned m_maxInputCharsAllowed;
328 #endif
329     short m_maxResults;
330     bool m_isChecked : 1;
331     bool m_reflectsCheckedAttribute : 1;
332     bool m_isIndeterminate : 1;
333     bool m_hasType : 1;
334     bool m_isActivatedSubmit : 1;
335     unsigned m_autocomplete : 2; // AutoCompleteSetting
336     bool m_isAutofilled : 1;
337 #if ENABLE(DATALIST)
338     bool m_hasNonEmptyList : 1;
339 #endif
340     bool m_stateRestored : 1;
341     bool m_parsingInProgress : 1;
342     bool m_wasModifiedByUser : 1;
343     OwnPtr<InputType> m_inputType;
344 };
345
346 } //namespace
347
348 #endif