15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFieldSetElement.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
29e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/dom/ElementTraversal.h"
30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/NodeListsNodeData.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCollection.h"
3276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/html/HTMLFormControlsCollection.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLLegendElement.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLObjectElement.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderFieldset.h"
36e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/StdLibExtras.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline HTMLFieldSetElement::HTMLFieldSetElement(Document& document, HTMLFormElement* form)
4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    : HTMLFormControlElement(fieldsetTag, document, form)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_documentVersion(0)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLFieldSetElement> HTMLFieldSetElement::create(Document& document, HTMLFormElement* form)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptRefWillBeNoop(new HTMLFieldSetElement(document, form));
51323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
52323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
53323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void HTMLFieldSetElement::trace(Visitor* visitor)
54323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
55323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if ENABLE(OILPAN)
56323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_associatedElements);
57323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif
58323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    HTMLFormControlElement::trace(visitor);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLFieldSetElement::invalidateDisabledStateUnder(Element& base)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    for (HTMLFormControlElement* element = Traversal<HTMLFormControlElement>::firstWithin(base); element; element = Traversal<HTMLFormControlElement>::next(*element, &base))
64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        element->ancestorDisabledStateWasChanged();
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFieldSetElement::disabledAttributeChanged()
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This element must be updated before the style of nodes in its subtree gets recalculated.
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLFormControlElement::disabledAttributeChanged();
7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    invalidateDisabledStateUnder(*this);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLFieldSetElement::childrenChanged(const ChildrenChange& change)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HTMLFormControlElement::childrenChanged(change);
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (HTMLLegendElement* legend = Traversal<HTMLLegendElement>::firstChild(*this); legend; legend = Traversal<HTMLLegendElement>::nextSibling(*legend))
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        invalidateDisabledStateUnder(*legend);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFieldSetElement::supportsFocus() const
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLElement::supportsFocus();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& HTMLFieldSetElement::formControlType() const
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(const AtomicString, fieldset, ("fieldset", AtomicString::ConstructFromLiteral));
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fieldset;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* HTMLFieldSetElement::createRenderer(RenderStyle*)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
94f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return new RenderFieldset(this);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLLegendElement* HTMLFieldSetElement::legend() const
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return Traversal<HTMLLegendElement>::firstChild(*this);
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLFormControlsCollection> HTMLFieldSetElement::elements()
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return ensureCachedCollection<HTMLFormControlsCollection>(FormControls);
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFieldSetElement::refreshElementsIfNeeded() const
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    uint64_t docVersion = document().domTreeVersion();
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_documentVersion == docVersion)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_documentVersion = docVersion;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_associatedElements.clear();
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (HTMLElement* element = Traversal<HTMLElement>::firstWithin(*this); element; element = Traversal<HTMLElement>::next(*element, this)) {
118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (isHTMLObjectElement(*element)) {
119e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            m_associatedElements.append(toHTMLObjectElement(element));
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!element->isFormControlElement())
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
126591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_associatedElements.append(toHTMLFormControlElement(element));
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
130323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)const FormAssociatedElement::List& HTMLFieldSetElement::associatedElements() const
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    refreshElementsIfNeeded();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_associatedElements;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
137