OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 20 matching lines...) Expand all Loading... | |
31 public: | 31 public: |
32 static PassOwnPtrWillBeRawPtr<RadioButtonGroup> create(); | 32 static PassOwnPtrWillBeRawPtr<RadioButtonGroup> create(); |
33 bool isEmpty() const { return m_members.isEmpty(); } | 33 bool isEmpty() const { return m_members.isEmpty(); } |
34 bool isRequired() const { return m_requiredCount; } | 34 bool isRequired() const { return m_requiredCount; } |
35 HTMLInputElement* checkedButton() const { return m_checkedButton; } | 35 HTMLInputElement* checkedButton() const { return m_checkedButton; } |
36 void add(HTMLInputElement*); | 36 void add(HTMLInputElement*); |
37 void updateCheckedState(HTMLInputElement*); | 37 void updateCheckedState(HTMLInputElement*); |
38 void requiredAttributeChanged(HTMLInputElement*); | 38 void requiredAttributeChanged(HTMLInputElement*); |
39 void remove(HTMLInputElement*); | 39 void remove(HTMLInputElement*); |
40 bool contains(HTMLInputElement*) const; | 40 bool contains(HTMLInputElement*) const; |
41 unsigned posInMembers(HTMLInputElement*) const; | |
keishi
2016/01/26 01:32:23
nit: Blink style avoid abbreviations so positionIn
je_julie(Not used)
2016/02/02 00:36:17
Done
| |
42 unsigned sizeOfMembers() const; | |
41 | 43 |
42 DECLARE_TRACE(); | 44 DECLARE_TRACE(); |
43 | 45 |
44 private: | 46 private: |
45 RadioButtonGroup(); | 47 RadioButtonGroup(); |
46 void setNeedsValidityCheckForAllButtons(); | 48 void setNeedsValidityCheckForAllButtons(); |
47 bool isValid() const; | 49 bool isValid() const; |
48 void setCheckedButton(HTMLInputElement*); | 50 void setCheckedButton(HTMLInputElement*); |
49 | 51 |
50 WillBeHeapHashSet<RawPtrWillBeMember<HTMLInputElement>> m_members; | 52 WillBeHeapVector<RawPtrWillBeMember<HTMLInputElement>> m_members; |
keishi
2016/01/26 01:32:23
This change will conflict with https://codereview.
je_julie(Not used)
2016/02/02 00:36:17
I rebased code on that CL.
| |
51 RawPtrWillBeMember<HTMLInputElement> m_checkedButton; | 53 RawPtrWillBeMember<HTMLInputElement> m_checkedButton; |
52 size_t m_requiredCount; | 54 size_t m_requiredCount; |
53 }; | 55 }; |
54 | 56 |
55 RadioButtonGroup::RadioButtonGroup() | 57 RadioButtonGroup::RadioButtonGroup() |
56 : m_checkedButton(nullptr) | 58 : m_checkedButton(nullptr) |
57 , m_requiredCount(0) | 59 , m_requiredCount(0) |
58 { | 60 { |
59 } | 61 } |
60 | 62 |
(...skipping 13 matching lines...) Expand all Loading... | |
74 if (oldCheckedButton == button) | 76 if (oldCheckedButton == button) |
75 return; | 77 return; |
76 m_checkedButton = button; | 78 m_checkedButton = button; |
77 if (oldCheckedButton) | 79 if (oldCheckedButton) |
78 oldCheckedButton->setChecked(false); | 80 oldCheckedButton->setChecked(false); |
79 } | 81 } |
80 | 82 |
81 void RadioButtonGroup::add(HTMLInputElement* button) | 83 void RadioButtonGroup::add(HTMLInputElement* button) |
82 { | 84 { |
83 ASSERT(button->type() == InputTypeNames::radio); | 85 ASSERT(button->type() == InputTypeNames::radio); |
84 if (!m_members.add(button).isNewEntry) | 86 if (m_members.contains(button)) |
85 return; | 87 return; |
88 m_members.append(button); | |
86 bool groupWasValid = isValid(); | 89 bool groupWasValid = isValid(); |
87 if (button->isRequired()) | 90 if (button->isRequired()) |
88 ++m_requiredCount; | 91 ++m_requiredCount; |
89 if (button->checked()) | 92 if (button->checked()) |
90 setCheckedButton(button); | 93 setCheckedButton(button); |
91 | 94 |
92 bool groupIsValid = isValid(); | 95 bool groupIsValid = isValid(); |
93 if (groupWasValid != groupIsValid) { | 96 if (groupWasValid != groupIsValid) { |
94 setNeedsValidityCheckForAllButtons(); | 97 setNeedsValidityCheckForAllButtons(); |
95 } else if (!groupIsValid) { | 98 } else if (!groupIsValid) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
128 ASSERT(m_requiredCount); | 131 ASSERT(m_requiredCount); |
129 --m_requiredCount; | 132 --m_requiredCount; |
130 } | 133 } |
131 if (wasValid != isValid()) | 134 if (wasValid != isValid()) |
132 setNeedsValidityCheckForAllButtons(); | 135 setNeedsValidityCheckForAllButtons(); |
133 } | 136 } |
134 | 137 |
135 void RadioButtonGroup::remove(HTMLInputElement* button) | 138 void RadioButtonGroup::remove(HTMLInputElement* button) |
136 { | 139 { |
137 ASSERT(button->type() == InputTypeNames::radio); | 140 ASSERT(button->type() == InputTypeNames::radio); |
138 WillBeHeapHashSet<RawPtrWillBeMember<HTMLInputElement>>::iterator it = m_mem bers.find(button); | 141 size_t idx = m_members.find(button); |
139 if (it == m_members.end()) | 142 if (idx == kNotFound) |
140 return; | 143 return; |
141 bool wasValid = isValid(); | 144 bool wasValid = isValid(); |
142 m_members.remove(it); | 145 m_members.remove(idx); |
143 if (button->isRequired()) { | 146 if (button->isRequired()) { |
144 ASSERT(m_requiredCount); | 147 ASSERT(m_requiredCount); |
145 --m_requiredCount; | 148 --m_requiredCount; |
146 } | 149 } |
147 if (m_checkedButton == button) | 150 if (m_checkedButton == button) |
148 m_checkedButton = nullptr; | 151 m_checkedButton = nullptr; |
149 | 152 |
150 if (m_members.isEmpty()) { | 153 if (m_members.isEmpty()) { |
151 ASSERT(!m_requiredCount); | 154 ASSERT(!m_requiredCount); |
152 ASSERT(!m_checkedButton); | 155 ASSERT(!m_checkedButton); |
(...skipping 13 matching lines...) Expand all Loading... | |
166 ASSERT(button->type() == InputTypeNames::radio); | 169 ASSERT(button->type() == InputTypeNames::radio); |
167 button->setNeedsValidityCheck(); | 170 button->setNeedsValidityCheck(); |
168 } | 171 } |
169 } | 172 } |
170 | 173 |
171 bool RadioButtonGroup::contains(HTMLInputElement* button) const | 174 bool RadioButtonGroup::contains(HTMLInputElement* button) const |
172 { | 175 { |
173 return m_members.contains(button); | 176 return m_members.contains(button); |
174 } | 177 } |
175 | 178 |
179 unsigned RadioButtonGroup::posInMembers(HTMLInputElement* element) const | |
180 { | |
181 unsigned index = 0; | |
182 for (HTMLInputElement* const button : m_members) { | |
183 index++; | |
184 if (button == element) | |
185 return index; | |
186 } | |
187 return 0; | |
188 } | |
189 | |
190 unsigned RadioButtonGroup::sizeOfMembers() const | |
191 { | |
192 return m_members.size(); | |
193 } | |
194 | |
176 DEFINE_TRACE(RadioButtonGroup) | 195 DEFINE_TRACE(RadioButtonGroup) |
177 { | 196 { |
178 #if ENABLE(OILPAN) | 197 #if ENABLE(OILPAN) |
179 visitor->trace(m_members); | 198 visitor->trace(m_members); |
180 visitor->trace(m_checkedButton); | 199 visitor->trace(m_checkedButton); |
181 #endif | 200 #endif |
182 } | 201 } |
183 | 202 |
184 // ---------------------------------------------------------------- | 203 // ---------------------------------------------------------------- |
185 | 204 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
247 { | 266 { |
248 ASSERT(element->type() == InputTypeNames::radio); | 267 ASSERT(element->type() == InputTypeNames::radio); |
249 if (element->name().isEmpty()) | 268 if (element->name().isEmpty()) |
250 return false; | 269 return false; |
251 if (!m_nameToGroupMap) | 270 if (!m_nameToGroupMap) |
252 return false; | 271 return false; |
253 RadioButtonGroup* group = m_nameToGroupMap->get(element->name()); | 272 RadioButtonGroup* group = m_nameToGroupMap->get(element->name()); |
254 return group && group->isRequired() && group->contains(element); | 273 return group && group->isRequired() && group->contains(element); |
255 } | 274 } |
256 | 275 |
276 unsigned RadioButtonGroupScope::posInGroup(HTMLInputElement* element) const | |
277 { | |
278 if (!m_nameToGroupMap) | |
279 return 0; | |
280 | |
281 RadioButtonGroup* group = m_nameToGroupMap->get(element->name()); | |
282 if (!group) | |
283 return 0; | |
284 | |
285 return group->posInMembers(element); | |
286 } | |
287 | |
288 unsigned RadioButtonGroupScope::sizeOfGroup(HTMLInputElement* element) const | |
289 { | |
290 if (!m_nameToGroupMap) | |
291 return 0; | |
292 | |
293 RadioButtonGroup* group = m_nameToGroupMap->get(element->name()); | |
294 if (!group) | |
295 return 0; | |
296 return group->sizeOfMembers(); | |
297 } | |
298 | |
257 void RadioButtonGroupScope::removeButton(HTMLInputElement* element) | 299 void RadioButtonGroupScope::removeButton(HTMLInputElement* element) |
258 { | 300 { |
259 ASSERT(element->type() == InputTypeNames::radio); | 301 ASSERT(element->type() == InputTypeNames::radio); |
260 if (element->name().isEmpty()) | 302 if (element->name().isEmpty()) |
261 return; | 303 return; |
262 if (!m_nameToGroupMap) | 304 if (!m_nameToGroupMap) |
263 return; | 305 return; |
264 | 306 |
265 RadioButtonGroup* group = m_nameToGroupMap->get(element->name()); | 307 RadioButtonGroup* group = m_nameToGroupMap->get(element->name()); |
266 if (!group) | 308 if (!group) |
267 return; | 309 return; |
268 group->remove(element); | 310 group->remove(element); |
269 if (group->isEmpty()) { | 311 if (group->isEmpty()) { |
270 // We don't remove an empty RadioButtonGroup from m_nameToGroupMap for | 312 // We don't remove an empty RadioButtonGroup from m_nameToGroupMap for |
271 // better performance. | 313 // better performance. |
272 ASSERT(!group->isRequired()); | 314 ASSERT(!group->isRequired()); |
273 ASSERT_WITH_SECURITY_IMPLICATION(!group->checkedButton()); | 315 ASSERT_WITH_SECURITY_IMPLICATION(!group->checkedButton()); |
274 } | 316 } |
275 } | 317 } |
276 | 318 |
277 DEFINE_TRACE(RadioButtonGroupScope) | 319 DEFINE_TRACE(RadioButtonGroupScope) |
278 { | 320 { |
279 #if ENABLE(OILPAN) | 321 #if ENABLE(OILPAN) |
280 visitor->trace(m_nameToGroupMap); | 322 visitor->trace(m_nameToGroupMap); |
281 #endif | 323 #endif |
282 } | 324 } |
283 | 325 |
284 } // namespace | 326 } // namespace |
OLD | NEW |