diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/html/HTMLFieldSetElement.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/html/HTMLFieldSetElement.cpp')
-rw-r--r-- | Source/WebCore/html/HTMLFieldSetElement.cpp | 137 |
1 files changed, 21 insertions, 116 deletions
diff --git a/Source/WebCore/html/HTMLFieldSetElement.cpp b/Source/WebCore/html/HTMLFieldSetElement.cpp index d087bb274..0dab60d55 100644 --- a/Source/WebCore/html/HTMLFieldSetElement.cpp +++ b/Source/WebCore/html/HTMLFieldSetElement.cpp @@ -26,11 +26,10 @@ #include "HTMLFieldSetElement.h" #include "ElementIterator.h" -#include "HTMLFormControlsCollection.h" +#include "HTMLCollection.h" #include "HTMLLegendElement.h" #include "HTMLNames.h" #include "HTMLObjectElement.h" -#include "NodeRareData.h" #include "RenderFieldset.h" #include <wtf/StdLibExtras.h> @@ -45,98 +44,30 @@ inline HTMLFieldSetElement::HTMLFieldSetElement(const QualifiedName& tagName, Do ASSERT(hasTagName(fieldsetTag)); } -HTMLFieldSetElement::~HTMLFieldSetElement() +PassRefPtr<HTMLFieldSetElement> HTMLFieldSetElement::create(const QualifiedName& tagName, Document& document, HTMLFormElement* form) { - if (fastHasAttribute(disabledAttr)) - document().removeDisabledFieldsetElement(); + return adoptRef(new HTMLFieldSetElement(tagName, document, form)); } -Ref<HTMLFieldSetElement> HTMLFieldSetElement::create(const QualifiedName& tagName, Document& document, HTMLFormElement* form) +void HTMLFieldSetElement::invalidateDisabledStateUnder(Element* base) { - return adoptRef(*new HTMLFieldSetElement(tagName, document, form)); -} - -static void updateFromControlElementsAncestorDisabledStateUnder(HTMLElement& startNode, bool isDisabled) -{ - HTMLFormControlElement* control; - if (is<HTMLFormControlElement>(startNode)) - control = &downcast<HTMLFormControlElement>(startNode); - else - control = Traversal<HTMLFormControlElement>::firstWithin(startNode); - while (control) { - control->setAncestorDisabled(isDisabled); - // Don't call setAncestorDisabled(false) on form contorls inside disabled fieldsets. - if (is<HTMLFieldSetElement>(*control) && control->fastHasAttribute(disabledAttr)) - control = Traversal<HTMLFormControlElement>::nextSkippingChildren(*control, &startNode); - else - control = Traversal<HTMLFormControlElement>::next(*control, &startNode); - } + for (auto& control : descendantsOfType<HTMLFormControlElement>(*base)) + control.ancestorDisabledStateWasChanged(); } void HTMLFieldSetElement::disabledAttributeChanged() { - if (fastHasAttribute(disabledAttr)) - document().addDisabledFieldsetElement(); - else - document().removeDisabledFieldsetElement(); - - HTMLFormControlElement::disabledAttributeChanged(); -} - -void HTMLFieldSetElement::disabledStateChanged() -{ // This element must be updated before the style of nodes in its subtree gets recalculated. - HTMLFormControlElement::disabledStateChanged(); - - if (disabledByAncestorFieldset()) - return; - - bool thisFieldsetIsDisabled = fastHasAttribute(disabledAttr); - bool hasSeenFirstLegendElement = false; - for (HTMLElement* control = Traversal<HTMLElement>::firstChild(*this); control; control = Traversal<HTMLElement>::nextSibling(*control)) { - if (!hasSeenFirstLegendElement && is<HTMLLegendElement>(*control)) { - hasSeenFirstLegendElement = true; - updateFromControlElementsAncestorDisabledStateUnder(*control, false /* isDisabled */); - continue; - } - updateFromControlElementsAncestorDisabledStateUnder(*control, thisFieldsetIsDisabled); - } + HTMLFormControlElement::disabledAttributeChanged(); + invalidateDisabledStateUnder(this); } void HTMLFieldSetElement::childrenChanged(const ChildChange& change) { HTMLFormControlElement::childrenChanged(change); - if (!fastHasAttribute(disabledAttr)) - return; - - HTMLLegendElement* legend = Traversal<HTMLLegendElement>::firstChild(*this); - if (!legend) - return; - - // We only care about the first legend element (in which form contorls are not disabled by this element) changing here. - updateFromControlElementsAncestorDisabledStateUnder(*legend, false /* isDisabled */); - while ((legend = Traversal<HTMLLegendElement>::nextSibling(*legend))) - updateFromControlElementsAncestorDisabledStateUnder(*legend, true); -} -void HTMLFieldSetElement::didMoveToNewDocument(Document* oldDocument) -{ - HTMLFormControlElement::didMoveToNewDocument(oldDocument); - if (fastHasAttribute(disabledAttr)) { - if (oldDocument) - oldDocument->removeDisabledFieldsetElement(); - document().addDisabledFieldsetElement(); - } -} - -bool HTMLFieldSetElement::matchesValidPseudoClass() const -{ - return m_invalidDescendants.isEmpty(); -} - -bool HTMLFieldSetElement::matchesInvalidPseudoClass() const -{ - return !m_invalidDescendants.isEmpty(); + for (auto& legend : childrenOfType<HTMLLegendElement>(*this)) + invalidateDisabledStateUnder(&legend); } bool HTMLFieldSetElement::supportsFocus() const @@ -146,28 +77,23 @@ bool HTMLFieldSetElement::supportsFocus() const const AtomicString& HTMLFieldSetElement::formControlType() const { - static NeverDestroyed<const AtomicString> fieldset("fieldset", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, fieldset, ("fieldset", AtomicString::ConstructFromLiteral)); return fieldset; } -RenderPtr<RenderElement> HTMLFieldSetElement::createElementRenderer(Ref<RenderStyle>&& style, const RenderTreePosition&) +RenderPtr<RenderElement> HTMLFieldSetElement::createElementRenderer(PassRef<RenderStyle> style) { - return createRenderer<RenderFieldset>(*this, WTFMove(style)); + return createRenderer<RenderFieldset>(*this, std::move(style)); } HTMLLegendElement* HTMLFieldSetElement::legend() const { - return const_cast<HTMLLegendElement*>(childrenOfType<HTMLLegendElement>(*this).first()); + return const_cast<HTMLLegendElement*>(descendantsOfType<HTMLLegendElement>(*this).first()); } -Ref<HTMLFormControlsCollection> HTMLFieldSetElement::elements() +PassRefPtr<HTMLCollection> HTMLFieldSetElement::elements() { - return ensureRareData().ensureNodeLists().addCachedCollection<HTMLFormControlsCollection>(*this, FormControls); -} - -Ref<HTMLCollection> HTMLFieldSetElement::elementsForNativeBindings() -{ - return elements(); + return ensureCachedHTMLCollection(FormControls); } void HTMLFieldSetElement::refreshElementsIfNeeded() const @@ -182,9 +108,9 @@ void HTMLFieldSetElement::refreshElementsIfNeeded() const for (auto& element : descendantsOfType<Element>(const_cast<HTMLFieldSetElement&>(*this))) { if (element.hasTagName(objectTag)) - m_associatedElements.append(&downcast<HTMLObjectElement>(element)); - else if (is<HTMLFormControlElement>(element)) - m_associatedElements.append(&downcast<HTMLFormControlElement>(element)); + m_associatedElements.append(&toHTMLObjectElement(element)); + else if (element.isFormControlElement()) + m_associatedElements.append(&toHTMLFormControlElement(element)); } } @@ -198,32 +124,11 @@ unsigned HTMLFieldSetElement::length() const { refreshElementsIfNeeded(); unsigned length = 0; - for (auto& element : m_associatedElements) { - if (element->isEnumeratable()) + for (unsigned i = 0; i < m_associatedElements.size(); ++i) { + if (m_associatedElements[i]->isEnumeratable()) ++length; } return length; } -void HTMLFieldSetElement::addInvalidDescendant(const HTMLFormControlElement& invalidFormControlElement) -{ - ASSERT_WITH_MESSAGE(!is<HTMLFieldSetElement>(invalidFormControlElement), "FieldSet are never candidates for constraint validation."); - ASSERT(static_cast<const Element&>(invalidFormControlElement).matchesInvalidPseudoClass()); - ASSERT_WITH_MESSAGE(!m_invalidDescendants.contains(&invalidFormControlElement), "Updating the fieldset on validity change is not an efficient operation, it should only be done when necessary."); - - if (m_invalidDescendants.isEmpty()) - setNeedsStyleRecalc(); - m_invalidDescendants.add(&invalidFormControlElement); -} - -void HTMLFieldSetElement::removeInvalidDescendant(const HTMLFormControlElement& formControlElement) -{ - ASSERT_WITH_MESSAGE(!is<HTMLFieldSetElement>(formControlElement), "FieldSet are never candidates for constraint validation."); - ASSERT_WITH_MESSAGE(m_invalidDescendants.contains(&formControlElement), "Updating the fieldset on validity change is not an efficient operation, it should only be done when necessary."); - - m_invalidDescendants.remove(&formControlElement); - if (m_invalidDescendants.isEmpty()) - setNeedsStyleRecalc(); -} - } // namespace |