faeabffbaab4b379e158e422c3702e32449d3349
[WebKit-https.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  * Copyright (C) 2012 Samsung Electronics. All rights reserved.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #ifndef HTMLInputElement_h
26 #define HTMLInputElement_h
27
28 #include "HTMLTextFormControlElement.h"
29 #include "StepRange.h"
30
31 namespace WebCore {
32
33 class CheckedRadioButtons;
34 class DragData;
35 class FileList;
36 class HTMLDataListElement;
37 class HTMLOptionElement;
38 class Icon;
39 class InputType;
40 class KURL;
41
42 class HTMLInputElement : public HTMLTextFormControlElement {
43 public:
44     static PassRefPtr<HTMLInputElement> create(const QualifiedName&, Document*, HTMLFormElement*, bool createdByParser);
45     virtual ~HTMLInputElement();
46
47     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitspeechchange);
48
49     virtual HTMLInputElement* toInputElement() { return this; }
50
51     virtual bool shouldAutocomplete() const;
52
53     // For ValidityState
54     virtual bool patternMismatch() const OVERRIDE;
55     virtual bool rangeUnderflow() const OVERRIDE;
56     virtual bool rangeOverflow() const;
57     virtual bool stepMismatch() const OVERRIDE;
58     virtual bool tooLong() const OVERRIDE;
59     virtual bool typeMismatch() const OVERRIDE;
60     virtual bool valueMissing() const OVERRIDE;
61     virtual String validationMessage() const OVERRIDE;
62
63     // Returns the minimum value for type=date, number, or range.  Don't call this for other types.
64     double minimum() const;
65     // Returns the maximum value for type=date, number, or range.  Don't call this for other types.
66     // This always returns a value which is >= minimum().
67     double maximum() const;
68     // Sets the "allowed value step" defined in the HTML spec to the specified double pointer.
69     // Returns false if there is no "allowed value step."
70     bool getAllowedValueStep(Decimal*) const;
71     StepRange createStepRange(AnyStepHandling) const;
72
73     // Implementations of HTMLInputElement::stepUp() and stepDown().
74     void stepUp(int, ExceptionCode&);
75     void stepDown(int, ExceptionCode&);
76     void stepUp(ExceptionCode& ec) { stepUp(1, ec); }
77     void stepDown(ExceptionCode& ec) { stepDown(1, ec); }
78     // stepUp()/stepDown() for user-interaction.
79     bool isSteppable() const;
80
81     bool isTextButton() const;
82
83     bool isRadioButton() const;
84     bool isTextField() const;
85     bool isSearchField() const;
86     bool isInputTypeHidden() const;
87     bool isPasswordField() const;
88     bool isCheckbox() const;
89     bool isRangeControl() const;
90
91     // FIXME: It's highly likely that any call site calling this function should instead
92     // be using a different one. Many input elements behave like text fields, and in addition
93     // any unknown input type is treated as text. Consider, for example, isTextField or
94     // isTextField && !isPasswordField.
95     bool isText() const;
96
97     bool isEmailField() const;
98     bool isFileUpload() const;
99     bool isImageButton() const;
100     bool isNumberField() const;
101     bool isSubmitButton() const;
102     bool isTelephoneField() const;
103     bool isURLField() const;
104     bool isDateField() const;
105     bool isDateTimeField() const;
106     bool isDateTimeLocalField() const;
107     bool isMonthField() const;
108     bool isTimeField() const;
109     bool isWeekField() const;
110
111 #if ENABLE(INPUT_SPEECH)
112     bool isSpeechEnabled() const;
113 #endif
114
115     HTMLElement* containerElement() const;
116     virtual HTMLElement* innerTextElement() const;
117     HTMLElement* innerBlockElement() const;
118     HTMLElement* innerSpinButtonElement() const;
119     HTMLElement* resultsButtonElement() const;
120     HTMLElement* cancelButtonElement() const;
121 #if ENABLE(INPUT_SPEECH)
122     HTMLElement* speechButtonElement() const;
123 #endif
124     virtual HTMLElement* placeholderElement() const;
125
126     bool checked() const { return m_isChecked; }
127     void setChecked(bool, TextFieldEventBehavior = DispatchNoEvent);
128
129     // 'indeterminate' is a state independent of the checked state that causes the control to draw in a way that hides the actual state.
130     bool indeterminate() const { return m_isIndeterminate; }
131     void setIndeterminate(bool);
132     // shouldAppearChecked is used by the rendering tree/CSS while checked() is used by JS to determine checked state
133     bool shouldAppearChecked() const;
134     virtual bool isIndeterminate() const;
135
136     int size() const;
137     bool sizeShouldIncludeDecoration(int& preferredSize) const;
138
139     void setType(const String&);
140
141     String value() const;
142     void setValue(const String&, TextFieldEventBehavior = DispatchNoEvent);
143     void setValueForUser(const String&);
144     // Checks if the specified string would be a valid value.
145     // We should not call this for types with no string value such as CHECKBOX and RADIO.
146     bool isValidValue(const String&) const;
147     bool hasDirtyValue() const { return !m_valueIfDirty.isNull(); };
148
149     String sanitizeValue(const String&) const;
150
151     String localizeValue(const String&) const;
152
153     void updateInnerTextValue();
154
155     // The value which is drawn by a renderer.
156     String visibleValue() const;
157     String convertFromVisibleValue(const String&) const;
158     // Returns true if the specified string can be set as the value of HTMLInputElement.
159     bool isAcceptableValue(const String&) const;
160
161     const String& suggestedValue() const;
162     void setSuggestedValue(const String&);
163
164     void setEditingValue(const String&);
165
166     double valueAsDate() const;
167     void setValueAsDate(double, ExceptionCode&);
168
169     double valueAsNumber() const;
170     void setValueAsNumber(double, ExceptionCode&, TextFieldEventBehavior = DispatchNoEvent);
171
172     virtual String placeholder() const;
173     virtual void setPlaceholder(const String&);
174
175     String valueWithDefault() const;
176
177     void setValueFromRenderer(const String&);
178
179     bool canHaveSelection() const;
180
181     virtual bool rendererIsNeeded(const NodeRenderingContext&);
182     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
183     virtual void detach();
184
185     // FIXME: For isActivatedSubmit and setActivatedSubmit, we should use the NVI-idiom here by making
186     // it private virtual in all classes and expose a public method in HTMLFormControlElement to call
187     // the private virtual method.
188     virtual bool isActivatedSubmit() const;
189     virtual void setActivatedSubmit(bool flag);
190
191     String altText() const;
192
193     int maxResults() const { return m_maxResults; }
194
195     String defaultValue() const;
196     void setDefaultValue(const String&);
197
198     Vector<String> acceptMIMETypes();
199     Vector<String> acceptFileExtensions();
200     String accept() const;
201     String alt() const;
202
203     void setSize(unsigned);
204
205     KURL src() const;
206
207     virtual int maxLength() const;
208     void setMaxLength(int, ExceptionCode&);
209
210     bool multiple() const;
211
212     bool isAutofilled() const { return m_isAutofilled; }
213     void setAutofilled(bool = true);
214
215     FileList* files();
216     void setFiles(PassRefPtr<FileList>);
217
218     // Returns true if the given DragData has more than one dropped files.
219     bool receiveDroppedFiles(const DragData*);
220
221 #if ENABLE(FILE_SYSTEM)
222     String droppedFileSystemId();
223 #endif
224
225     Icon* icon() const;
226     // These functions are used for rendering the input active during a
227     // drag-and-drop operation.
228     bool canReceiveDroppedFiles() const;
229     void setCanReceiveDroppedFiles(bool);
230
231     void addSearchResult();
232     void onSearch();
233
234 #if ENABLE(DATALIST)
235     HTMLElement* list() const;
236 #endif
237
238     HTMLInputElement* checkedRadioButtonForGroup() const;
239     bool isInRequiredRadioButtonGroup() const;
240
241     void setValueInternal(const String&, TextFieldEventBehavior);
242
243     bool isTextFormControlFocusable() const;
244     bool isTextFormControlKeyboardFocusable(KeyboardEvent*) const;
245     bool isTextFormControlMouseFocusable() const;
246
247     void cacheSelectionInResponseToSetValue(int caretOffset) { cacheSelection(caretOffset, caretOffset, SelectionHasNoDirection); }
248
249 #if ENABLE(INPUT_TYPE_COLOR)
250     // For test purposes.
251     void selectColorInColorChooser(const Color&);
252 #endif
253
254     String defaultToolTip() const;
255
256 #if ENABLE(MEDIA_CAPTURE)
257     String capture() const;
258     void setCapture(const String& value);
259 #endif
260
261     static const int maximumLength;
262
263     unsigned height() const;
264     unsigned width() const;
265     void setHeight(unsigned);
266     void setWidth(unsigned);
267
268     virtual const AtomicString& name() const OVERRIDE;
269
270 protected:
271     HTMLInputElement(const QualifiedName&, Document*, HTMLFormElement*, bool createdByParser);
272     void createShadowSubtree();
273     virtual void defaultEventHandler(Event*);
274
275 private:
276     enum AutoCompleteSetting { Uninitialized, On, Off };
277
278     virtual void willChangeForm() OVERRIDE;
279     virtual void didChangeForm() OVERRIDE;
280     virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
281     virtual void removedFrom(ContainerNode*) OVERRIDE;
282     virtual void didMoveToNewDocument(Document* oldDocument) OVERRIDE;
283
284     virtual bool isKeyboardFocusable(KeyboardEvent*) const;
285     virtual bool isMouseFocusable() const;
286     virtual bool isEnumeratable() const;
287     virtual bool supportLabels() const OVERRIDE;
288     virtual void updateFocusAppearance(bool restorePreviousSelection);
289     virtual void aboutToUnload();
290     virtual bool shouldUseInputMethod();
291
292     virtual bool isTextFormControl() const { return isTextField(); }
293
294     virtual bool canTriggerImplicitSubmission() const { return isTextField(); }
295
296     virtual const AtomicString& formControlType() const;
297
298     virtual FormControlState saveFormControlState() const OVERRIDE;
299     virtual void restoreFormControlState(const FormControlState&) OVERRIDE;
300
301     virtual bool canStartSelection() const;
302
303     virtual void accessKeyAction(bool sendMouseEvents);
304
305     virtual void parseAttribute(const Attribute&) OVERRIDE;
306     virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE;
307     virtual void collectStyleForAttribute(const Attribute&, StylePropertySet*) OVERRIDE;
308     virtual void finishParsingChildren();
309
310     virtual void copyNonAttributePropertiesFromElement(const Element&);
311
312     virtual void attach();
313
314     virtual bool appendFormData(FormDataList&, bool);
315
316     virtual bool isSuccessfulSubmitButton() const;
317
318     virtual void reset();
319
320     virtual void* preDispatchEventHandler(Event*);
321     virtual void postDispatchEventHandler(Event*, void* dataFromPreDispatch);
322
323     virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
324
325     virtual bool hasUnacceptableValue() const;
326
327     virtual bool isInRange() const;
328     virtual bool isOutOfRange() const;
329
330     virtual void documentDidResumeFromPageCache();
331
332     virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
333
334     bool needsSuspensionCallback();
335     void registerForSuspensionCallbackIfNeeded();
336     void unregisterForSuspensionCallbackIfNeeded();
337
338     bool supportsMaxLength() const { return isTextType(); }
339     bool isTextType() const;
340     bool tooLong(const String&, NeedsToCheckDirtyFlag) const;
341
342     virtual bool supportsPlaceholder() const;
343     virtual bool isPlaceholderEmpty() const OVERRIDE;
344     virtual void updatePlaceholderText();
345     virtual bool isEmptyValue() const OVERRIDE { return innerTextValue().isEmpty(); }
346     virtual bool isEmptySuggestedValue() const { return suggestedValue().isEmpty(); }
347     virtual void handleFocusEvent();
348     virtual void handleBlurEvent();
349
350     virtual bool isOptionalFormControl() const { return !isRequiredFormControl(); }
351     virtual bool isRequiredFormControl() const;
352     virtual bool recalcWillValidate() const;
353     virtual void requiredAttributeChanged() OVERRIDE;
354
355     void updateType();
356     
357     virtual void subtreeHasChanged();
358
359
360 #if ENABLE(DATALIST)
361     HTMLDataListElement* dataList() const;
362 #endif
363     void parseMaxLengthAttribute(const Attribute&);
364     void updateValueIfNeeded();
365
366     // Returns null if this isn't associated with any radio button group.
367     CheckedRadioButtons* checkedRadioButtons() const;
368     void addToRadioButtonGroup();
369     void removeFromRadioButtonGroup();
370
371     AtomicString m_name;
372     String m_valueIfDirty;
373     String m_suggestedValue;
374     int m_size;
375     int m_maxLength;
376     short m_maxResults;
377     bool m_isChecked : 1;
378     bool m_reflectsCheckedAttribute : 1;
379     bool m_isIndeterminate : 1;
380     bool m_hasType : 1;
381     bool m_isActivatedSubmit : 1;
382     unsigned m_autocomplete : 2; // AutoCompleteSetting
383     bool m_isAutofilled : 1;
384 #if ENABLE(DATALIST)
385     bool m_hasNonEmptyList : 1;
386 #endif
387     bool m_stateRestored : 1;
388     bool m_parsingInProgress : 1;
389     bool m_wasModifiedByUser : 1;
390     bool m_canReceiveDroppedFiles : 1;
391     OwnPtr<InputType> m_inputType;
392 };
393
394 } //namespace
395 #endif