[Cleanup] Follow up cleanup for DOMFormData implementation
[WebKit.git] / Source / WebCore / html / HTMLTextAreaElement.h
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 #pragma once
25
26 #include "HTMLTextFormControlElement.h"
27
28 namespace WebCore {
29
30 class BeforeTextInsertedEvent;
31 class RenderTextControlMultiLine;
32 class VisibleSelection;
33
34 class HTMLTextAreaElement final : public HTMLTextFormControlElement {
35 public:
36     static Ref<HTMLTextAreaElement> create(const QualifiedName&, Document&, HTMLFormElement*);
37
38     unsigned cols() const { return m_cols; }
39     unsigned rows() const { return m_rows; }
40
41     bool shouldWrapText() const { return m_wrap != NoWrap; }
42
43     WEBCORE_EXPORT String value() const final;
44     WEBCORE_EXPORT void setValue(const String&);
45     WEBCORE_EXPORT String defaultValue() const;
46     WEBCORE_EXPORT void setDefaultValue(const String&);
47     int textLength() const { return value().length(); }
48     int effectiveMaxLength() const { return maxLength(); }
49     // For ValidityState
50     String validationMessage() const final;
51     bool valueMissing() const final;
52     bool tooShort() const final;
53     bool tooLong() const final;
54     bool isValidValue(const String&) const;
55     
56     TextControlInnerTextElement* innerTextElement() const final;
57     RenderStyle createInnerTextStyle(const RenderStyle&) const final;
58     void copyNonAttributePropertiesFromElement(const Element&) final;
59
60     void rendererWillBeDestroyed();
61
62     WEBCORE_EXPORT void setCols(unsigned);
63     WEBCORE_EXPORT void setRows(unsigned);
64
65     bool willRespondToMouseClickEvents() final;
66
67     RenderTextControlMultiLine* renderer() const;
68
69 private:
70     HTMLTextAreaElement(const QualifiedName&, Document&, HTMLFormElement*);
71
72     enum WrapMethod { NoWrap, SoftWrap, HardWrap };
73
74     void didAddUserAgentShadowRoot(ShadowRoot*) final;
75
76     void maxLengthAttributeChanged(const AtomicString& newValue);
77     void minLengthAttributeChanged(const AtomicString& newValue);
78
79     void handleBeforeTextInsertedEvent(BeforeTextInsertedEvent&) const;
80     static String sanitizeUserInputValue(const String&, unsigned maxLength);
81     void updateValue() const;
82     void setNonDirtyValue(const String&);
83     void setValueCommon(const String&);
84
85     bool supportsPlaceholder() const final { return true; }
86     HTMLElement* placeholderElement() const final;
87     void updatePlaceholderText() final;
88     bool isEmptyValue() const final { return value().isEmpty(); }
89
90     bool isOptionalFormControl() const final { return !isRequiredFormControl(); }
91     bool isRequiredFormControl() const final { return isRequired(); }
92
93     void defaultEventHandler(Event&) final;
94     
95     void subtreeHasChanged() final;
96
97     bool isEnumeratable() const final { return true; }
98     bool supportLabels() const final { return true; }
99
100     const AtomicString& formControlType() const final;
101
102     FormControlState saveFormControlState() const final;
103     void restoreFormControlState(const FormControlState&) final;
104
105     bool isTextFormControl() const final { return true; }
106
107     void childrenChanged(const ChildChange&) final;
108     void parseAttribute(const QualifiedName&, const AtomicString&) final;
109     bool isPresentationAttribute(const QualifiedName&) const final;
110     void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStyleProperties&) final;
111     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
112     bool appendFormData(DOMFormData&, bool) final;
113     void reset() final;
114     bool hasCustomFocusLogic() const final;
115     bool isMouseFocusable() const final;
116     bool isKeyboardFocusable(KeyboardEvent&) const final;
117     void updateFocusAppearance(SelectionRestorationMode, SelectionRevealMode) final;
118
119     void accessKeyAction(bool sendMouseEvents) final;
120
121     bool shouldUseInputMethod() final;
122     bool matchesReadWritePseudoClass() const final;
123
124     bool valueMissing(const String& value) const { return isRequiredFormControl() && !isDisabledOrReadOnly() && value.isEmpty(); }
125     bool tooShort(StringView, NeedsToCheckDirtyFlag) const;
126     bool tooLong(StringView, NeedsToCheckDirtyFlag) const;
127
128     unsigned m_rows;
129     unsigned m_cols;
130     WrapMethod m_wrap { SoftWrap };
131     RefPtr<HTMLElement> m_placeholder;
132     mutable String m_value;
133     mutable bool m_isDirty { false };
134     mutable bool m_wasModifiedByUser { false };
135 };
136
137 } //namespace