Add an argument indicating the type of insertion to Node::insertedInto
[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-2016 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 "FormState.h"
27 #include "FormSubmission.h"
28 #include "HTMLElement.h"
29 #include "RadioButtonGroups.h"
30 #include <memory>
31
32 #if ENABLE(IOS_AUTOCORRECT_AND_AUTOCAPITALIZE)
33 #include "Autocapitalize.h"
34 #endif
35
36 namespace WebCore {
37
38 class Event;
39 class FormAssociatedElement;
40 class HTMLFormControlElement;
41 class HTMLFormControlsCollection;
42 class HTMLImageElement;
43
44 class HTMLFormElement final : public HTMLElement {
45 public:
46     static Ref<HTMLFormElement> create(Document&);
47     static Ref<HTMLFormElement> create(const QualifiedName&, Document&);
48     virtual ~HTMLFormElement();
49
50     Ref<HTMLFormControlsCollection> elements();
51     WEBCORE_EXPORT Ref<HTMLCollection> elementsForNativeBindings();
52     Vector<Ref<Element>> namedElements(const AtomicString&);
53
54     WEBCORE_EXPORT unsigned length() const;
55     HTMLElement* item(unsigned index);
56     std::optional<Variant<RefPtr<RadioNodeList>, RefPtr<Element>>> namedItem(const AtomicString&);
57     Vector<AtomicString> supportedPropertyNames() const;
58
59     String enctype() const { return m_attributes.encodingType(); }
60     WEBCORE_EXPORT void setEnctype(const String&);
61
62     bool shouldAutocomplete() const;
63
64     WEBCORE_EXPORT void setAutocomplete(const AtomicString&);
65     WEBCORE_EXPORT const AtomicString& autocomplete() const;
66
67 #if ENABLE(IOS_AUTOCORRECT_AND_AUTOCAPITALIZE)
68     WEBCORE_EXPORT bool shouldAutocorrect() const final;
69 #endif
70
71     // FIXME: Should rename these two functions to say "form control" or "form-associated element" instead of "form element".
72     void registerFormElement(FormAssociatedElement*);
73     void removeFormElement(FormAssociatedElement*);
74
75     void registerInvalidAssociatedFormControl(const HTMLFormControlElement&);
76     void removeInvalidAssociatedFormControlIfNeeded(const HTMLFormControlElement&);
77
78     void registerImgElement(HTMLImageElement*);
79     void removeImgElement(HTMLImageElement*);
80
81     void prepareForSubmission(Event&); // FIXME: This function doesn't only prepare, it sometimes calls submit() itself.
82     WEBCORE_EXPORT void submit();
83     void submitFromJavaScript();
84     WEBCORE_EXPORT void reset();
85
86     void setDemoted(bool demoted) { m_wasDemoted = demoted; }
87
88     void submitImplicitly(Event&, bool fromImplicitSubmissionTrigger);
89     bool formWouldHaveSecureSubmission(const String& url);
90
91     String name() const;
92
93     bool noValidate() const;
94
95     String acceptCharset() const { return m_attributes.acceptCharset(); }
96     void setAcceptCharset(const String&);
97
98     String action() const;
99     void setAction(const String&);
100
101     WEBCORE_EXPORT String method() const;
102     WEBCORE_EXPORT void setMethod(const String&);
103
104     String target() const final;
105
106     bool wasUserSubmitted() const;
107
108     HTMLFormControlElement* defaultButton() const;
109     void resetDefaultButton();
110
111     WEBCORE_EXPORT bool checkValidity();
112     bool reportValidity();
113
114     RadioButtonGroups& radioButtonGroups() { return m_radioButtonGroups; }
115
116     const Vector<FormAssociatedElement*>& associatedElements() const { return m_associatedElements; }
117     const Vector<HTMLImageElement*>& imageElements() const { return m_imageElements; }
118
119     StringPairVector textFieldValues() const;
120
121     static HTMLFormElement* findClosestFormAncestor(const Element&);
122
123 private:
124     HTMLFormElement(const QualifiedName&, Document&);
125
126     bool rendererIsNeeded(const RenderStyle&) final;
127     InsertedIntoResult insertedInto(InsertionType, ContainerNode&) final;
128     void removedFrom(ContainerNode&) final;
129     void finishParsingChildren() final;
130
131     void handleLocalEvents(Event&) final;
132
133     void parseAttribute(const QualifiedName&, const AtomicString&) final;
134     bool isURLAttribute(const Attribute&) const final;
135
136     void resumeFromDocumentSuspension() final;
137
138     void didMoveToNewDocument(Document& oldDocument, Document& newDocument) final;
139
140     void copyNonAttributePropertiesFromElement(const Element&) final;
141
142     void submit(Event*, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger);
143
144     unsigned formElementIndexWithFormAttribute(Element*, unsigned rangeStart, unsigned rangeEnd);
145     unsigned formElementIndex(FormAssociatedElement*);
146
147     bool validateInteractively();
148
149     // Validates each of the controls, and stores controls of which 'invalid'
150     // event was not canceled to the specified vector. Returns true if there
151     // are any invalid controls in this form.
152     bool checkInvalidControlsAndCollectUnhandled(Vector<RefPtr<HTMLFormControlElement>>&);
153
154     HTMLElement* elementFromPastNamesMap(const AtomicString&) const;
155     void addToPastNamesMap(FormNamedItem*, const AtomicString& pastName);
156     void assertItemCanBeInPastNamesMap(FormNamedItem*) const;
157     void removeFromPastNamesMap(FormNamedItem*);
158
159     bool matchesValidPseudoClass() const final;
160     bool matchesInvalidPseudoClass() const final;
161
162     void resetAssociatedFormControlElements();
163
164     typedef HashMap<RefPtr<AtomicStringImpl>, FormNamedItem*> PastNamesMap;
165
166     FormSubmission::Attributes m_attributes;
167     std::unique_ptr<PastNamesMap> m_pastNamesMap;
168
169     RadioButtonGroups m_radioButtonGroups;
170     mutable HTMLFormControlElement* m_defaultButton { nullptr };
171
172     unsigned m_associatedElementsBeforeIndex { 0 };
173     unsigned m_associatedElementsAfterIndex { 0 };
174     Vector<FormAssociatedElement*> m_associatedElements;
175     Vector<HTMLImageElement*> m_imageElements;
176     HashSet<const HTMLFormControlElement*> m_invalidAssociatedFormControls;
177
178     bool m_wasUserSubmitted { false };
179     bool m_isSubmittingOrPreparingForSubmission { false };
180     bool m_shouldSubmit { false };
181
182     bool m_isInResetFunction { false };
183
184     bool m_wasDemoted { false };
185 };
186
187 } // namespace WebCore