diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/html/HTMLFormControlsCollection.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/html/HTMLFormControlsCollection.cpp')
-rw-r--r-- | Source/WebCore/html/HTMLFormControlsCollection.cpp | 116 |
1 files changed, 40 insertions, 76 deletions
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<HTMLFormControlsCollection, CollectionTypeTraits<FormControls>::traversalType>(ownerNode, FormControls) , m_cachedElement(nullptr) , m_cachedElementOffsetInArray(0) { - ASSERT(isHTMLFormElement(ownerNode) || isHTMLFieldSetElement(ownerNode)); + ASSERT(is<HTMLFormElement>(ownerNode) || is<HTMLFieldSetElement>(ownerNode)); } -PassRefPtr<HTMLFormControlsCollection> HTMLFormControlsCollection::create(ContainerNode& ownerNode, CollectionType) +Ref<HTMLFormControlsCollection> 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<FormAssociatedElement*>& HTMLFormControlsCollection::formControlElements() const { - ASSERT(isHTMLFormElement(ownerNode()) || ownerNode().hasTagName(fieldsetTag)); - if (isHTMLFormElement(ownerNode())) - return toHTMLFormElement(ownerNode()).associatedElements(); - return toHTMLFieldSetElement(ownerNode()).associatedElements(); + ASSERT(is<HTMLFormElement>(ownerNode()) || is<HTMLFieldSetElement>(ownerNode())); + if (is<HTMLFormElement>(ownerNode())) + return downcast<HTMLFormElement>(ownerNode()).associatedElements(); + return downcast<HTMLFieldSetElement>(ownerNode()).associatedElements(); } const Vector<HTMLImageElement*>& HTMLFormControlsCollection::formImageElements() const { - ASSERT(isHTMLFormElement(ownerNode())); - return toHTMLFormElement(ownerNode()).imageElements(); + ASSERT(is<HTMLFormElement>(ownerNode())); + return downcast<HTMLFormElement>(ownerNode()).imageElements(); } static unsigned findFormAssociatedElement(const Vector<FormAssociatedElement*>& elements, const Element& element) @@ -76,7 +76,7 @@ static unsigned findFormAssociatedElement(const Vector<FormAssociatedElement*>& return elements.size(); } -Element* HTMLFormControlsCollection::customElementAfter(Element* current) const +HTMLElement* HTMLFormControlsCollection::customElementAfter(Element* current) const { const Vector<FormAssociatedElement*>& elements = formControlElements(); unsigned start; @@ -98,88 +98,52 @@ Element* HTMLFormControlsCollection::customElementAfter(Element* current) const return nullptr; } -static HTMLElement* firstNamedItem(const Vector<FormAssociatedElement*>& elementsArray, - const Vector<HTMLImageElement*>* 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<HTMLImageElement*>* 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<AtomicStringImpl*> foundInputElements; + auto cache = std::make_unique<CollectionNamedElementCache>(); - const Vector<FormAssociatedElement*>& elementsArray = formControlElements(); + bool ownerIsFormElement = is<HTMLFormElement>(ownerNode()); + HashSet<AtomicStringImpl*> 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<HTMLImageElement*>& 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<HTMLFormControlsCollection, CollectionTypeTraits<FormControls>::traversalType>::invalidateCache(document); m_cachedElement = nullptr; m_cachedElementOffsetInArray = 0; } |