Update HTML*Element class override methods in final classes
[WebKit-https.git] / Source / WebCore / html / HTMLFormElement.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, 2008, 2009, 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 #ifndef HTMLFormElement_h
25 #define HTMLFormElement_h
26
27 #include "FormState.h"
28 #include "FormSubmission.h"
29 #include "HTMLElement.h"
30 #include "RadioButtonGroups.h"
31 #include <memory>
32
33 #if ENABLE(IOS_AUTOCORRECT_AND_AUTOCAPITALIZE)
34 #include "Autocapitalize.h"
35 #endif
36
37 namespace WebCore {
38
39 class Event;
40 class FormAssociatedElement;
41 class FormData;
42 class HTMLFormControlElement;
43 class HTMLFormControlsCollection;
44 class HTMLImageElement;
45 class HTMLInputElement;
46 class TextEncoding;
47
48 class HTMLFormElement final : public HTMLElement {
49 public:
50     static Ref<HTMLFormElement> create(Document&);
51     static Ref<HTMLFormElement> create(const QualifiedName&, Document&);
52     virtual ~HTMLFormElement();
53
54     Ref<HTMLFormControlsCollection> elements();
55     Ref<HTMLCollection> elementsForNativeBindings();
56     Vector<Ref<Element>> namedElements(const AtomicString&);
57
58     unsigned length() const;
59     HTMLElement* item(unsigned index);
60
61     String enctype() const { return m_attributes.encodingType(); }
62     void setEnctype(const String&);
63
64     String encoding() const { return m_attributes.encodingType(); }
65     void setEncoding(const String& value) { setEnctype(value); }
66
67     bool shouldAutocomplete() const;
68
69     void setAutocomplete(const AtomicString&);
70     const AtomicString& autocomplete() const;
71
72 #if ENABLE(IOS_AUTOCORRECT_AND_AUTOCAPITALIZE)
73     WEBCORE_EXPORT bool autocorrect() const;
74     void setAutocorrect(bool);
75
76     WEBCORE_EXPORT WebAutocapitalizeType autocapitalizeType() const;
77     const AtomicString& autocapitalize() const;
78     void setAutocapitalize(const AtomicString&);
79 #endif
80
81     // FIXME: Should rename these two functions to say "form control" or "form-associated element" instead of "form element".
82     void registerFormElement(FormAssociatedElement*);
83     void removeFormElement(FormAssociatedElement*);
84
85     void registerInvalidAssociatedFormControl(const HTMLFormControlElement&);
86     void removeInvalidAssociatedFormControlIfNeeded(const HTMLFormControlElement&);
87
88     void registerImgElement(HTMLImageElement*);
89     void removeImgElement(HTMLImageElement*);
90
91     void prepareForSubmission(Event*); // FIXME: This function doesn't only prepare, it sometimes calls submit() itself.
92     void submit();
93     void submitFromJavaScript();
94     void reset();
95
96     void setDemoted(bool demoted) { m_wasDemoted = demoted; }
97
98     void submitImplicitly(Event*, bool fromImplicitSubmissionTrigger);
99     bool formWouldHaveSecureSubmission(const String& url);
100
101     String name() const;
102
103     bool noValidate() const;
104
105     String acceptCharset() const { return m_attributes.acceptCharset(); }
106     void setAcceptCharset(const String&);
107
108     String action() const;
109     void setAction(const String&);
110
111     String method() const;
112     void setMethod(const String&);
113
114     String target() const final;
115
116     bool wasUserSubmitted() const;
117
118     HTMLFormControlElement* defaultButton() const;
119     void resetDefaultButton();
120
121     bool checkValidity();
122
123 #if ENABLE(REQUEST_AUTOCOMPLETE)
124     enum class AutocompleteResult {
125         Success,
126         ErrorDisabled,
127         ErrorCancel,
128         ErrorInvalid,
129     };
130
131     void requestAutocomplete();
132     void finishRequestAutocomplete(AutocompleteResult);
133 #endif
134
135     RadioButtonGroups& radioButtonGroups() { return m_radioButtonGroups; }
136
137     const Vector<FormAssociatedElement*>& associatedElements() const { return m_associatedElements; }
138     const Vector<HTMLImageElement*>& imageElements() const { return m_imageElements; }
139
140     void getTextFieldValues(StringPairVector& fieldNamesAndValues) const;
141
142     static HTMLFormElement* findClosestFormAncestor(const Element&);
143
144 private:
145     HTMLFormElement(const QualifiedName&, Document&);
146
147     bool rendererIsNeeded(const RenderStyle&) final;
148     InsertionNotificationRequest insertedInto(ContainerNode&) final;
149     void removedFrom(ContainerNode&) final;
150     void finishParsingChildren() final;
151
152     void handleLocalEvents(Event&) final;
153
154     void parseAttribute(const QualifiedName&, const AtomicString&) final;
155     bool isURLAttribute(const Attribute&) const final;
156
157     void resumeFromDocumentSuspension() final;
158
159     void didMoveToNewDocument(Document* oldDocument) final;
160
161     void copyNonAttributePropertiesFromElement(const Element&) final;
162
163     void submit(Event*, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger);
164
165     unsigned formElementIndexWithFormAttribute(Element*, unsigned rangeStart, unsigned rangeEnd);
166     unsigned formElementIndex(FormAssociatedElement*);
167
168     // Returns true if the submission should proceed.
169     bool validateInteractively(Event*);
170
171     // Validates each of the controls, and stores controls of which 'invalid'
172     // event was not canceled to the specified vector. Returns true if there
173     // are any invalid controls in this form.
174     bool checkInvalidControlsAndCollectUnhandled(Vector<RefPtr<FormAssociatedElement>>&);
175
176     HTMLElement* elementFromPastNamesMap(const AtomicString&) const;
177     void addToPastNamesMap(FormNamedItem*, const AtomicString& pastName);
178     void assertItemCanBeInPastNamesMap(FormNamedItem*) const;
179     void removeFromPastNamesMap(FormNamedItem*);
180
181     bool matchesValidPseudoClass() const final;
182     bool matchesInvalidPseudoClass() const final;
183
184     typedef HashMap<RefPtr<AtomicStringImpl>, FormNamedItem*> PastNamesMap;
185
186     FormSubmission::Attributes m_attributes;
187     std::unique_ptr<PastNamesMap> m_pastNamesMap;
188
189     RadioButtonGroups m_radioButtonGroups;
190     mutable HTMLFormControlElement* m_defaultButton { nullptr };
191
192     unsigned m_associatedElementsBeforeIndex;
193     unsigned m_associatedElementsAfterIndex;
194     Vector<FormAssociatedElement*> m_associatedElements;
195     Vector<HTMLImageElement*> m_imageElements;
196     HashSet<const HTMLFormControlElement*> m_invalidAssociatedFormControls;
197
198     bool m_wasUserSubmitted;
199     bool m_isSubmittingOrPreparingForSubmission;
200     bool m_shouldSubmit;
201
202     bool m_isInResetFunction;
203
204     bool m_wasDemoted;
205
206 #if ENABLE(REQUEST_AUTOCOMPLETE)
207     void requestAutocompleteTimerFired();
208
209     Vector<RefPtr<Event>> m_pendingAutocompleteEvents;
210     Timer m_requestAutocompleteTimer;
211 #endif
212 };
213
214 } // namespace WebCore
215
216 #endif // HTMLFormElement_h