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