File: HTMLTextAreaElement.h

package info (click to toggle)
webkit2gtk 2.42.2-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 362,452 kB
  • sloc: cpp: 2,881,971; javascript: 282,447; ansic: 134,088; python: 43,789; ruby: 18,308; perl: 15,872; asm: 14,389; xml: 4,395; yacc: 2,350; sh: 2,074; java: 1,734; lex: 1,323; makefile: 288; pascal: 60
file content (142 lines) | stat: -rw-r--r-- 6,048 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
 *           (C) 2000 Dirk Mueller (mueller@kde.org)
 * Copyright (C) 2004-2022 Apple Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 */

#pragma once

#include "HTMLTextFormControlElement.h"

namespace WebCore {

class BeforeTextInsertedEvent;
class RenderTextControlMultiLine;

enum class SelectionRestorationMode : uint8_t;

class HTMLTextAreaElement final : public HTMLTextFormControlElement {
    WTF_MAKE_ISO_ALLOCATED(HTMLTextAreaElement);
public:
    WEBCORE_EXPORT static Ref<HTMLTextAreaElement> create(Document&);
    static Ref<HTMLTextAreaElement> create(const QualifiedName&, Document&, HTMLFormElement*);

    unsigned rows() const { return m_rows; }
    WEBCORE_EXPORT void setRows(unsigned);
    unsigned cols() const { return m_cols; }
    WEBCORE_EXPORT void setCols(unsigned);
    WEBCORE_EXPORT String defaultValue() const;
    WEBCORE_EXPORT void setDefaultValue(String&&);
    WEBCORE_EXPORT String value() const final;
    WEBCORE_EXPORT ExceptionOr<void> setValue(const String&, TextFieldEventBehavior = DispatchNoEvent, TextControlSetValueSelection = TextControlSetValueSelection::SetSelectionToEnd) final;
    unsigned textLength() const { return value().length(); }
    String validationMessage() const final;

    WEBCORE_EXPORT RefPtr<TextControlInnerTextElement> innerTextElement() const final;

    bool shouldSaveAndRestoreFormControlState() const final { return true; }

private:
    HTMLTextAreaElement(Document&, HTMLFormElement*);

    void didAddUserAgentShadowRoot(ShadowRoot&) final;

    static String sanitizeUserInputValue(const String& proposedValue, unsigned maxLength);
    void handleBeforeTextInsertedEvent(BeforeTextInsertedEvent&) const;
    void updateValue() const;
    void setNonDirtyValue(const String&, TextControlSetValueSelection);
    void setValueCommon(const String&, TextFieldEventBehavior, TextControlSetValueSelection);

    bool supportsReadOnly() const final { return true; }

    bool supportsPlaceholder() const final { return true; }
    HTMLElement* placeholderElement() const final { return m_placeholder.get(); }
    void updatePlaceholderText() final;
    bool isEmptyValue() const final { return value().isEmpty(); }

    bool isOptionalFormControl() const final { return !isRequiredFormControl(); }
    bool isRequiredFormControl() const final { return isRequired(); }

    void defaultEventHandler(Event&) final;
    
    void subtreeHasChanged() final;

    bool isEnumeratable() const final { return true; }
    bool isLabelable() const final { return true; }

    bool isInteractiveContent() const final { return true; }

    const AtomString& formControlType() const final;

    FormControlState saveFormControlState() const final;
    void restoreFormControlState(const FormControlState&) final;

    bool isTextField() const final { return true; }

    void childrenChanged(const ChildChange&) final;
    void attributeChanged(const QualifiedName&, const AtomString& oldValue, const AtomString& newValue, AttributeModificationReason) final;
    bool hasPresentationalHintsForAttribute(const QualifiedName&) const final;
    void collectPresentationalHintsForAttribute(const QualifiedName&, const AtomString&, MutableStyleProperties&) final;
    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
    bool appendFormData(DOMFormData&) final;
    void reset() final;
    bool hasCustomFocusLogic() const final { return true; }
    int defaultTabIndex() const final { return 0; }
    bool isMouseFocusable() const final { return isFocusable(); }
    bool isKeyboardFocusable(KeyboardEvent*) const final { return isFocusable(); }
    void updateFocusAppearance(SelectionRestorationMode, SelectionRevealMode) final;

    bool accessKeyAction(bool) final;

    bool shouldUseInputMethod() final { return true; }
    bool matchesReadWritePseudoClass() const final { return isMutable(); }

    bool valueMissing() const final;
    bool tooShort() const final;
    bool tooLong() const final;
    bool isValidValue(StringView) const;

    bool valueMissing(StringView valueOverride) const;
    bool tooShort(StringView valueOverride, NeedsToCheckDirtyFlag) const;
    bool tooLong(StringView valueOverride, NeedsToCheckDirtyFlag) const;

    RefPtr<TextControlInnerTextElement> innerTextElementCreatingShadowSubtreeIfNeeded() final;
    RenderStyle createInnerTextStyle(const RenderStyle&) final;
    void copyNonAttributePropertiesFromElement(const Element&) final;

    bool willRespondToMouseClickEventsWithEditability(Editability) const final { return !isDisabledFormControl(); }

    RenderTextControlMultiLine* renderer() const;

    enum WrapMethod : uint8_t { NoWrap, SoftWrap, HardWrap };

    static constexpr unsigned defaultRows = 2;
    static constexpr unsigned defaultCols = 20;

    unsigned m_rows { defaultRows };
    unsigned m_cols { defaultCols };
    RefPtr<HTMLElement> m_placeholder;
    mutable String m_value;
    WrapMethod m_wrap { SoftWrap };
    mutable uint8_t m_isDirty { false }; // uint8_t for better packing on Windows
    mutable uint8_t m_wasModifiedByUser { false }; // uint8_t for better packing on Windows
};

} // namespace