b135df1fad74375eba2535a8e3b5a248c95f563b
[WebKit-https.git] / Source / WebCore / html / FormAssociatedElement.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 FormAssociatedElement_h
25 #define FormAssociatedElement_h
26
27 #include "HTMLElement.h"
28
29 namespace WebCore {
30
31 class FormAttributeTargetObserver;
32 class FormDataList;
33 class HTMLFormElement;
34 class ValidationMessage;
35 class ValidityState;
36 class VisibleSelection;
37
38 class FormAssociatedElement {
39 public:
40     virtual ~FormAssociatedElement();
41
42     void ref() { refFormAssociatedElement(); }
43     void deref() { derefFormAssociatedElement(); }
44
45     static HTMLFormElement* findAssociatedForm(const HTMLElement*, HTMLFormElement*);
46     HTMLFormElement* form() const { return m_form; }
47     ValidityState* validity();
48
49     virtual bool isFormControlElement() const = 0;
50     virtual bool isFormControlElementWithState() const;
51     virtual bool isEnumeratable() const = 0;
52
53     // Returns the 'name' attribute value. If this element has no name
54     // attribute, it returns an empty string instead of null string.
55     // Note that the 'name' IDL attribute doesn't use this function.
56     virtual const AtomicString& name() const;
57
58     // Override in derived classes to get the encoded name=value pair for submitting.
59     // Return true for a successful control (see HTML4-17.13.2).
60     virtual bool appendFormData(FormDataList&, bool) { return false; }
61
62     void formWillBeDestroyed();
63
64     void resetFormOwner();
65
66     void formRemovedFromTree(const Node* formRoot);
67
68     // ValidityState attribute implementations
69     bool customError() const;
70
71     // Override functions for patterMismatch, rangeOverflow, rangerUnderflow,
72     // stepMismatch, tooLong and valueMissing must call willValidate method.
73     virtual bool patternMismatch() const;
74     virtual bool rangeOverflow() const;
75     virtual bool rangeUnderflow() const;
76     virtual bool stepMismatch() const;
77     virtual bool tooLong() const;
78     virtual bool typeMismatch() const;
79     virtual bool valueMissing() const;
80     virtual String validationMessage() const;
81     bool valid() const;
82     virtual void setCustomValidity(const String&);
83
84     void formAttributeTargetChanged();
85
86 protected:
87     FormAssociatedElement();
88
89     void insertedInto(ContainerNode*);
90     void removedFrom(ContainerNode*);
91     void didMoveToNewDocument(Document* oldDocument);
92
93     void setForm(HTMLFormElement*);
94     void formAttributeChanged();
95
96     // If you add an override of willChangeForm() or didChangeForm() to a class
97     // derived from this one, you will need to add a call to setForm(0) to the
98     // destructor of that class.
99     virtual void willChangeForm();
100     virtual void didChangeForm();
101
102     String customValidationMessage() const;
103
104 private:
105     virtual void refFormAssociatedElement() = 0;
106     virtual void derefFormAssociatedElement() = 0;
107
108     void resetFormAttributeTargetObserver();
109
110     OwnPtr<FormAttributeTargetObserver> m_formAttributeTargetObserver;
111     HTMLFormElement* m_form;
112     OwnPtr<ValidityState> m_validityState;
113     String m_customValidationMessage;
114 };
115
116 HTMLElement* toHTMLElement(FormAssociatedElement*);
117 const HTMLElement* toHTMLElement(const FormAssociatedElement*);
118
119 } // namespace
120
121 #endif // FormAssociatedElement_h