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