Simplify and streamline some Color-related code to prepare for some Color/ExtendedCol...
[WebKit-https.git] / Source / WebCore / html / InputType.h
1 /*
2  * Copyright (C) 2010 Google Inc. All rights reserved.
3  * Copyright (C) 2011-2017 Apple Inc. All rights reserved.
4  * Copyright (C) 2012 Samsung Electronics. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following disclaimer
14  * in the documentation and/or other materials provided with the
15  * distribution.
16  *     * Neither the name of Google Inc. nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #pragma once
34
35 #include "HTMLTextFormControlElement.h"
36 #include "RenderPtr.h"
37 #include "StepRange.h"
38 #include <wtf/FastMalloc.h>
39 #include <wtf/Forward.h>
40 #include <wtf/RefPtr.h>
41
42 #if PLATFORM(IOS)
43 #include "DateComponents.h"
44 #endif
45
46 namespace WebCore {
47
48 class BeforeTextInsertedEvent;
49 class Chrome;
50 class DOMFormData;
51 class DateComponents;
52 class DragData;
53 class Event;
54 class FileList;
55 class HTMLElement;
56 class HTMLFormElement;
57 class HTMLInputElement;
58 class Icon;
59 class KeyboardEvent;
60 class MouseEvent;
61 class Node;
62 class RenderStyle;
63 class TextControlInnerTextElement;
64 class TouchEvent;
65
66 struct InputElementClickState;
67
68 // An InputType object represents the type-specific part of an HTMLInputElement.
69 // Do not expose instances of InputType and classes derived from it to classes
70 // other than HTMLInputElement.
71 class InputType {
72     WTF_MAKE_FAST_ALLOCATED;
73
74 public:
75     static std::unique_ptr<InputType> create(HTMLInputElement&, const AtomicString&);
76     static std::unique_ptr<InputType> createText(HTMLInputElement&);
77     virtual ~InputType();
78
79     static bool themeSupportsDataListUI(InputType*);
80
81     virtual const AtomicString& formControlType() const = 0;
82
83     // Type query functions.
84
85     // Any time we are using one of these functions it's best to refactor
86     // to add a virtual function to allow the input type object to do the
87     // work instead, or at least make a query function that asks a higher
88     // level question. These functions make the HTMLInputElement class
89     // inflexible because it's harder to add new input types if there is
90     // scattered code with special cases for various types.
91
92     virtual bool isCheckbox() const;
93     virtual bool isColorControl() const;
94     virtual bool isDateField() const;
95     virtual bool isDateTimeField() const;
96     virtual bool isDateTimeLocalField() const;
97     virtual bool isEmailField() const;
98     virtual bool isFileUpload() const;
99     virtual bool isHiddenType() const;
100     virtual bool isImageButton() const;
101     virtual bool supportLabels() const;
102     virtual bool isMonthField() const;
103     virtual bool isNumberField() const;
104     virtual bool isPasswordField() const;
105     virtual bool isRadioButton() const;
106     virtual bool isRangeControl() const;
107     virtual bool isSearchField() const;
108     virtual bool isSubmitButton() const;
109     virtual bool isTelephoneField() const;
110     virtual bool isTextButton() const;
111     virtual bool isTextField() const;
112     virtual bool isTextType() const;
113     virtual bool isTimeField() const;
114     virtual bool isURLField() const;
115     virtual bool isWeekField() const;
116
117     // Form value functions.
118
119     virtual bool shouldSaveAndRestoreFormControlState() const;
120     virtual FormControlState saveFormControlState() const;
121     virtual void restoreFormControlState(const FormControlState&);
122     virtual bool isFormDataAppendable() const;
123     virtual bool appendFormData(DOMFormData&, bool multipart) const;
124
125     // DOM property functions.
126
127     virtual bool getTypeSpecificValue(String&); // Checked first, before internal storage or the value attribute.
128     virtual String fallbackValue() const; // Checked last, if both internal storage and value attribute are missing.
129     virtual String defaultValue() const; // Checked after even fallbackValue, only when the valueWithDefault function is called.
130     virtual double valueAsDate() const;
131     virtual ExceptionOr<void> setValueAsDate(double) const;
132     virtual double valueAsDouble() const;
133     virtual ExceptionOr<void> setValueAsDouble(double, TextFieldEventBehavior) const;
134     virtual ExceptionOr<void> setValueAsDecimal(const Decimal&, TextFieldEventBehavior) const;
135
136     // Validation functions.
137
138     virtual String validationMessage() const;
139     virtual bool supportsValidation() const;
140     virtual bool typeMismatchFor(const String&) const;
141     virtual bool supportsRequired() const;
142     virtual bool valueMissing(const String&) const;
143     virtual bool hasBadInput() const;
144     virtual bool patternMismatch(const String&) const;
145     bool rangeUnderflow(const String&) const;
146     bool rangeOverflow(const String&) const;
147     bool isInRange(const String&) const;
148     bool isOutOfRange(const String&) const;
149     virtual Decimal defaultValueForStepUp() const;
150     double minimum() const;
151     double maximum() const;
152     virtual bool sizeShouldIncludeDecoration(int defaultSize, int& preferredSize) const;
153     virtual float decorationWidth() const;
154     bool stepMismatch(const String&) const;
155     virtual bool getAllowedValueStep(Decimal*) const;
156     virtual StepRange createStepRange(AnyStepHandling) const;
157     virtual ExceptionOr<void> stepUp(int);
158     virtual void stepUpFromRenderer(int);
159     virtual String badInputText() const;
160     virtual String typeMismatchText() const;
161     virtual String valueMissingText() const;
162     virtual bool canSetStringValue() const;
163     virtual String localizeValue(const String&) const;
164     virtual String visibleValue() const;
165     virtual bool isEmptyValue() const;
166
167     // Type check for the current input value. We do nothing for some types
168     // though typeMismatchFor() does something for them because of value sanitization.
169     virtual bool typeMismatch() const;
170
171     // Return value of null string means "use the default value".
172     // This function must be called only by HTMLInputElement::sanitizeValue().
173     virtual String sanitizeValue(const String&) const;
174
175     // Event handlers.
176
177     virtual void handleClickEvent(MouseEvent&);
178     virtual void handleMouseDownEvent(MouseEvent&);
179     virtual void willDispatchClick(InputElementClickState&);
180     virtual void didDispatchClick(Event&, const InputElementClickState&);
181     virtual void handleDOMActivateEvent(Event&);
182     virtual void handleKeydownEvent(KeyboardEvent&);
183     virtual void handleKeypressEvent(KeyboardEvent&);
184     virtual void handleKeyupEvent(KeyboardEvent&);
185     virtual void handleBeforeTextInsertedEvent(BeforeTextInsertedEvent&);
186     virtual void forwardEvent(Event&);
187
188 #if ENABLE(TOUCH_EVENTS)
189     virtual void handleTouchEvent(TouchEvent&);
190 #endif
191
192     // Helpers for event handlers.
193
194     virtual bool shouldSubmitImplicitly(Event&);
195     virtual bool hasCustomFocusLogic() const;
196     virtual bool isKeyboardFocusable(KeyboardEvent&) const;
197     virtual bool isMouseFocusable() const;
198     virtual bool shouldUseInputMethod() const;
199     virtual void handleFocusEvent(Node* oldFocusedNode, FocusDirection);
200     virtual void handleBlurEvent();
201     virtual void accessKeyAction(bool sendMouseEvents);
202     virtual bool canBeSuccessfulSubmitButton();
203     virtual void subtreeHasChanged();
204     virtual void blur();
205
206     virtual void elementDidBlur() { }
207
208 #if ENABLE(TOUCH_EVENTS)
209     virtual bool hasTouchEventHandler() const;
210 #endif
211
212     // Shadow tree handling.
213
214     virtual void createShadowSubtree();
215     virtual void destroyShadowSubtree();
216
217     virtual HTMLElement* containerElement() const { return nullptr; }
218     virtual HTMLElement* innerBlockElement() const { return nullptr; }
219     virtual RefPtr<TextControlInnerTextElement> innerTextElement() const;
220     virtual HTMLElement* innerSpinButtonElement() const { return nullptr; }
221     virtual HTMLElement* capsLockIndicatorElement() const { return nullptr; }
222     virtual HTMLElement* autoFillButtonElement() const { return nullptr; }
223     virtual HTMLElement* resultsButtonElement() const { return nullptr; }
224     virtual HTMLElement* cancelButtonElement() const { return nullptr; }
225     virtual HTMLElement* sliderThumbElement() const { return nullptr; }
226     virtual HTMLElement* sliderTrackElement() const { return nullptr; }
227     virtual HTMLElement* placeholderElement() const;
228
229 #if ENABLE(ALTERNATIVE_PRESENTATION_BUTTON_ELEMENT)
230     virtual HTMLElement* alternativePresentationButtonElement() const { return nullptr; }
231 #endif
232
233     // Miscellaneous functions.
234
235     virtual bool rendererIsNeeded();
236     virtual RenderPtr<RenderElement> createInputRenderer(RenderStyle&&);
237     virtual void addSearchResult();
238     virtual void attach();
239     virtual void detach();
240     virtual void minOrMaxAttributeChanged();
241     virtual void stepAttributeChanged();
242     virtual void altAttributeChanged();
243     virtual void srcAttributeChanged();
244     virtual void maxResultsAttributeChanged();
245     virtual bool shouldRespectAlignAttribute();
246     virtual FileList* files();
247     virtual void setFiles(RefPtr<FileList>&&);
248     virtual Icon* icon() const;
249     virtual bool shouldSendChangeEventAfterCheckedChanged();
250     virtual bool canSetValue(const String&);
251     virtual bool storesValueSeparateFromAttribute();
252     virtual void setValue(const String&, bool valueChanged, TextFieldEventBehavior);
253     virtual bool shouldResetOnDocumentActivation();
254     virtual bool shouldRespectListAttribute();
255     virtual bool isEnumeratable();
256     virtual bool isCheckable();
257     virtual bool isSteppable() const;
258     virtual bool shouldRespectHeightAndWidthAttributes();
259     virtual bool supportsPlaceholder() const;
260     virtual bool supportsReadOnly() const;
261     virtual void updateInnerTextValue();
262     virtual void updatePlaceholderText();
263     virtual void attributeChanged(const QualifiedName&);
264     virtual void multipleAttributeChanged();
265     virtual void disabledAttributeChanged();
266     virtual void readonlyAttributeChanged();
267     virtual void requiredAttributeChanged();
268     virtual void capsLockStateMayHaveChanged();
269     virtual void updateAutoFillButton();
270     virtual String defaultToolTip() const;
271     virtual bool matchesIndeterminatePseudoClass() const;
272     virtual bool shouldAppearIndeterminate() const;
273     virtual bool supportsSelectionAPI() const;
274     virtual Color valueAsColor() const;
275     virtual void selectColor(StringView);
276
277     // Parses the specified string for the type, and return
278     // the Decimal value for the parsing result if the parsing
279     // succeeds; Returns defaultValue otherwise. This function can
280     // return NaN or Infinity only if defaultValue is NaN or Infinity.
281     virtual Decimal parseToNumber(const String&, const Decimal& defaultValue) const;
282
283     // Parses the specified string for this InputType, and returns true if it
284     // is successfully parsed. An instance pointed by the DateComponents*
285     // parameter will have parsed values and be modified even if the parsing
286     // fails. The DateComponents* parameter may be null.
287     virtual bool parseToDateComponents(const String&, DateComponents*) const;
288
289     // Create a string representation of the specified Decimal value for the
290     // input type. If NaN or Infinity is specified, this returns an empty
291     // string. This should not be called for types without valueAsNumber.
292     virtual String serialize(const Decimal&) const;
293
294     // Gets width and height of the input element if the type of the
295     // element is image. It returns 0 if the element is not image type.
296     virtual unsigned height() const;
297     virtual unsigned width() const;
298
299     void dispatchSimulatedClickIfActive(KeyboardEvent&) const;
300
301 #if ENABLE(DATALIST_ELEMENT)
302     virtual void listAttributeTargetChanged();
303     virtual std::optional<Decimal> findClosestTickMarkValue(const Decimal&);
304 #endif
305
306 #if ENABLE(DRAG_SUPPORT)
307     virtual bool receiveDroppedFiles(const DragData&);
308 #endif
309
310 #if PLATFORM(IOS)
311     virtual DateComponents::Type dateType() const;
312 #endif
313     virtual String displayString() const;
314
315 protected:
316     explicit InputType(HTMLInputElement& element) : m_element(element) { }
317     HTMLInputElement& element() const { return m_element; }
318     Chrome* chrome() const;
319     Decimal parseToNumberOrNaN(const String&) const;
320
321 private:
322     // Helper for stepUp()/stepDown(). Adds step value * count to the current value.
323     ExceptionOr<void> applyStep(int count, AnyStepHandling, TextFieldEventBehavior);
324
325     // Raw pointer because the HTMLInputElement object owns this InputType object.
326     HTMLInputElement& m_element;
327 };
328
329 } // namespace WebCore
330
331 #define SPECIALIZE_TYPE_TRAITS_INPUT_TYPE(ToValueTypeName, predicate) \
332 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
333 static bool isType(const WebCore::InputType& input) { return input.predicate; } \
334 SPECIALIZE_TYPE_TRAITS_END()