From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WebCore/html/HTMLFormControlsCollection.cpp | 116 +++++++-------------- 1 file changed, 40 insertions(+), 76 deletions(-) (limited to 'Source/WebCore/html/HTMLFormControlsCollection.cpp') diff --git a/Source/WebCore/html/HTMLFormControlsCollection.cpp b/Source/WebCore/html/HTMLFormControlsCollection.cpp index 54587306c..2b5409367 100644 --- a/Source/WebCore/html/HTMLFormControlsCollection.cpp +++ b/Source/WebCore/html/HTMLFormControlsCollection.cpp @@ -36,16 +36,16 @@ using namespace HTMLNames; // calculation every time if anything has changed. HTMLFormControlsCollection::HTMLFormControlsCollection(ContainerNode& ownerNode) - : HTMLCollection(ownerNode, FormControls, CustomForwardOnlyTraversal) + : CachedHTMLCollection::traversalType>(ownerNode, FormControls) , m_cachedElement(nullptr) , m_cachedElementOffsetInArray(0) { - ASSERT(isHTMLFormElement(ownerNode) || isHTMLFieldSetElement(ownerNode)); + ASSERT(is(ownerNode) || is(ownerNode)); } -PassRefPtr HTMLFormControlsCollection::create(ContainerNode& ownerNode, CollectionType) +Ref HTMLFormControlsCollection::create(ContainerNode& ownerNode, CollectionType) { - return adoptRef(new HTMLFormControlsCollection(ownerNode)); + return adoptRef(*new HTMLFormControlsCollection(ownerNode)); } HTMLFormControlsCollection::~HTMLFormControlsCollection() @@ -54,16 +54,16 @@ HTMLFormControlsCollection::~HTMLFormControlsCollection() const Vector& HTMLFormControlsCollection::formControlElements() const { - ASSERT(isHTMLFormElement(ownerNode()) || ownerNode().hasTagName(fieldsetTag)); - if (isHTMLFormElement(ownerNode())) - return toHTMLFormElement(ownerNode()).associatedElements(); - return toHTMLFieldSetElement(ownerNode()).associatedElements(); + ASSERT(is(ownerNode()) || is(ownerNode())); + if (is(ownerNode())) + return downcast(ownerNode()).associatedElements(); + return downcast(ownerNode()).associatedElements(); } const Vector& HTMLFormControlsCollection::formImageElements() const { - ASSERT(isHTMLFormElement(ownerNode())); - return toHTMLFormElement(ownerNode()).imageElements(); + ASSERT(is(ownerNode())); + return downcast(ownerNode()).imageElements(); } static unsigned findFormAssociatedElement(const Vector& elements, const Element& element) @@ -76,7 +76,7 @@ static unsigned findFormAssociatedElement(const Vector& return elements.size(); } -Element* HTMLFormControlsCollection::customElementAfter(Element* current) const +HTMLElement* HTMLFormControlsCollection::customElementAfter(Element* current) const { const Vector& elements = formControlElements(); unsigned start; @@ -98,88 +98,52 @@ Element* HTMLFormControlsCollection::customElementAfter(Element* current) const return nullptr; } -static HTMLElement* firstNamedItem(const Vector& elementsArray, - const Vector* imageElementsArray, const QualifiedName& attrName, const String& name) +void HTMLFormControlsCollection::updateNamedElementCache() const { - ASSERT(attrName == idAttr || attrName == nameAttr); - - for (unsigned i = 0; i < elementsArray.size(); ++i) { - HTMLElement& element = elementsArray[i]->asHTMLElement(); - if (elementsArray[i]->isEnumeratable() && element.fastGetAttribute(attrName) == name) - return &element; - } - - if (!imageElementsArray) - return 0; - - for (unsigned i = 0; i < imageElementsArray->size(); ++i) { - HTMLImageElement& element = *(*imageElementsArray)[i]; - if (element.fastGetAttribute(attrName) == name) - return &element; - } - - return nullptr; -} - -Node* HTMLFormControlsCollection::namedItem(const AtomicString& name) const -{ - // http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/nameditem.asp - // This method first searches for an object with a matching id - // attribute. If a match is not found, the method then searches for an - // object with a matching name attribute, but only on those elements - // that are allowed a name attribute. - const Vector* imagesElements = ownerNode().hasTagName(fieldsetTag) ? nullptr : &formImageElements(); - if (HTMLElement* item = firstNamedItem(formControlElements(), imagesElements, idAttr, name)) - return item; - - return firstNamedItem(formControlElements(), imagesElements, nameAttr, name); -} - -void HTMLFormControlsCollection::updateNameCache() const -{ - if (hasNameCache()) + if (hasNamedElementCache()) return; - HashSet foundInputElements; + auto cache = std::make_unique(); - const Vector& elementsArray = formControlElements(); + bool ownerIsFormElement = is(ownerNode()); + HashSet foundInputElements; - for (unsigned i = 0; i < elementsArray.size(); ++i) { - FormAssociatedElement& associatedElement = *elementsArray[i]; + for (auto& elementPtr : formControlElements()) { + FormAssociatedElement& associatedElement = *elementPtr; if (associatedElement.isEnumeratable()) { HTMLElement& element = associatedElement.asHTMLElement(); - const AtomicString& idAttrVal = element.getIdAttribute(); - const AtomicString& nameAttrVal = element.getNameAttribute(); - if (!idAttrVal.isEmpty()) { - appendIdCache(idAttrVal, &element); - foundInputElements.add(idAttrVal.impl()); + const AtomicString& id = element.getIdAttribute(); + if (!id.isEmpty()) { + cache->appendToIdCache(id, element); + if (ownerIsFormElement) + foundInputElements.add(id.impl()); } - if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal) { - appendNameCache(nameAttrVal, &element); - foundInputElements.add(nameAttrVal.impl()); + const AtomicString& name = element.getNameAttribute(); + if (!name.isEmpty() && id != name) { + cache->appendToNameCache(name, element); + if (ownerIsFormElement) + foundInputElements.add(name.impl()); } } } - - if (isHTMLFormElement(ownerNode())) { - const Vector& imageElementsArray = formImageElements(); - for (unsigned i = 0; i < imageElementsArray.size(); ++i) { - HTMLImageElement& element = *imageElementsArray[i]; - const AtomicString& idAttrVal = element.getIdAttribute(); - const AtomicString& nameAttrVal = element.getNameAttribute(); - if (!idAttrVal.isEmpty() && !foundInputElements.contains(idAttrVal.impl())) - appendIdCache(idAttrVal, &element); - if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && !foundInputElements.contains(nameAttrVal.impl())) - appendNameCache(nameAttrVal, &element); + if (ownerIsFormElement) { + for (auto* elementPtr : formImageElements()) { + HTMLImageElement& element = *elementPtr; + const AtomicString& id = element.getIdAttribute(); + if (!id.isEmpty() && !foundInputElements.contains(id.impl())) + cache->appendToIdCache(id, element); + const AtomicString& name = element.getNameAttribute(); + if (!name.isEmpty() && id != name && !foundInputElements.contains(name.impl())) + cache->appendToNameCache(name, element); } } - setHasNameCache(); + setNamedItemCache(WTFMove(cache)); } -void HTMLFormControlsCollection::invalidateCache() const +void HTMLFormControlsCollection::invalidateCache(Document& document) { - HTMLCollection::invalidateCache(); + CachedHTMLCollection::traversalType>::invalidateCache(document); m_cachedElement = nullptr; m_cachedElementOffsetInArray = 0; } -- cgit v1.2.1