• 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, 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 "core/html/HTMLTextFormControlElement.h"
29 #include "core/html/forms/StepRange.h"
30 #include "platform/FileChooser.h"
31 
32 namespace WebCore {
33 
34 class DragData;
35 class ExceptionState;
36 class FileList;
37 class HTMLDataListElement;
38 class HTMLImageLoader;
39 class HTMLOptionElement;
40 class InputType;
41 class InputTypeView;
42 class KURL;
43 class ListAttributeTargetObserver;
44 class RadioButtonGroupScope;
45 struct DateTimeChooserParameters;
46 
47 class HTMLInputElement : public HTMLTextFormControlElement {
48 public:
49     static PassRefPtrWillBeRawPtr<HTMLInputElement> create(Document&, HTMLFormElement*, bool createdByParser);
50     virtual ~HTMLInputElement();
51     virtual void trace(Visitor*) OVERRIDE;
52 
53     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitspeechchange);
54 
55     virtual bool shouldAutocomplete() const OVERRIDE FINAL;
56 
57     // For ValidityState
58     virtual bool hasBadInput() const OVERRIDE FINAL;
59     virtual bool patternMismatch() const OVERRIDE FINAL;
60     virtual bool rangeUnderflow() const OVERRIDE FINAL;
61     virtual bool rangeOverflow() const OVERRIDE FINAL;
62     virtual bool stepMismatch() const OVERRIDE FINAL;
63     virtual bool tooLong() const OVERRIDE FINAL;
64     virtual bool typeMismatch() const OVERRIDE FINAL;
65     virtual bool valueMissing() const OVERRIDE FINAL;
66     virtual String validationMessage() const OVERRIDE FINAL;
67 
68     // Returns the minimum value for type=date, number, or range.  Don't call this for other types.
69     double minimum() const;
70     // Returns the maximum value for type=date, number, or range.  Don't call this for other types.
71     // This always returns a value which is >= minimum().
72     double maximum() const;
73     // Sets the "allowed value step" defined in the HTML spec to the specified double pointer.
74     // Returns false if there is no "allowed value step."
75     bool getAllowedValueStep(Decimal*) const;
76     StepRange createStepRange(AnyStepHandling) const;
77 
78     Decimal findClosestTickMarkValue(const Decimal&);
79 
80     // Implementations of HTMLInputElement::stepUp() and stepDown().
81     void stepUp(int, ExceptionState&);
82     void stepDown(int, ExceptionState&);
stepUp(ExceptionState & exceptionState)83     void stepUp(ExceptionState& exceptionState) { stepUp(1, exceptionState); }
stepDown(ExceptionState & exceptionState)84     void stepDown(ExceptionState& exceptionState) { stepDown(1, exceptionState); }
85     // stepUp()/stepDown() for user-interaction.
86     bool isSteppable() const;
87 
88     bool isTextButton() const;
89 
90     bool isRadioButton() const;
91     bool isTextField() const;
92     bool isSearchField() const;
93     bool isInputTypeHidden() const;
94     bool isPasswordField() const;
95     bool isCheckbox() const;
96     bool isRangeControl() const;
97 
98     // FIXME: It's highly likely that any call site calling this function should instead
99     // be using a different one. Many input elements behave like text fields, and in addition
100     // any unknown input type is treated as text. Consider, for example, isTextField or
101     // isTextField && !isPasswordField.
102     bool isText() const;
103 
104     bool isEmailField() const;
105     bool isFileUpload() const;
106     bool isImageButton() const;
107     bool isNumberField() const;
108     bool isTelephoneField() const;
109     bool isURLField() const;
110     bool isDateField() const;
111     bool isDateTimeLocalField() const;
112     bool isMonthField() const;
113     bool isTimeField() const;
114     bool isWeekField() const;
115 
checked()116     bool checked() const { return m_isChecked; }
117     void setChecked(bool, TextFieldEventBehavior = DispatchNoEvent);
118 
119     // 'indeterminate' is a state independent of the checked state that causes the control to draw in a way that hides the actual state.
indeterminate()120     bool indeterminate() const { return m_isIndeterminate; }
121     void setIndeterminate(bool);
122     // shouldAppearChecked is used by the rendering tree/CSS while checked() is used by JS to determine checked state
123     bool shouldAppearChecked() const;
124     virtual bool shouldAppearIndeterminate() const OVERRIDE;
125 
126     int size() const;
127     bool sizeShouldIncludeDecoration(int& preferredSize) const;
128 
129     void setType(const AtomicString&);
130 
131     virtual String value() const OVERRIDE;
132     void setValue(const String&, ExceptionState&, TextFieldEventBehavior = DispatchNoEvent);
133     void setValue(const String&, TextFieldEventBehavior = DispatchNoEvent);
134     void setValueForUser(const String&);
135     // Checks if the specified string would be a valid value.
136     // We should not call this for types with no string value such as CHECKBOX and RADIO.
137     bool isValidValue(const String&) const;
hasDirtyValue()138     bool hasDirtyValue() const { return !m_valueIfDirty.isNull(); };
139 
140     String sanitizeValue(const String&) const;
141 
142     String localizeValue(const String&) const;
143 
144     const String& suggestedValue() const;
145     void setSuggestedValue(const String&);
146 
147     void setEditingValue(const String&);
148 
149     double valueAsDate(bool& isNull) const;
150     void setValueAsDate(double, ExceptionState&);
151 
152     double valueAsNumber() const;
153     void setValueAsNumber(double, ExceptionState&, TextFieldEventBehavior = DispatchNoEvent);
154 
155     String valueWithDefault() const;
156 
157     void setValueFromRenderer(const String&);
158 
159     int selectionStartForBinding(ExceptionState&) const;
160     int selectionEndForBinding(ExceptionState&) const;
161     String selectionDirectionForBinding(ExceptionState&) const;
162     void setSelectionStartForBinding(int, ExceptionState&);
163     void setSelectionEndForBinding(int, ExceptionState&);
164     void setSelectionDirectionForBinding(const String&, ExceptionState&);
165     void setSelectionRangeForBinding(int start, int end, ExceptionState&);
166     void setSelectionRangeForBinding(int start, int end, const String& direction, ExceptionState&);
167 
168     virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE FINAL;
169     virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE;
170     virtual void detach(const AttachContext& = AttachContext()) OVERRIDE FINAL;
171     virtual void updateFocusAppearance(bool restorePreviousSelection) OVERRIDE FINAL;
172 
173     // FIXME: For isActivatedSubmit and setActivatedSubmit, we should use the NVI-idiom here by making
174     // it private virtual in all classes and expose a public method in HTMLFormControlElement to call
175     // the private virtual method.
176     virtual bool isActivatedSubmit() const OVERRIDE FINAL;
177     virtual void setActivatedSubmit(bool flag) OVERRIDE FINAL;
178 
179     String altText() const;
180 
maxResults()181     int maxResults() const { return m_maxResults; }
182 
183     const AtomicString& defaultValue() const;
184     void setDefaultValue(const AtomicString&);
185 
186     Vector<String> acceptMIMETypes();
187     Vector<String> acceptFileExtensions();
188     const AtomicString& alt() const;
189 
190     void setSize(unsigned);
191     void setSize(unsigned, ExceptionState&);
192 
193     KURL src() const;
194 
195     int maxLength() const;
196     void setMaxLength(int, ExceptionState&);
197 
198     bool multiple() const;
199 
200     FileList* files();
201     void setFiles(PassRefPtrWillBeRawPtr<FileList>);
202 
203     // Returns true if the given DragData has more than one dropped files.
204     bool receiveDroppedFiles(const DragData*);
205 
206     String droppedFileSystemId();
207 
208     // These functions are used for rendering the input active during a
209     // drag-and-drop operation.
210     bool canReceiveDroppedFiles() const;
211     void setCanReceiveDroppedFiles(bool);
212 
213     void onSearch();
214 
215     void updateClearButtonVisibility();
216 
217     virtual bool willRespondToMouseClickEvents() OVERRIDE;
218 
219     HTMLElement* list() const;
220     HTMLDataListElement* dataList() const;
221     bool hasValidDataListOptions() const;
222     void listAttributeTargetChanged();
223 
224     HTMLInputElement* checkedRadioButtonForGroup() const;
225     bool isInRequiredRadioButtonGroup();
226 
227     // Functions for InputType classes.
228     void setValueInternal(const String&, TextFieldEventBehavior);
valueAttributeWasUpdatedAfterParsing()229     bool valueAttributeWasUpdatedAfterParsing() const { return m_valueAttributeWasUpdatedAfterParsing; }
230     void updateView();
needsToUpdateViewValue()231     bool needsToUpdateViewValue() const { return m_needsToUpdateViewValue; }
232     virtual void setInnerEditorValue(const String&) OVERRIDE;
233 
cacheSelectionInResponseToSetValue(int caretOffset)234     void cacheSelectionInResponseToSetValue(int caretOffset) { cacheSelection(caretOffset, caretOffset, SelectionHasNoDirection); }
235 
236     // For test purposes.
237     void selectColorInColorChooser(const Color&);
238 
239     String defaultToolTip() const;
240 
241     static const int maximumLength;
242 
243     unsigned height() const;
244     unsigned width() const;
245     void setHeight(unsigned);
246     void setWidth(unsigned);
247 
248     virtual void blur() OVERRIDE FINAL;
249     void defaultBlur();
250 
251     virtual const AtomicString& name() const OVERRIDE FINAL;
252 
253     void beginEditing();
254     void endEditing();
255 
256     static Vector<FileChooserFileInfo> filesFromFileInputFormControlState(const FormControlState&);
257 
258     virtual bool matchesReadOnlyPseudoClass() const OVERRIDE FINAL;
259     virtual bool matchesReadWritePseudoClass() const OVERRIDE FINAL;
260     virtual void setRangeText(const String& replacement, ExceptionState&) OVERRIDE FINAL;
261     virtual void setRangeText(const String& replacement, unsigned start, unsigned end, const String& selectionMode, ExceptionState&) OVERRIDE FINAL;
262 
hasImageLoader()263     bool hasImageLoader() const { return m_imageLoader; }
264     HTMLImageLoader* imageLoader();
265 
266     bool setupDateTimeChooserParameters(DateTimeChooserParameters&);
267 
268     bool supportsInputModeAttribute() const;
269 
270     void setShouldRevealPassword(bool value);
shouldRevealPassword()271     bool shouldRevealPassword() const { return m_shouldRevealPassword; }
272 
273 protected:
274     HTMLInputElement(Document&, HTMLFormElement*, bool createdByParser);
275 
276     virtual void defaultEventHandler(Event*) OVERRIDE;
277 
278 private:
279     enum AutoCompleteSetting { Uninitialized, On, Off };
280 
281     virtual void didAddUserAgentShadowRoot(ShadowRoot&) OVERRIDE FINAL;
282     virtual void willAddFirstAuthorShadowRoot() OVERRIDE FINAL;
283 
284     virtual void willChangeForm() OVERRIDE FINAL;
285     virtual void didChangeForm() OVERRIDE FINAL;
286     virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
287     virtual void removedFrom(ContainerNode*) OVERRIDE FINAL;
288     virtual void didMoveToNewDocument(Document& oldDocument) OVERRIDE FINAL;
289     virtual void removeAllEventListeners() OVERRIDE FINAL;
290 
291     virtual bool hasCustomFocusLogic() const OVERRIDE FINAL;
292     virtual bool isKeyboardFocusable() const OVERRIDE FINAL;
293     virtual bool shouldShowFocusRingOnMouseFocus() const OVERRIDE FINAL;
294     virtual bool isEnumeratable() const OVERRIDE FINAL;
295     virtual bool isInteractiveContent() const OVERRIDE FINAL;
296     virtual bool supportLabels() const OVERRIDE FINAL;
297     virtual bool shouldUseInputMethod() OVERRIDE FINAL;
298 
isTextFormControl()299     virtual bool isTextFormControl() const OVERRIDE FINAL { return isTextField(); }
300 
canTriggerImplicitSubmission()301     virtual bool canTriggerImplicitSubmission() const OVERRIDE FINAL { return isTextField(); }
302 
303     virtual const AtomicString& formControlType() const OVERRIDE FINAL;
304 
305     virtual bool shouldSaveAndRestoreFormControlState() const OVERRIDE FINAL;
306     virtual FormControlState saveFormControlState() const OVERRIDE FINAL;
307     virtual void restoreFormControlState(const FormControlState&) OVERRIDE FINAL;
308 
309     virtual bool canStartSelection() const OVERRIDE FINAL;
310 
311     virtual void accessKeyAction(bool sendMouseEvents) OVERRIDE FINAL;
312 
313     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
314     virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE FINAL;
315     virtual void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStylePropertySet*) OVERRIDE FINAL;
316     virtual void finishParsingChildren() OVERRIDE FINAL;
317 
318     virtual void copyNonAttributePropertiesFromElement(const Element&) OVERRIDE FINAL;
319 
320     virtual void attach(const AttachContext& = AttachContext()) OVERRIDE FINAL;
321 
322     virtual bool appendFormData(FormDataList&, bool) OVERRIDE FINAL;
323     virtual String resultForDialogSubmit() OVERRIDE FINAL;
324 
325     virtual bool canBeSuccessfulSubmitButton() const OVERRIDE FINAL;
326 
327     virtual void resetImpl() OVERRIDE FINAL;
328     virtual bool supportsAutofocus() const OVERRIDE FINAL;
329 
330     virtual void* preDispatchEventHandler(Event*) OVERRIDE FINAL;
331     virtual void postDispatchEventHandler(Event*, void* dataFromPreDispatch) OVERRIDE FINAL;
332 
333     virtual bool isURLAttribute(const Attribute&) const OVERRIDE FINAL;
334     virtual bool hasLegalLinkAttribute(const QualifiedName&) const OVERRIDE FINAL;
335     virtual const QualifiedName& subResourceAttributeName() const OVERRIDE FINAL;
336     virtual bool isInRange() const OVERRIDE FINAL;
337     virtual bool isOutOfRange() const OVERRIDE FINAL;
338 
339     bool isTextType() const;
340     bool tooLong(const String&, NeedsToCheckDirtyFlag) const;
341 
342     virtual bool supportsPlaceholder() const OVERRIDE FINAL;
343     virtual void updatePlaceholderText() OVERRIDE FINAL;
isEmptyValue()344     virtual bool isEmptyValue() const OVERRIDE FINAL { return innerEditorValue().isEmpty(); }
isEmptySuggestedValue()345     virtual bool isEmptySuggestedValue() const OVERRIDE FINAL { return suggestedValue().isEmpty(); }
346     virtual void handleFocusEvent(Element* oldFocusedElement, FocusType) OVERRIDE FINAL;
347     virtual void handleBlurEvent() OVERRIDE FINAL;
348 
isOptionalFormControl()349     virtual bool isOptionalFormControl() const OVERRIDE FINAL { return !isRequiredFormControl(); }
350     virtual bool isRequiredFormControl() const OVERRIDE FINAL;
351     virtual bool recalcWillValidate() const OVERRIDE FINAL;
352     virtual void requiredAttributeChanged() OVERRIDE FINAL;
353 
354     void updateType();
355 
356     virtual void subtreeHasChanged() OVERRIDE FINAL;
357 
358     void setListAttributeTargetObserver(PassOwnPtrWillBeRawPtr<ListAttributeTargetObserver>);
359     void resetListAttributeTargetObserver();
360     void parseMaxLengthAttribute(const AtomicString&);
361     void updateValueIfNeeded();
362 
363     // Returns null if this isn't associated with any radio button group.
364     RadioButtonGroupScope* radioButtonGroupScope() const;
365     void addToRadioButtonGroup();
366     void removeFromRadioButtonGroup();
367 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
368     virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE;
369 #endif
370 
371     virtual bool shouldDispatchFormControlChangeEvent(String&, String&) OVERRIDE;
372 
373     AtomicString m_name;
374     String m_valueIfDirty;
375     String m_suggestedValue;
376     int m_size;
377     int m_maxLength;
378     short m_maxResults;
379     bool m_isChecked : 1;
380     bool m_reflectsCheckedAttribute : 1;
381     bool m_isIndeterminate : 1;
382     bool m_isActivatedSubmit : 1;
383     unsigned m_autocomplete : 2; // AutoCompleteSetting
384     bool m_hasNonEmptyList : 1;
385     bool m_stateRestored : 1;
386     bool m_parsingInProgress : 1;
387     bool m_valueAttributeWasUpdatedAfterParsing : 1;
388     bool m_canReceiveDroppedFiles : 1;
389     bool m_hasTouchEventHandler : 1;
390     bool m_shouldRevealPassword : 1;
391     bool m_needsToUpdateViewValue : 1;
392     RefPtrWillBeMember<InputType> m_inputType;
393     RefPtrWillBeMember<InputTypeView> m_inputTypeView;
394     // The ImageLoader must be owned by this element because the loader code assumes
395     // that it lives as long as its owning element lives. If we move the loader into
396     // the ImageInput object we may delete the loader while this element lives on.
397     OwnPtrWillBeMember<HTMLImageLoader> m_imageLoader;
398     OwnPtrWillBeMember<ListAttributeTargetObserver> m_listAttributeTargetObserver;
399 };
400 
401 } //namespace
402 #endif
403