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