Generate Element casting helper functions
[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  * 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 "FileChooser.h"
29 #include "HTMLTextFormControlElement.h"
30 #include "StepRange.h"
31 #include <memory>
32
33 #if PLATFORM(IOS)
34 #include "DateComponents.h"
35 #endif
36
37 namespace WebCore {
38
39 class CheckedRadioButtons;
40 class DragData;
41 class FileList;
42 class HTMLDataListElement;
43 class HTMLImageLoader;
44 class HTMLOptionElement;
45 class Icon;
46 class InputType;
47 class ListAttributeTargetObserver;
48 class TextControlInnerTextElement;
49 class URL;
50 struct DateTimeChooserParameters;
51
52 struct InputElementClickState {
53     InputElementClickState()
54         : stateful(false)
55         , checked(false)
56         , indeterminate(false)
57     { }
58     bool stateful;
59     bool checked;
60     bool indeterminate;
61     RefPtr<HTMLInputElement> checkedRadioButton;
62 };
63
64 class HTMLInputElement : public HTMLTextFormControlElement {
65 public:
66     static PassRefPtr<HTMLInputElement> create(const QualifiedName&, Document&, HTMLFormElement*, bool createdByParser);
67     virtual ~HTMLInputElement();
68
69     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitspeechchange);
70
71     virtual HTMLInputElement* toInputElement() override { return this; }
72
73     WEBCORE_EXPORT virtual bool shouldAutocomplete() const override;
74
75     // For ValidityState
76     virtual bool hasBadInput() const override;
77     virtual bool patternMismatch() const override;
78     virtual bool rangeUnderflow() const override;
79     virtual bool rangeOverflow() const override;
80     virtual bool stepMismatch() const override;
81     virtual bool tooLong() const override;
82     virtual bool typeMismatch() const override;
83     virtual bool valueMissing() const override;
84     virtual String validationMessage() const override;
85
86     // Returns the minimum value for type=date, number, or range.  Don't call this for other types.
87     double minimum() const;
88     // Returns the maximum value for type=date, number, or range.  Don't call this for other types.
89     // This always returns a value which is >= minimum().
90     double maximum() const;
91     // Sets the "allowed value step" defined in the HTML spec to the specified double pointer.
92     // Returns false if there is no "allowed value step."
93     bool getAllowedValueStep(Decimal*) const;
94     StepRange createStepRange(AnyStepHandling) const;
95
96 #if ENABLE(DATALIST_ELEMENT)
97     Decimal findClosestTickMarkValue(const Decimal&);
98 #endif
99
100     // Implementations of HTMLInputElement::stepUp() and stepDown().
101     void stepUp(int, ExceptionCode&);
102     void stepDown(int, ExceptionCode&);
103     void stepUp(ExceptionCode& ec) { stepUp(1, ec); }
104     void stepDown(ExceptionCode& ec) { stepDown(1, ec); }
105     // stepUp()/stepDown() for user-interaction.
106     bool isSteppable() const;
107
108     bool isTextButton() const;
109
110     bool isRadioButton() const;
111     WEBCORE_EXPORT bool isTextField() const;
112     WEBCORE_EXPORT bool isSearchField() const;
113     bool isInputTypeHidden() const;
114     WEBCORE_EXPORT bool isPasswordField() const;
115     bool isCheckbox() const;
116     bool isRangeControl() const;
117
118 #if ENABLE(INPUT_TYPE_COLOR)
119     bool isColorControl() const;
120 #endif
121
122     // FIXME: It's highly likely that any call site calling this function should instead
123     // be using a different one. Many input elements behave like text fields, and in addition
124     // any unknown input type is treated as text. Consider, for example, isTextField or
125     // isTextField && !isPasswordField.
126     WEBCORE_EXPORT bool isText() const;
127
128     WEBCORE_EXPORT bool isEmailField() const;
129     bool isFileUpload() const;
130     bool isImageButton() const;
131     WEBCORE_EXPORT bool isNumberField() const;
132     bool isSubmitButton() const;
133     WEBCORE_EXPORT bool isTelephoneField() const;
134     WEBCORE_EXPORT bool isURLField() const;
135     WEBCORE_EXPORT bool isDateField() const;
136     WEBCORE_EXPORT bool isDateTimeField() const;
137     WEBCORE_EXPORT bool isDateTimeLocalField() const;
138     WEBCORE_EXPORT bool isMonthField() const;
139     WEBCORE_EXPORT bool isTimeField() const;
140     WEBCORE_EXPORT bool isWeekField() const;
141
142 #if PLATFORM(IOS)
143     DateComponents::Type dateType() const;
144 #endif
145
146     HTMLElement* containerElement() const;
147     virtual TextControlInnerTextElement* innerTextElement() const override;
148     HTMLElement* innerBlockElement() const;
149     HTMLElement* innerSpinButtonElement() const;
150     HTMLElement* resultsButtonElement() const;
151     HTMLElement* cancelButtonElement() const;
152     HTMLElement* sliderThumbElement() const;
153     HTMLElement* sliderTrackElement() const;
154     virtual HTMLElement* placeholderElement() const override;
155
156     bool checked() const { return m_isChecked; }
157     void setChecked(bool, TextFieldEventBehavior = DispatchNoEvent);
158
159     // 'indeterminate' is a state independent of the checked state that causes the control to draw in a way that hides the actual state.
160     bool indeterminate() const { return m_isIndeterminate; }
161     void setIndeterminate(bool);
162     // shouldAppearChecked is used by the rendering tree/CSS while checked() is used by JS to determine checked state
163     bool shouldAppearChecked() const;
164     virtual bool shouldAppearIndeterminate() const override;
165
166     int size() const;
167     bool sizeShouldIncludeDecoration(int& preferredSize) const;
168     float decorationWidth() const;
169
170     void setType(const String&);
171
172     virtual String value() const override;
173     void setValue(const String&, ExceptionCode&, TextFieldEventBehavior = DispatchNoEvent);
174     WEBCORE_EXPORT void setValue(const String&, TextFieldEventBehavior = DispatchNoEvent);
175     WEBCORE_EXPORT void setValueForUser(const String&);
176     // Checks if the specified string would be a valid value.
177     // We should not call this for types with no string value such as CHECKBOX and RADIO.
178     bool isValidValue(const String&) const;
179     bool hasDirtyValue() const { return !m_valueIfDirty.isNull(); };
180
181     String sanitizeValue(const String&) const;
182
183     String localizeValue(const String&) const;
184
185     // The value which is drawn by a renderer.
186     String visibleValue() const;
187
188     WEBCORE_EXPORT void setEditingValue(const String&);
189
190     double valueAsDate() const;
191     void setValueAsDate(double, ExceptionCode&);
192
193     WEBCORE_EXPORT double valueAsNumber() const;
194     WEBCORE_EXPORT void setValueAsNumber(double, ExceptionCode&, TextFieldEventBehavior = DispatchNoEvent);
195
196     String valueWithDefault() const;
197
198     void setValueFromRenderer(const String&);
199
200     bool canHaveSelection() const;
201
202     virtual bool rendererIsNeeded(const RenderStyle&) override;
203     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
204     virtual void willAttachRenderers() override;
205     virtual void didAttachRenderers() override;
206     virtual void didDetachRenderers() override;
207
208     // FIXME: For isActivatedSubmit and setActivatedSubmit, we should use the NVI-idiom here by making
209     // it private virtual in all classes and expose a public method in HTMLFormControlElement to call
210     // the private virtual method.
211     virtual bool isActivatedSubmit() const override;
212     virtual void setActivatedSubmit(bool flag) override;
213
214     String altText() const;
215
216     void willDispatchEvent(Event&, InputElementClickState&);
217     void didDispatchClickEvent(Event&, const InputElementClickState&);
218
219     int maxResults() const { return m_maxResults; }
220
221     String defaultValue() const;
222     void setDefaultValue(const String&);
223
224     Vector<String> acceptMIMETypes();
225     Vector<String> acceptFileExtensions();
226     String accept() const;
227     String alt() const;
228
229     void setSize(unsigned);
230     void setSize(unsigned, ExceptionCode&);
231
232     URL src() const;
233
234     virtual int maxLength() const override;
235     void setMaxLength(int, ExceptionCode&);
236
237     bool multiple() const;
238
239     bool isAutofilled() const { return m_isAutofilled; }
240     WEBCORE_EXPORT void setAutofilled(bool = true);
241
242     FileList* files();
243     void setFiles(PassRefPtr<FileList>);
244
245 #if ENABLE(DRAG_SUPPORT)
246     // Returns true if the given DragData has more than one dropped files.
247     bool receiveDroppedFiles(const DragData&);
248 #endif
249
250     Icon* icon() const;
251 #if PLATFORM(IOS)
252     String displayString() const;
253 #endif
254     // These functions are used for rendering the input active during a
255     // drag-and-drop operation.
256     bool canReceiveDroppedFiles() const;
257     void setCanReceiveDroppedFiles(bool);
258
259     void addSearchResult();
260     void onSearch();
261
262     void updateClearButtonVisibility();
263
264     virtual bool willRespondToMouseClickEvents() override;
265
266 #if ENABLE(DATALIST_ELEMENT)
267     HTMLElement* list() const;
268     HTMLDataListElement* dataList() const;
269     void listAttributeTargetChanged();
270 #endif
271
272     HTMLInputElement* checkedRadioButtonForGroup() const;
273     bool isInRequiredRadioButtonGroup();
274
275     // Functions for InputType classes.
276     void setValueInternal(const String&, TextFieldEventBehavior);
277     bool isTextFormControlFocusable() const;
278     bool isTextFormControlKeyboardFocusable(KeyboardEvent*) const;
279     bool isTextFormControlMouseFocusable() const;
280     bool valueAttributeWasUpdatedAfterParsing() const { return m_valueAttributeWasUpdatedAfterParsing; }
281
282     void cacheSelectionInResponseToSetValue(int caretOffset) { cacheSelection(caretOffset, caretOffset, SelectionHasNoDirection); }
283
284 #if ENABLE(INPUT_TYPE_COLOR)
285     // For test purposes.
286     WEBCORE_EXPORT void selectColorInColorChooser(const Color&);
287 #endif
288
289     String defaultToolTip() const;
290
291 #if ENABLE(MEDIA_CAPTURE)
292     bool shouldUseMediaCapture() const;
293 #endif
294
295     static const int maximumLength;
296
297     unsigned height() const;
298     unsigned width() const;
299     void setHeight(unsigned);
300     void setWidth(unsigned);
301
302     virtual void blur() override;
303     void defaultBlur();
304
305     virtual const AtomicString& name() const override;
306
307     void endEditing();
308
309     static Vector<FileChooserFileInfo> filesFromFileInputFormControlState(const FormControlState&);
310
311     virtual bool matchesReadWritePseudoClass() const override;
312     virtual void setRangeText(const String& replacement, ExceptionCode&) override;
313     virtual void setRangeText(const String& replacement, unsigned start, unsigned end, const String& selectionMode, ExceptionCode&) override;
314
315     bool hasImageLoader() const { return !!m_imageLoader; }
316     HTMLImageLoader* imageLoader();
317
318 #if ENABLE(DATE_AND_TIME_INPUT_TYPES)
319     bool setupDateTimeChooserParameters(DateTimeChooserParameters&);
320 #endif
321
322 protected:
323     HTMLInputElement(const QualifiedName&, Document&, HTMLFormElement*, bool createdByParser);
324
325     virtual void defaultEventHandler(Event*) override;
326
327 private:
328     enum AutoCompleteSetting { Uninitialized, On, Off };
329
330     virtual void didAddUserAgentShadowRoot(ShadowRoot*) override;
331
332     virtual void willChangeForm() override;
333     virtual void didChangeForm() override;
334     virtual InsertionNotificationRequest insertedInto(ContainerNode&) override;
335     virtual void removedFrom(ContainerNode&) override;
336     virtual void didMoveToNewDocument(Document* oldDocument) override;
337
338     virtual bool hasCustomFocusLogic() const override;
339     virtual bool isKeyboardFocusable(KeyboardEvent*) const override;
340     virtual bool isMouseFocusable() const override;
341     virtual bool isEnumeratable() const override;
342     virtual bool supportLabels() const override;
343     virtual void updateFocusAppearance(bool restorePreviousSelection) override;
344     virtual bool shouldUseInputMethod() override final;
345
346     virtual bool isTextFormControl() const override { return isTextField(); }
347
348     virtual bool canTriggerImplicitSubmission() const override { return isTextField(); }
349
350     virtual const AtomicString& formControlType() const override;
351
352     virtual bool shouldSaveAndRestoreFormControlState() const override;
353     virtual FormControlState saveFormControlState() const override;
354     virtual void restoreFormControlState(const FormControlState&) override;
355
356     virtual bool canStartSelection() const override;
357
358     virtual void accessKeyAction(bool sendMouseEvents) override;
359
360     virtual void parseAttribute(const QualifiedName&, const AtomicString&) override;
361     virtual bool isPresentationAttribute(const QualifiedName&) const override;
362     virtual void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStyleProperties&) override;
363     virtual void finishParsingChildren() override;
364
365     virtual void copyNonAttributePropertiesFromElement(const Element&) override;
366
367     virtual bool appendFormData(FormDataList&, bool) override;
368
369     virtual bool isSuccessfulSubmitButton() const override;
370
371     virtual void reset() override;
372
373     virtual bool isURLAttribute(const Attribute&) const override;
374     virtual bool isInRange() const override;
375     virtual bool isOutOfRange() const override;
376
377     virtual void documentDidResumeFromPageCache() override;
378 #if ENABLE(INPUT_TYPE_COLOR)
379     virtual void documentWillSuspendForPageCache() override;
380 #endif
381
382     virtual void addSubresourceAttributeURLs(ListHashSet<URL>&) const override;
383
384     bool needsSuspensionCallback();
385     void registerForSuspensionCallbackIfNeeded();
386     void unregisterForSuspensionCallbackIfNeeded();
387
388     bool supportsMaxLength() const { return isTextType(); }
389     bool isTextType() const;
390     bool tooLong(const String&, NeedsToCheckDirtyFlag) const;
391
392     virtual bool supportsPlaceholder() const override;
393     virtual void updatePlaceholderText() override;
394     virtual bool isEmptyValue() const override { return innerTextValue().isEmpty(); }
395     virtual void handleFocusEvent(Node* oldFocusedNode, FocusDirection) override;
396     virtual void handleBlurEvent() override;
397
398     virtual bool isOptionalFormControl() const override { return !isRequiredFormControl(); }
399     virtual bool isRequiredFormControl() const override;
400     virtual bool recalcWillValidate() const override;
401     virtual void requiredAttributeChanged() override;
402
403     void updateType();
404     
405     virtual void subtreeHasChanged() override;
406
407 #if ENABLE(DATALIST_ELEMENT)
408     void resetListAttributeTargetObserver();
409 #endif
410     void parseMaxLengthAttribute(const AtomicString&);
411     void updateValueIfNeeded();
412
413     // Returns null if this isn't associated with any radio button group.
414     CheckedRadioButtons* checkedRadioButtons() const;
415     void addToRadioButtonGroup();
416     void removeFromRadioButtonGroup();
417
418     AtomicString m_name;
419     String m_valueIfDirty;
420     int m_size;
421     int m_maxLength;
422     short m_maxResults;
423     bool m_isChecked : 1;
424     bool m_reflectsCheckedAttribute : 1;
425     bool m_isIndeterminate : 1;
426     bool m_hasType : 1;
427     bool m_isActivatedSubmit : 1;
428     unsigned m_autocomplete : 2; // AutoCompleteSetting
429     bool m_isAutofilled : 1;
430 #if ENABLE(DATALIST_ELEMENT)
431     bool m_hasNonEmptyList : 1;
432 #endif
433     bool m_stateRestored : 1;
434     bool m_parsingInProgress : 1;
435     bool m_valueAttributeWasUpdatedAfterParsing : 1;
436     bool m_wasModifiedByUser : 1;
437     bool m_canReceiveDroppedFiles : 1;
438 #if ENABLE(TOUCH_EVENTS)
439     bool m_hasTouchEventHandler : 1;
440 #endif
441     std::unique_ptr<InputType> m_inputType;
442     // The ImageLoader must be owned by this element because the loader code assumes
443     // that it lives as long as its owning element lives. If we move the loader into
444     // the ImageInput object we may delete the loader while this element lives on.
445     std::unique_ptr<HTMLImageLoader> m_imageLoader;
446 #if ENABLE(DATALIST_ELEMENT)
447     std::unique_ptr<ListAttributeTargetObserver> m_listAttributeTargetObserver;
448 #endif
449 };
450
451 } //namespace
452 #endif