1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is free software; you can redistribute it and/or 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modify it under the terms of the GNU Library General Public 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * License as published by the Free Software Foundation; either 7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * version 2 of the License, or (at your option) any later version. 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is distributed in the hope that it will be useful, 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Library General Public License for more details. 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * You should have received a copy of the GNU Library General Public License 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Boston, MA 02110-1301, USA. 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef InputElement_h 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define InputElement_h 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PlatformString.h" 25f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/AtomicString.h> 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 29e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockclass Attribute; 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass Document; 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass Element; 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass Event; 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass InputElementData; 34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass InputElement { 36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectpublic: 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual ~InputElement() { } 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual bool isAutofilled() const = 0; 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual bool isChecked() const = 0; 418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual bool isIndeterminate() const = 0; 428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual bool isInputTypeHidden() const = 0; 43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual bool isPasswordField() const = 0; 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual bool isSearchField() const = 0; 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual bool isTextField() const = 0; 46f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick virtual bool isRadioButton() const = 0; 47f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick virtual bool isCheckbox() const = 0; 48f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen virtual bool supportsMaxLength() const = 0; 5021939df44de1705786c545cd1bf519d47250322dBen Murdoch virtual bool hasSpinButton() const { return false; } 5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH) 5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen virtual bool isSpeechEnabled() const = 0; 5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual bool searchEventsShouldBeDispatched() const = 0; 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual int size() const = 0; 58d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual const String& suggestedValue() const = 0; 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual String value() const = 0; 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual void setValue(const String&, bool sendChangeEvent = false) = 0; 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual void setValueForUser(const String&) = 0; 622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // The value which is drawn by a renderer. 632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block virtual String visibleValue() const = 0; 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual String convertFromVisibleValue(const String&) const = 0; 655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Returns true if the specified string can be set as the value of InputElement. 675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual bool isAcceptableValue(const String&) const = 0; 68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual String sanitizeValue(const String&) const = 0; 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual void setValueFromRenderer(const String&) = 0; 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual void cacheSelection(int start, int end) = 0; 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual void select() = 0; 7321939df44de1705786c545cd1bf519d47250322dBen Murdoch 7421939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS) 7521939df44de1705786c545cd1bf519d47250322dBen Murdoch virtual InputElementData data() const = 0; 7621939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static const int s_maximumLength; 79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static const int s_defaultSize; 80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 81cad810f21b803229eb11403f9209855525a25d57Steve Block // Replaces CRs and LFs, shrinks the value for s_maximumLength. 82cad810f21b803229eb11403f9209855525a25d57Steve Block // This should be applied to values from the HTML value attribute and the DOM value property. 83cad810f21b803229eb11403f9209855525a25d57Steve Block // This function should be called only by sanitizeValue() implementations. 84cad810f21b803229eb11403f9209855525a25d57Steve Block // Public so it can be called by InputType. 85cad810f21b803229eb11403f9209855525a25d57Steve Block static String sanitizeValueForTextField(const InputElement*, const String&); 86cad810f21b803229eb11403f9209855525a25d57Steve Block 87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprotected: 88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static void dispatchFocusEvent(InputElement*, Element*); 89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static void dispatchBlurEvent(InputElement*, Element*); 905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static void updateFocusAppearance(InputElementData&, InputElement*, Element*, bool restorePreviousSelection); 915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static void updateSelectionRange(InputElement*, Element*, int start, int end); 925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static void aboutToUnload(InputElement*, Element*); 935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static void setValueFromRenderer(InputElementData&, InputElement*, Element*, const String&); 94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Replaces CRs and LFs, shrinks the value for the specified maximum length. 95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // This should be applied to values specified by users. 960617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen // The input string may be a fragment of the whole value. 97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static String sanitizeUserInputValue(const InputElement*, const String&, int); 98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static void handleBeforeTextInsertedEvent(InputElementData&, InputElement*, Element*, Event*); 99e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block static void parseSizeAttribute(InputElementData&, Element*, Attribute*); 100e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block static void parseMaxLengthAttribute(InputElementData&, InputElement*, Element*, Attribute*); 1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static void updateValueIfNeeded(InputElementData&, InputElement*); 1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static void notifyFormStateChanged(Element*); 10321939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS) 10421939df44de1705786c545cd1bf519d47250322dBen Murdoch static bool isConformToInputMask(const InputElementData&, const String&); 10521939df44de1705786c545cd1bf519d47250322dBen Murdoch static bool isConformToInputMask(const InputElementData&, UChar, unsigned); 10621939df44de1705786c545cd1bf519d47250322dBen Murdoch static String validateInputMask(InputElementData&, String&); 10721939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}; 109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// HTML/WMLInputElement hold this struct as member variable 111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// and pass it to the static helper functions in InputElement 112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass InputElementData { 113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectpublic: 1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian InputElementData(); 115a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ~InputElementData(); 116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const AtomicString& name() const; 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setName(const AtomicString& value) { m_name = value; } 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // The null String represents "use the default value," and the empty String 12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // represents the empty value. 122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String value() const { return m_value; } 123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setValue(const String& value) { m_value = value; } 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 125d0825bca7fe65beaee391d30da42e937db621564Steve Block const String& suggestedValue() const { return m_suggestedValue; } 126d0825bca7fe65beaee391d30da42e937db621564Steve Block void setSuggestedValue(const String& value) { m_suggestedValue = value; } 127d0825bca7fe65beaee391d30da42e937db621564Steve Block 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int size() const { return m_size; } 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setSize(int value) { m_size = value; } 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int maxLength() const { return m_maxLength; } 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setMaxLength(int value) { m_maxLength = value; } 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int cachedSelectionStart() const { return m_cachedSelectionStart; } 135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setCachedSelectionStart(int value) { m_cachedSelectionStart = value; } 136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int cachedSelectionEnd() const { return m_cachedSelectionEnd; } 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setCachedSelectionEnd(int value) { m_cachedSelectionEnd = value; } 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 14021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS) 14121939df44de1705786c545cd1bf519d47250322dBen Murdoch String inputFormatMask() const { return m_inputFormatMask; } 14221939df44de1705786c545cd1bf519d47250322dBen Murdoch void setInputFormatMask(const String& mask) { m_inputFormatMask = mask; } 14321939df44de1705786c545cd1bf519d47250322dBen Murdoch 14421939df44de1705786c545cd1bf519d47250322dBen Murdoch unsigned maxInputCharsAllowed() const { return m_maxInputCharsAllowed; } 14521939df44de1705786c545cd1bf519d47250322dBen Murdoch void setMaxInputCharsAllowed(unsigned maxLength) { m_maxInputCharsAllowed = maxLength; } 14621939df44de1705786c545cd1bf519d47250322dBen Murdoch 14721939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 14821939df44de1705786c545cd1bf519d47250322dBen Murdoch 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprivate: 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project AtomicString m_name; 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String m_value; 152d0825bca7fe65beaee391d30da42e937db621564Steve Block String m_suggestedValue; 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int m_size; 154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int m_maxLength; 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int m_cachedSelectionStart; 156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int m_cachedSelectionEnd; 15721939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS) 15821939df44de1705786c545cd1bf519d47250322dBen Murdoch String m_inputFormatMask; 15921939df44de1705786c545cd1bf519d47250322dBen Murdoch unsigned m_maxInputCharsAllowed; 16021939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}; 162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 166