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