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 "core/html/HTMLElement.h"
28#include "core/html/HTMLFormControlElement.h"
29#include "core/html/forms/RadioButtonGroupScope.h"
30#include "core/loader/FormSubmission.h"
31#include "wtf/OwnPtr.h"
32#include "wtf/WeakPtr.h"
33
34namespace WTF{
35class TextEncoding;
36}
37
38namespace blink {
39
40class Event;
41class FormAssociatedElement;
42class FormData;
43class GenericEventQueue;
44class HTMLFormControlElement;
45class HTMLFormControlsCollection;
46class HTMLImageElement;
47class HTMLInputElement;
48
49class HTMLFormElement FINAL : public HTMLElement {
50    DEFINE_WRAPPERTYPEINFO();
51public:
52    static PassRefPtrWillBeRawPtr<HTMLFormElement> create(Document&);
53    virtual ~HTMLFormElement();
54    virtual void trace(Visitor*) OVERRIDE;
55
56    PassRefPtrWillBeRawPtr<HTMLFormControlsCollection> elements();
57    void getNamedElements(const AtomicString&, WillBeHeapVector<RefPtrWillBeMember<Element> >&);
58
59    unsigned length() const;
60    HTMLElement* item(unsigned index);
61
62    String enctype() const { return m_attributes.encodingType(); }
63    void setEnctype(const AtomicString&);
64
65    String encoding() const { return m_attributes.encodingType(); }
66    void setEncoding(const AtomicString& value) { setEnctype(value); }
67
68    bool shouldAutocomplete() const;
69
70    void associate(FormAssociatedElement&);
71    void disassociate(FormAssociatedElement&);
72    void associate(HTMLImageElement&);
73    void disassociate(HTMLImageElement&);
74#if !ENABLE(OILPAN)
75    WeakPtr<HTMLFormElement> createWeakPtr();
76#endif
77    void didAssociateByParser();
78
79    void prepareForSubmission(Event*);
80    void submit();
81    void submitFromJavaScript();
82    void reset();
83
84    void setDemoted(bool);
85
86    void submitImplicitly(Event*, bool fromImplicitSubmissionTrigger);
87
88    String name() const;
89
90    bool noValidate() const;
91
92    const AtomicString& action() const;
93
94    String method() const;
95    void setMethod(const AtomicString&);
96
97    bool wasUserSubmitted() const;
98
99    HTMLFormControlElement* defaultButton() const;
100
101    bool checkValidity();
102
103    enum AutocompleteResult {
104        AutocompleteResultSuccess,
105        AutocompleteResultErrorDisabled,
106        AutocompleteResultErrorCancel,
107        AutocompleteResultErrorInvalid,
108    };
109
110    void requestAutocomplete();
111    void finishRequestAutocomplete(AutocompleteResult);
112
113    DEFINE_ATTRIBUTE_EVENT_LISTENER(autocomplete);
114    DEFINE_ATTRIBUTE_EVENT_LISTENER(autocompleteerror);
115
116    RadioButtonGroupScope& radioButtonGroupScope() { return m_radioButtonGroupScope; }
117
118    const FormAssociatedElement::List& associatedElements() const;
119    const WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> >& imageElements();
120
121    void anonymousNamedGetter(const AtomicString& name, RefPtrWillBeRawPtr<RadioNodeList>&, RefPtrWillBeRawPtr<Element>&);
122
123private:
124    explicit HTMLFormElement(Document&);
125
126    virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE;
127    virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
128    virtual void removedFrom(ContainerNode*) OVERRIDE;
129    virtual void finishParsingChildren() OVERRIDE;
130
131    virtual void handleLocalEvents(Event*) OVERRIDE;
132
133    virtual void attributeWillChange(const QualifiedName&, const AtomicString& oldValue, const AtomicString& newValue) OVERRIDE;
134    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
135    virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
136    virtual bool hasLegalLinkAttribute(const QualifiedName&) const OVERRIDE;
137
138    virtual bool shouldRegisterAsNamedItem() const OVERRIDE { return true; }
139
140    virtual void copyNonAttributePropertiesFromElement(const Element&) OVERRIDE;
141
142    void submitDialog(PassRefPtrWillBeRawPtr<FormSubmission>);
143    void submit(Event*, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger);
144
145    void scheduleFormSubmission(PassRefPtrWillBeRawPtr<FormSubmission>);
146
147    void collectAssociatedElements(Node& root, FormAssociatedElement::List&) const;
148    void collectImageElements(Node& root, WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> >&);
149
150    // Returns true if the submission should proceed.
151    bool validateInteractively(Event*);
152
153    // Validates each of the controls, and stores controls of which 'invalid'
154    // event was not canceled to the specified vector. Returns true if there
155    // are any invalid controls in this form.
156    bool checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> >*);
157
158    Element* elementFromPastNamesMap(const AtomicString&);
159    void addToPastNamesMap(Element*, const AtomicString& pastName);
160    void removeFromPastNamesMap(HTMLElement&);
161
162    typedef WillBeHeapHashMap<AtomicString, RawPtrWillBeMember<Element> > PastNamesMap;
163
164    FormSubmission::Attributes m_attributes;
165    OwnPtrWillBeMember<PastNamesMap> m_pastNamesMap;
166
167    RadioButtonGroupScope m_radioButtonGroupScope;
168
169    // Do not access m_associatedElements directly. Use associatedElements() instead.
170    FormAssociatedElement::List m_associatedElements;
171    // Do not access m_imageElements directly. Use imageElements() instead.
172    WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> > m_imageElements;
173#if !ENABLE(OILPAN)
174    WeakPtrFactory<HTMLFormElement> m_weakPtrFactory;
175#endif
176    bool m_associatedElementsAreDirty : 1;
177    bool m_imageElementsAreDirty : 1;
178    bool m_hasElementsAssociatedByParser : 1;
179    bool m_didFinishParsingChildren : 1;
180
181    bool m_wasUserSubmitted : 1;
182    bool m_isSubmittingOrInUserJSSubmitEvent : 1;
183    bool m_shouldSubmit : 1;
184
185    bool m_isInResetFunction : 1;
186
187    bool m_wasDemoted : 1;
188
189    OwnPtrWillBeMember<GenericEventQueue> m_pendingAutocompleteEventsQueue;
190};
191
192} // namespace blink
193
194#endif // HTMLFormElement_h
195