8e5027c184d8302e3f9b79861dcdb04804cbd29d
[WebKit-https.git] / 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 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 "FormDataBuilder.h"
28 #include "HTMLCollection.h" 
29 #include "HTMLElement.h"
30
31 #include <wtf/OwnPtr.h>
32
33 namespace WebCore {
34
35 class Event;
36 class FormData;
37 class HTMLFormControlElement;
38 class HTMLImageElement;
39 class HTMLInputElement;
40 class HTMLFormCollection;
41 class TextEncoding;
42
43 class HTMLFormElement : public HTMLElement { 
44 public:
45     HTMLFormElement(const QualifiedName&, Document*);
46     virtual ~HTMLFormElement();
47
48     virtual HTMLTagStatus endTagRequirement() const { return TagStatusRequired; }
49     virtual int tagPriority() const { return 3; }
50
51     virtual void attach();
52     virtual void insertedIntoDocument();
53     virtual void removedFromDocument();
54  
55     virtual void handleLocalEvents(Event*, bool useCapture);
56      
57     PassRefPtr<HTMLCollection> elements();
58     void getNamedElements(const AtomicString&, Vector<RefPtr<Node> >&);
59     
60     unsigned length() const;
61     Node* item(unsigned index);
62
63     String enctype() const { return m_formDataBuilder.encodingType(); }
64     void setEnctype(const String&);
65
66     String encoding() const { return m_formDataBuilder.encodingType(); }
67     void setEncoding(const String& value) { setEnctype(value); }
68
69     bool autoComplete() const { return m_autocomplete; }
70
71     virtual void parseMappedAttribute(MappedAttribute*);
72
73     void registerFormElement(HTMLFormControlElement*);
74     void removeFormElement(HTMLFormControlElement*);
75     void registerImgElement(HTMLImageElement*);
76     void removeImgElement(HTMLImageElement*);
77
78     bool prepareSubmit(Event*);
79     void submit(Event* = 0, bool activateSubmitButton = false, bool lockHistory = false, bool lockBackForwardList = false);
80     void reset();
81
82     // Used to indicate a malformed state to keep from applying the bottom margin of the form.
83     void setMalformed(bool malformed) { m_malformed = malformed; }
84     bool isMalformed() const { return m_malformed; }
85
86     virtual bool isURLAttribute(Attribute*) const;
87     
88     void submitClick(Event*);
89     bool formWouldHaveSecureSubmission(const String& url);
90
91     String name() const;
92     void setName(const String&);
93
94     String acceptCharset() const { return m_formDataBuilder.acceptCharset(); }
95     void setAcceptCharset(const String&);
96
97     String action() const;
98     void setAction(const String&);
99
100     String method() const;
101     void setMethod(const String&);
102
103     virtual String target() const;
104     void setTarget(const String&);
105     
106     PassRefPtr<HTMLFormControlElement> elementForAlias(const AtomicString&);
107     void addElementAlias(HTMLFormControlElement*, const AtomicString& alias);
108
109     // FIXME: Change this to be private after getting rid of all the clients.
110     Vector<HTMLFormControlElement*> formElements;
111
112     class CheckedRadioButtons {
113     public:
114         void addButton(HTMLFormControlElement*);
115         void removeButton(HTMLFormControlElement*);
116         HTMLInputElement* checkedButtonForGroup(const AtomicString& name) const;
117
118     private:
119         typedef HashMap<AtomicStringImpl*, HTMLInputElement*> NameToInputMap;
120         OwnPtr<NameToInputMap> m_nameToCheckedRadioButtonMap;
121     };
122     
123     CheckedRadioButtons& checkedRadioButtons() { return m_checkedRadioButtons; }
124     
125     virtual void documentDidBecomeActive();
126
127 protected:
128     virtual void willMoveToNewOwnerDocument();
129     virtual void didMoveToNewOwnerDocument();
130
131 private:
132     bool isMailtoForm() const;
133     TextEncoding dataEncoding() const;
134     PassRefPtr<FormData> createFormData(const CString& boundary);
135     unsigned formElementIndex(HTMLFormControlElement*);
136
137     friend class HTMLFormCollection;
138
139     typedef HashMap<RefPtr<AtomicStringImpl>, RefPtr<HTMLFormControlElement> > AliasMap;
140
141     FormDataBuilder m_formDataBuilder;
142     AliasMap* m_elementAliases;
143     HTMLCollection::CollectionInfo* collectionInfo;
144
145     CheckedRadioButtons m_checkedRadioButtons;
146     
147     Vector<HTMLImageElement*> imgElements;
148     String m_url;
149     String m_target;
150     bool m_autocomplete : 1;
151     bool m_insubmit : 1;
152     bool m_doingsubmit : 1;
153     bool m_inreset : 1;
154     bool m_malformed : 1;
155     AtomicString m_name;
156 };
157
158 } // namespace WebCore
159
160 #endif // HTMLFormElement_h