Web Inspector: add external resources size to the native memory diagram
[WebKit-https.git] / Source / WebCore / html / FormController.h
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2010, 2011, 2012 Google Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #ifndef FormController_h
23 #define FormController_h
24
25 #include "CheckedRadioButtons.h"
26 #include <wtf/Deque.h>
27 #include <wtf/Forward.h>
28 #include <wtf/ListHashSet.h>
29 #include <wtf/Vector.h>
30 #include <wtf/text/WTFString.h>
31
32 namespace WebCore {
33
34 class FormAssociatedElement;
35 class HTMLFormControlElementWithState;
36
37 class FormElementKey {
38 public:
39     FormElementKey(AtomicStringImpl* = 0, AtomicStringImpl* = 0);
40     ~FormElementKey();
41     FormElementKey(const FormElementKey&);
42     FormElementKey& operator=(const FormElementKey&);
43
44     AtomicStringImpl* name() const { return m_name; }
45     AtomicStringImpl* type() const { return m_type; }
46
47     // Hash table deleted values, which are only constructed and never copied or destroyed.
48     FormElementKey(WTF::HashTableDeletedValueType) : m_name(hashTableDeletedValue()) { }
49     bool isHashTableDeletedValue() const { return m_name == hashTableDeletedValue(); }
50
51 private:
52     void ref() const;
53     void deref() const;
54
55     static AtomicStringImpl* hashTableDeletedValue() { return reinterpret_cast<AtomicStringImpl*>(-1); }
56
57     AtomicStringImpl* m_name;
58     AtomicStringImpl* m_type;
59 };
60
61 inline bool operator==(const FormElementKey& a, const FormElementKey& b)
62 {
63     return a.name() == b.name() && a.type() == b.type();
64 }
65
66 struct FormElementKeyHash {
67     static unsigned hash(const FormElementKey&);
68     static bool equal(const FormElementKey& a, const FormElementKey& b) { return a == b; }
69     static const bool safeToCompareToEmptyOrDeleted = true;
70 };
71
72 struct FormElementKeyHashTraits : WTF::GenericHashTraits<FormElementKey> {
73     static void constructDeletedValue(FormElementKey& slot) { new (NotNull, &slot) FormElementKey(WTF::HashTableDeletedValue); }
74     static bool isDeletedValue(const FormElementKey& value) { return value.isHashTableDeletedValue(); }
75 };
76
77 class FormControlState {
78 public:
79     FormControlState() : m_type(TypeSkip) { }
80     explicit FormControlState(const String& value) : m_type(TypeRestore) { m_values.append(value); }
81     static FormControlState deserialize(const Vector<String>& stateVector, size_t& index);
82     FormControlState(const FormControlState& another) : m_type(another.m_type), m_values(another.m_values) { }
83     FormControlState& operator=(const FormControlState&);
84
85     bool isFailure() const { return m_type == TypeFailure; }
86     size_t valueSize() const { return m_values.size(); }
87     const String& operator[](size_t i) const { return m_values[i]; }
88     void append(const String&);
89     void serializeTo(Vector<String>& stateVector) const;
90
91 private:
92     enum Type { TypeSkip, TypeRestore, TypeFailure };
93     explicit FormControlState(Type type) : m_type(type) { }
94
95     Type m_type;
96     Vector<String> m_values;
97 };
98
99 inline FormControlState& FormControlState::operator=(const FormControlState& another)
100 {
101     m_type = another.m_type;
102     m_values = another.m_values;
103     return *this;
104 }
105
106 inline void FormControlState::append(const String& value)
107 {
108     m_type = TypeRestore;
109     m_values.append(value);
110 }
111
112 class FormController {
113 public:
114     static PassOwnPtr<FormController> create()
115     {
116         return adoptPtr(new FormController);
117     }
118     ~FormController();
119
120     CheckedRadioButtons& checkedRadioButtons() { return m_checkedRadioButtons; }
121     
122     void registerFormElementWithState(HTMLFormControlElementWithState* control) { m_formElementsWithState.add(control); }
123     void unregisterFormElementWithState(HTMLFormControlElementWithState* control) { m_formElementsWithState.remove(control); }
124     // This should be callled only by Document::formElementsState().
125     Vector<String> formElementsState() const;
126     // This should be callled only by Document::setStateForNewFormElements().
127     void setStateForNewFormElements(const Vector<String>&);
128     bool hasStateForNewFormElements() const;
129     FormControlState takeStateForFormElement(AtomicStringImpl* name, AtomicStringImpl* type);
130
131     void registerFormElementWithFormAttribute(FormAssociatedElement*);
132     void unregisterFormElementWithFormAttribute(FormAssociatedElement*);
133     void resetFormElementsOwner();
134
135 private:
136     FormController();
137
138     CheckedRadioButtons m_checkedRadioButtons;
139
140     typedef ListHashSet<HTMLFormControlElementWithState*, 64> FormElementListHashSet;
141     FormElementListHashSet m_formElementsWithState;
142     typedef ListHashSet<RefPtr<FormAssociatedElement>, 32> FormAssociatedElementListHashSet;
143     FormAssociatedElementListHashSet m_formElementsWithFormAttribute;
144
145     typedef HashMap<FormElementKey, Deque<FormControlState>, FormElementKeyHash, FormElementKeyHashTraits> FormElementStateMap;
146     FormElementStateMap m_stateForNewFormElements;
147     
148 };
149
150 } // namespace WebCore
151 #endif