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