| Index: Source/core/dom/CheckedRadioButtons.cpp
|
| diff --git a/Source/core/dom/CheckedRadioButtons.cpp b/Source/core/dom/CheckedRadioButtons.cpp
|
| deleted file mode 100644
|
| index 0dc3b4d47ab3b489f64c6c023643bc81ce4cdf74..0000000000000000000000000000000000000000
|
| --- a/Source/core/dom/CheckedRadioButtons.cpp
|
| +++ /dev/null
|
| @@ -1,268 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
|
| - *
|
| - * This library is free software; you can redistribute it and/or
|
| - * modify it under the terms of the GNU Library General Public
|
| - * License as published by the Free Software Foundation; either
|
| - * version 2 of the License, or (at your option) any later version.
|
| - *
|
| - * This library is distributed in the hope that it will be useful,
|
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - * Library General Public License for more details.
|
| - *
|
| - * You should have received a copy of the GNU Library General Public License
|
| - * along with this library; see the file COPYING.LIB. If not, write to
|
| - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - * Boston, MA 02110-1301, USA.
|
| - *
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "core/dom/CheckedRadioButtons.h"
|
| -
|
| -#include "core/html/HTMLInputElement.h"
|
| -#include "wtf/HashSet.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -class RadioButtonGroup {
|
| - WTF_MAKE_FAST_ALLOCATED;
|
| -public:
|
| - static PassOwnPtr<RadioButtonGroup> create();
|
| - bool isEmpty() const { return m_members.isEmpty(); }
|
| - bool isRequired() const { return m_requiredCount; }
|
| - HTMLInputElement* checkedButton() const { return m_checkedButton; }
|
| - void add(HTMLInputElement*);
|
| - void updateCheckedState(HTMLInputElement*);
|
| - void requiredAttributeChanged(HTMLInputElement*);
|
| - void remove(HTMLInputElement*);
|
| - bool contains(HTMLInputElement*) const;
|
| -
|
| -private:
|
| - RadioButtonGroup();
|
| - void setNeedsValidityCheckForAllButtons();
|
| - bool isValid() const;
|
| - void setCheckedButton(HTMLInputElement*);
|
| -
|
| - HashSet<HTMLInputElement*> m_members;
|
| - HTMLInputElement* m_checkedButton;
|
| - size_t m_requiredCount;
|
| -};
|
| -
|
| -RadioButtonGroup::RadioButtonGroup()
|
| - : m_checkedButton(0)
|
| - , m_requiredCount(0)
|
| -{
|
| -}
|
| -
|
| -PassOwnPtr<RadioButtonGroup> RadioButtonGroup::create()
|
| -{
|
| - return adoptPtr(new RadioButtonGroup);
|
| -}
|
| -
|
| -inline bool RadioButtonGroup::isValid() const
|
| -{
|
| - return !isRequired() || m_checkedButton;
|
| -}
|
| -
|
| -void RadioButtonGroup::setCheckedButton(HTMLInputElement* button)
|
| -{
|
| - HTMLInputElement* oldCheckedButton = m_checkedButton;
|
| - if (oldCheckedButton == button)
|
| - return;
|
| - m_checkedButton = button;
|
| - if (oldCheckedButton)
|
| - oldCheckedButton->setChecked(false);
|
| -}
|
| -
|
| -void RadioButtonGroup::add(HTMLInputElement* button)
|
| -{
|
| - ASSERT(button->isRadioButton());
|
| - if (!m_members.add(button).isNewEntry)
|
| - return;
|
| - bool groupWasValid = isValid();
|
| - if (button->isRequired())
|
| - ++m_requiredCount;
|
| - if (button->checked())
|
| - setCheckedButton(button);
|
| -
|
| - bool groupIsValid = isValid();
|
| - if (groupWasValid != groupIsValid)
|
| - setNeedsValidityCheckForAllButtons();
|
| - else if (!groupIsValid) {
|
| - // A radio button not in a group is always valid. We need to make it
|
| - // invalid only if the group is invalid.
|
| - button->setNeedsValidityCheck();
|
| - }
|
| -}
|
| -
|
| -void RadioButtonGroup::updateCheckedState(HTMLInputElement* button)
|
| -{
|
| - ASSERT(button->isRadioButton());
|
| - ASSERT(m_members.contains(button));
|
| - bool wasValid = isValid();
|
| - if (button->checked())
|
| - setCheckedButton(button);
|
| - else {
|
| - if (m_checkedButton == button)
|
| - m_checkedButton = 0;
|
| - }
|
| - if (wasValid != isValid())
|
| - setNeedsValidityCheckForAllButtons();
|
| -}
|
| -
|
| -void RadioButtonGroup::requiredAttributeChanged(HTMLInputElement* button)
|
| -{
|
| - ASSERT(button->isRadioButton());
|
| - ASSERT(m_members.contains(button));
|
| - bool wasValid = isValid();
|
| - if (button->isRequired())
|
| - ++m_requiredCount;
|
| - else {
|
| - ASSERT(m_requiredCount);
|
| - --m_requiredCount;
|
| - }
|
| - if (wasValid != isValid())
|
| - setNeedsValidityCheckForAllButtons();
|
| -}
|
| -
|
| -void RadioButtonGroup::remove(HTMLInputElement* button)
|
| -{
|
| - ASSERT(button->isRadioButton());
|
| - HashSet<HTMLInputElement*>::iterator it = m_members.find(button);
|
| - if (it == m_members.end())
|
| - return;
|
| - bool wasValid = isValid();
|
| - m_members.remove(it);
|
| - if (button->isRequired()) {
|
| - ASSERT(m_requiredCount);
|
| - --m_requiredCount;
|
| - }
|
| - if (m_checkedButton == button)
|
| - m_checkedButton = 0;
|
| -
|
| - if (m_members.isEmpty()) {
|
| - ASSERT(!m_requiredCount);
|
| - ASSERT(!m_checkedButton);
|
| - } else if (wasValid != isValid())
|
| - setNeedsValidityCheckForAllButtons();
|
| - if (!wasValid) {
|
| - // A radio button not in a group is always valid. We need to make it
|
| - // valid only if the group was invalid.
|
| - button->setNeedsValidityCheck();
|
| - }
|
| -}
|
| -
|
| -void RadioButtonGroup::setNeedsValidityCheckForAllButtons()
|
| -{
|
| - typedef HashSet<HTMLInputElement*>::const_iterator Iterator;
|
| - Iterator end = m_members.end();
|
| - for (Iterator it = m_members.begin(); it != end; ++it) {
|
| - HTMLInputElement* button = *it;
|
| - ASSERT(button->isRadioButton());
|
| - button->setNeedsValidityCheck();
|
| - }
|
| -}
|
| -
|
| -bool RadioButtonGroup::contains(HTMLInputElement* button) const
|
| -{
|
| - return m_members.contains(button);
|
| -}
|
| -
|
| -// ----------------------------------------------------------------
|
| -
|
| -// Explicity define empty constructor and destructor in order to prevent the
|
| -// compiler from generating them as inlines. So we don't need to to define
|
| -// RadioButtonGroup in the header.
|
| -CheckedRadioButtons::CheckedRadioButtons()
|
| -{
|
| -}
|
| -
|
| -CheckedRadioButtons::~CheckedRadioButtons()
|
| -{
|
| -}
|
| -
|
| -void CheckedRadioButtons::addButton(HTMLInputElement* element)
|
| -{
|
| - ASSERT(element->isRadioButton());
|
| - if (element->name().isEmpty())
|
| - return;
|
| -
|
| - if (!m_nameToGroupMap)
|
| - m_nameToGroupMap = adoptPtr(new NameToGroupMap);
|
| -
|
| - OwnPtr<RadioButtonGroup>& group = m_nameToGroupMap->add(element->name().impl(), PassOwnPtr<RadioButtonGroup>()).iterator->value;
|
| - if (!group)
|
| - group = RadioButtonGroup::create();
|
| - group->add(element);
|
| -}
|
| -
|
| -void CheckedRadioButtons::updateCheckedState(HTMLInputElement* element)
|
| -{
|
| - ASSERT(element->isRadioButton());
|
| - if (element->name().isEmpty())
|
| - return;
|
| - ASSERT(m_nameToGroupMap);
|
| - if (!m_nameToGroupMap)
|
| - return;
|
| - RadioButtonGroup* group = m_nameToGroupMap->get(element->name().impl());
|
| - ASSERT(group);
|
| - group->updateCheckedState(element);
|
| -}
|
| -
|
| -void CheckedRadioButtons::requiredAttributeChanged(HTMLInputElement* element)
|
| -{
|
| - ASSERT(element->isRadioButton());
|
| - if (element->name().isEmpty())
|
| - return;
|
| - ASSERT(m_nameToGroupMap);
|
| - if (!m_nameToGroupMap)
|
| - return;
|
| - RadioButtonGroup* group = m_nameToGroupMap->get(element->name().impl());
|
| - ASSERT(group);
|
| - group->requiredAttributeChanged(element);
|
| -}
|
| -
|
| -HTMLInputElement* CheckedRadioButtons::checkedButtonForGroup(const AtomicString& name) const
|
| -{
|
| - if (!m_nameToGroupMap)
|
| - return 0;
|
| - RadioButtonGroup* group = m_nameToGroupMap->get(name.impl());
|
| - return group ? group->checkedButton() : 0;
|
| -}
|
| -
|
| -bool CheckedRadioButtons::isInRequiredGroup(HTMLInputElement* element) const
|
| -{
|
| - ASSERT(element->isRadioButton());
|
| - if (element->name().isEmpty())
|
| - return false;
|
| - if (!m_nameToGroupMap)
|
| - return false;
|
| - RadioButtonGroup* group = m_nameToGroupMap->get(element->name().impl());
|
| - return group && group->isRequired() && group->contains(element);
|
| -}
|
| -
|
| -void CheckedRadioButtons::removeButton(HTMLInputElement* element)
|
| -{
|
| - ASSERT(element->isRadioButton());
|
| - if (element->name().isEmpty())
|
| - return;
|
| - if (!m_nameToGroupMap)
|
| - return;
|
| -
|
| - NameToGroupMap::iterator it = m_nameToGroupMap->find(element->name().impl());
|
| - if (it == m_nameToGroupMap->end())
|
| - return;
|
| - it->value->remove(element);
|
| - if (it->value->isEmpty()) {
|
| - // FIXME: We may skip deallocating the empty RadioButtonGroup for
|
| - // performance improvement. If we do so, we need to change the key type
|
| - // of m_nameToGroupMap from StringImpl* to AtomicString.
|
| - m_nameToGroupMap->remove(it);
|
| - if (m_nameToGroupMap->isEmpty())
|
| - m_nameToGroupMap.clear();
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
|
|