Home | History | Annotate | Download | only in html
      1 /*
      2  * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org)
      3  *           (C) 1999 Antti Koivisto (koivisto (at) kde.org)
      4  *           (C) 2000 Dirk Mueller (mueller (at) 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&);
     83     void stepUp(ExceptionState& exceptionState) { stepUp(1, 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 
    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.
    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;
    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 
    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);
    229     bool valueAttributeWasUpdatedAfterParsing() const { return m_valueAttributeWasUpdatedAfterParsing; }
    230     void updateView();
    231     bool needsToUpdateViewValue() const { return m_needsToUpdateViewValue; }
    232     virtual void setInnerEditorValue(const String&) OVERRIDE;
    233 
    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 
    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);
    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 
    299     virtual bool isTextFormControl() const OVERRIDE FINAL { return isTextField(); }
    300 
    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;
    344     virtual bool isEmptyValue() const OVERRIDE FINAL { return innerEditorValue().isEmpty(); }
    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 
    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