[Forms] HTMLFieldSetElement.idl doesn't have elements attribute.
[WebKit-https.git] / Source / WebCore / html / HTMLFieldSetElement.cpp
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
6  *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #include "config.h"
26 #include "HTMLFieldSetElement.h"
27
28 #include "HTMLFormCollection.h"
29 #include "HTMLLegendElement.h"
30 #include "HTMLNames.h"
31 #include "HTMLObjectElement.h"
32 #include "RenderFieldset.h"
33 #include <wtf/StdLibExtras.h>
34
35 namespace WebCore {
36
37 using namespace HTMLNames;
38
39 inline HTMLFieldSetElement::HTMLFieldSetElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
40     : HTMLFormControlElement(tagName, document, form)
41 {
42     ASSERT(hasTagName(fieldsetTag));
43 }
44
45 PassRefPtr<HTMLFieldSetElement> HTMLFieldSetElement::create(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
46 {
47     return adoptRef(new HTMLFieldSetElement(tagName, document, form));
48 }
49
50 void HTMLFieldSetElement::disabledAttributeChanged()
51 {
52     // This element must be updated before the style of nodes in its subtree gets recalculated.
53     HTMLFormControlElement::disabledAttributeChanged();
54
55     for (Node* currentNode = this; currentNode; currentNode = currentNode->traverseNextNode(this)) {
56         if (currentNode && currentNode->isElementNode() && toElement(currentNode)->isFormControlElement())
57             static_cast<HTMLFormControlElement*>(currentNode)->setNeedsStyleRecalc();
58     }
59 }
60
61 bool HTMLFieldSetElement::supportsFocus() const
62 {
63     return HTMLElement::supportsFocus();
64 }
65
66 const AtomicString& HTMLFieldSetElement::formControlType() const
67 {
68     DEFINE_STATIC_LOCAL(const AtomicString, fieldset, ("fieldset"));
69     return fieldset;
70 }
71
72 RenderObject* HTMLFieldSetElement::createRenderer(RenderArena* arena, RenderStyle*)
73 {
74     return new (arena) RenderFieldset(this);
75 }
76
77 HTMLLegendElement* HTMLFieldSetElement::legend() const
78 {
79     for (Element* node = firstElementChild(); node; node = node->nextElementSibling()) {
80         if (node->hasTagName(legendTag))
81             return static_cast<HTMLLegendElement*>(node);
82     }
83     return 0;
84 }
85
86 HTMLCollection* HTMLFieldSetElement::elements()
87 {
88     if (!m_elementsCollection)
89         m_elementsCollection = HTMLFormCollection::create(this);
90     return m_elementsCollection.get();
91 }
92
93 void HTMLFieldSetElement::refreshElementsIfNeeded() const
94 {
95     uint64_t docVersion = document()->domTreeVersion();
96     if (m_documentVersion == docVersion)
97         return;
98
99     m_documentVersion = docVersion;
100
101     m_associatedElements.clear();
102
103     for (Node* node = firstChild(); node; node = node->traverseNextNode(this)) {
104         if (!node->isElementNode())
105             continue;
106
107         if (node->hasTagName(objectTag)) {
108             m_associatedElements.append(static_cast<HTMLObjectElement*>(node));
109             continue;
110         }
111
112         if (!toElement(node)->isFormControlElement())
113             continue;
114
115         m_associatedElements.append(static_cast<HTMLFormControlElement*>(node));
116     }
117 }
118
119 const Vector<FormAssociatedElement*>& HTMLFieldSetElement::associatedElements() const
120 {
121     refreshElementsIfNeeded();
122     return m_associatedElements;
123 }
124
125 unsigned HTMLFieldSetElement::length() const
126 {
127     refreshElementsIfNeeded();
128     unsigned len = 0;
129     for (unsigned i = 0; i < m_associatedElements.size(); ++i)
130         if (m_associatedElements[i]->isEnumeratable())
131             ++len;
132     return len;
133 }
134
135 } // namespace