summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLFormControlsCollection.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/html/HTMLFormControlsCollection.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/html/HTMLFormControlsCollection.cpp')
-rw-r--r--Source/WebCore/html/HTMLFormControlsCollection.cpp116
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;
}