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