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
29namespace WebCore {
30
31class FormDataList;
32class HTMLFormElement;
33class ValidationMessage;
34class ValidityState;
35class VisibleSelection;
36
37class FormAssociatedElement {
38public:
39    virtual ~FormAssociatedElement();
40
41    void ref() { refFormAssociatedElement(); }
42    void deref() { derefFormAssociatedElement(); }
43
44    HTMLFormElement* form() const { return m_form; }
45    ValidityState* validity();
46
47    virtual bool isFormControlElement() const = 0;
48    virtual bool isEnumeratable() const = 0;
49
50    const AtomicString& name() const { return formControlName(); }
51
52    // Override in derived classes to get the encoded name=value pair for submitting.
53    // Return true for a successful control (see HTML4-17.13.2).
54    virtual bool appendFormData(FormDataList&, bool) { return false; }
55
56    virtual void formDestroyed() { m_form = 0; }
57
58    void resetFormOwner(HTMLFormElement*);
59
60protected:
61    FormAssociatedElement(HTMLFormElement*);
62
63    void insertedIntoTree();
64    void removedFromTree();
65    void insertedIntoDocument();
66    void removedFromDocument();
67    void willMoveToNewOwnerDocument();
68
69    void setForm(HTMLFormElement* form) { m_form = form; }
70    void removeFromForm();
71    void formAttributeChanged();
72
73private:
74    virtual const AtomicString& formControlName() const = 0;
75
76    virtual void refFormAssociatedElement() = 0;
77    virtual void derefFormAssociatedElement() = 0;
78
79    HTMLFormElement* m_form;
80    OwnPtr<ValidityState> m_validityState;
81};
82
83HTMLElement* toHTMLElement(FormAssociatedElement*);
84const HTMLElement* toHTMLElement(const FormAssociatedElement*);
85
86} // namespace
87
88#endif // FormAssociatedElement_h
89