| Index: Source/core/html/HTMLCollection.cpp
|
| diff --git a/Source/core/html/HTMLCollection.cpp b/Source/core/html/HTMLCollection.cpp
|
| index 3ba2592ceffa0ee022c8683904c8e429d8332a68..accf901833c48542b8503b15bc05aa708bcc4142 100644
|
| --- a/Source/core/html/HTMLCollection.cpp
|
| +++ b/Source/core/html/HTMLCollection.cpp
|
| @@ -187,48 +187,48 @@ void HTMLCollection::invalidateCache() const
|
| }
|
|
|
| template <class NodeListType>
|
| -inline bool isMatchingElement(const NodeListType*, Element*);
|
| +inline bool isMatchingElement(const NodeListType&, const Element&);
|
|
|
| -template <> inline bool isMatchingElement(const HTMLCollection* htmlCollection, Element* element)
|
| +template <> inline bool isMatchingElement(const HTMLCollection& htmlCollection, const Element& element)
|
| {
|
| - CollectionType type = htmlCollection->type();
|
| - if (!element->isHTMLElement() && !(type == DocAll || type == NodeChildren || type == WindowNamedItems))
|
| + CollectionType type = htmlCollection.type();
|
| + if (!element.isHTMLElement() && !(type == DocAll || type == NodeChildren || type == WindowNamedItems))
|
| return false;
|
|
|
| switch (type) {
|
| case DocImages:
|
| - return element->hasLocalName(imgTag);
|
| + return element.hasLocalName(imgTag);
|
| case DocScripts:
|
| - return element->hasLocalName(scriptTag);
|
| + return element.hasLocalName(scriptTag);
|
| case DocForms:
|
| - return element->hasLocalName(formTag);
|
| + return element.hasLocalName(formTag);
|
| case TableTBodies:
|
| - return element->hasLocalName(tbodyTag);
|
| + return element.hasLocalName(tbodyTag);
|
| case TRCells:
|
| - return element->hasLocalName(tdTag) || element->hasLocalName(thTag);
|
| + return element.hasLocalName(tdTag) || element.hasLocalName(thTag);
|
| case TSectionRows:
|
| - return element->hasLocalName(trTag);
|
| + return element.hasLocalName(trTag);
|
| case SelectOptions:
|
| - return element->hasLocalName(optionTag);
|
| + return element.hasLocalName(optionTag);
|
| case SelectedOptions:
|
| - return element->hasLocalName(optionTag) && toHTMLOptionElement(element)->selected();
|
| + return element.hasLocalName(optionTag) && toHTMLOptionElement(element).selected();
|
| case DataListOptions:
|
| - if (element->hasLocalName(optionTag)) {
|
| - HTMLOptionElement* option = toHTMLOptionElement(element);
|
| - if (!option->isDisabledFormControl() && !option->value().isEmpty())
|
| + if (element.hasLocalName(optionTag)) {
|
| + const HTMLOptionElement& option = toHTMLOptionElement(element);
|
| + if (!option.isDisabledFormControl() && !option.value().isEmpty())
|
| return true;
|
| }
|
| return false;
|
| case MapAreas:
|
| - return element->hasLocalName(areaTag);
|
| + return element.hasLocalName(areaTag);
|
| case DocApplets:
|
| - return element->hasLocalName(appletTag) || (element->hasLocalName(objectTag) && toHTMLObjectElement(element)->containsJavaApplet());
|
| + return element.hasLocalName(appletTag) || (element.hasLocalName(objectTag) && toHTMLObjectElement(element).containsJavaApplet());
|
| case DocEmbeds:
|
| - return element->hasLocalName(embedTag);
|
| + return element.hasLocalName(embedTag);
|
| case DocLinks:
|
| - return (element->hasLocalName(aTag) || element->hasLocalName(areaTag)) && element->fastHasAttribute(hrefAttr);
|
| + return (element.hasLocalName(aTag) || element.hasLocalName(areaTag)) && element.fastHasAttribute(hrefAttr);
|
| case DocAnchors:
|
| - return element->hasLocalName(aTag) && element->fastHasAttribute(nameAttr);
|
| + return element.hasLocalName(aTag) && element.fastHasAttribute(nameAttr);
|
| case DocAll:
|
| case NodeChildren:
|
| return true;
|
| @@ -249,37 +249,37 @@ template <> inline bool isMatchingElement(const HTMLCollection* htmlCollection,
|
| return false;
|
| }
|
|
|
| -template <> inline bool isMatchingElement(const LiveNodeList* nodeList, Element* element)
|
| +template <> inline bool isMatchingElement(const LiveNodeList& nodeList, const Element& element)
|
| {
|
| - return nodeList->nodeMatches(element);
|
| + return nodeList.nodeMatches(element);
|
| }
|
|
|
| -template <> inline bool isMatchingElement(const HTMLTagNodeList* nodeList, Element* element)
|
| +template <> inline bool isMatchingElement(const HTMLTagNodeList& nodeList, const Element& element)
|
| {
|
| - return nodeList->nodeMatchesInlined(element);
|
| + return nodeList.nodeMatchesInlined(element);
|
| }
|
|
|
| -template <> inline bool isMatchingElement(const ClassNodeList* nodeList, Element* element)
|
| +template <> inline bool isMatchingElement(const ClassNodeList& nodeList, const Element& element)
|
| {
|
| - return nodeList->nodeMatchesInlined(element);
|
| + return nodeList.nodeMatchesInlined(element);
|
| }
|
|
|
| -static Node* previousNode(Node& base, Node& previous, bool onlyIncludeDirectChildren)
|
| +static Node* previousNode(const Node& base, const Node& previous, bool onlyIncludeDirectChildren)
|
| {
|
| return onlyIncludeDirectChildren ? previous.previousSibling() : NodeTraversal::previous(previous, &base);
|
| }
|
|
|
| -static inline Node* lastDescendent(Node& node)
|
| +static inline Node* lastDescendant(const Node& node)
|
| {
|
| - Node* descendent = node.lastChild();
|
| - for (Node* current = descendent; current; current = current->lastChild())
|
| - descendent = current;
|
| - return descendent;
|
| + Node* descendant = node.lastChild();
|
| + for (Node* current = descendant; current; current = current->lastChild())
|
| + descendant = current;
|
| + return descendant;
|
| }
|
|
|
| -static Node* lastNode(Node& rootNode, bool onlyIncludeDirectChildren)
|
| +static Node* lastNode(const Node& rootNode, bool onlyIncludeDirectChildren)
|
| {
|
| - return onlyIncludeDirectChildren ? rootNode.lastChild() : lastDescendent(rootNode);
|
| + return onlyIncludeDirectChildren ? rootNode.lastChild() : lastDescendant(rootNode);
|
| }
|
|
|
| ALWAYS_INLINE Node* LiveNodeListBase::iterateForPreviousNode(Node* current) const
|
| @@ -289,17 +289,17 @@ ALWAYS_INLINE Node* LiveNodeListBase::iterateForPreviousNode(Node* current) cons
|
| Node& rootNode = this->rootNode();
|
| for (; current; current = previousNode(rootNode, *current, onlyIncludeDirectChildren)) {
|
| if (isLiveNodeListType(collectionType)) {
|
| - if (current->isElementNode() && isMatchingElement(static_cast<const LiveNodeList*>(this), toElement(current)))
|
| + if (current->isElementNode() && isMatchingElement(static_cast<const LiveNodeList&>(*this), toElement(*current)))
|
| return toElement(current);
|
| } else {
|
| - if (current->isElementNode() && isMatchingElement(static_cast<const HTMLCollection*>(this), toElement(current)))
|
| + if (current->isElementNode() && isMatchingElement(static_cast<const HTMLCollection&>(*this), toElement(*current)))
|
| return toElement(current);
|
| }
|
| }
|
| return 0;
|
| }
|
|
|
| -ALWAYS_INLINE Node* LiveNodeListBase::itemBefore(Node* previous) const
|
| +ALWAYS_INLINE Node* LiveNodeListBase::itemBefore(const Node* previous) const
|
| {
|
| Node* current;
|
| if (LIKELY(!!previous)) // Without this LIKELY, length() and item() can be 10% slower.
|
| @@ -313,26 +313,26 @@ ALWAYS_INLINE Node* LiveNodeListBase::itemBefore(Node* previous) const
|
| }
|
|
|
| template <class NodeListType>
|
| -inline Element* firstMatchingElement(const NodeListType* nodeList, ContainerNode& root)
|
| +inline Element* firstMatchingElement(const NodeListType& nodeList, const ContainerNode& root)
|
| {
|
| Element* element = ElementTraversal::firstWithin(root);
|
| - while (element && !isMatchingElement(nodeList, element))
|
| + while (element && !isMatchingElement(nodeList, *element))
|
| element = ElementTraversal::next(*element, &root);
|
| return element;
|
| }
|
|
|
| template <class NodeListType>
|
| -inline Element* nextMatchingElement(const NodeListType* nodeList, Element& current, ContainerNode* root)
|
| +inline Element* nextMatchingElement(const NodeListType& nodeList, Element& current, const ContainerNode& root)
|
| {
|
| Element* next = ¤t;
|
| do {
|
| - next = ElementTraversal::next(*next, root);
|
| - } while (next && !isMatchingElement(nodeList, next));
|
| + next = ElementTraversal::next(*next, &root);
|
| + } while (next && !isMatchingElement(nodeList, *next));
|
| return next;
|
| }
|
|
|
| template <class NodeListType>
|
| -inline Element* traverseMatchingElementsForwardToOffset(const NodeListType* nodeList, unsigned offset, Element& currentElement, unsigned& currentOffset, ContainerNode* root)
|
| +inline Element* traverseMatchingElementsForwardToOffset(const NodeListType& nodeList, unsigned offset, Element& currentElement, unsigned& currentOffset, const ContainerNode& root)
|
| {
|
| ASSERT(currentOffset < offset);
|
| Element* next = ¤tElement;
|
| @@ -356,34 +356,34 @@ static inline Node* traverseSiblingsForwardToOffset(unsigned offset, Node& curre
|
|
|
| // FIXME: This should be in LiveNodeList.cpp but it needs to stay here until firstMatchingElement()
|
| // and others are moved to a separate header.
|
| -inline Node* LiveNodeList::traverseToFirstElement(ContainerNode& root) const
|
| +inline Node* LiveNodeList::traverseToFirstElement(const ContainerNode& root) const
|
| {
|
| ASSERT(isLiveNodeListType(type()));
|
| switch (type()) {
|
| case ChildNodeListType:
|
| return root.firstChild();
|
| case HTMLTagNodeListType:
|
| - return firstMatchingElement(static_cast<const HTMLTagNodeList*>(this), root);
|
| + return firstMatchingElement(static_cast<const HTMLTagNodeList&>(*this), root);
|
| case ClassNodeListType:
|
| - return firstMatchingElement(static_cast<const ClassNodeList*>(this), root);
|
| + return firstMatchingElement(static_cast<const ClassNodeList&>(*this), root);
|
| default:
|
| - return firstMatchingElement(static_cast<const LiveNodeList*>(this), root);
|
| + return firstMatchingElement(static_cast<const LiveNodeList&>(*this), root);
|
| }
|
| }
|
|
|
| // FIXME: This should be in LiveNodeList.cpp but it needs to stay here until traverseMatchingElementsForwardToOffset()
|
| // and others are moved to a separate header.
|
| -inline Node* LiveNodeList::traverseForwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset, ContainerNode* root) const
|
| +inline Node* LiveNodeList::traverseForwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset, const ContainerNode& root) const
|
| {
|
| switch (type()) {
|
| case ChildNodeListType:
|
| return traverseSiblingsForwardToOffset(offset, currentNode, currentOffset);
|
| case HTMLTagNodeListType:
|
| - return traverseMatchingElementsForwardToOffset(static_cast<const HTMLTagNodeList*>(this), offset, toElement(currentNode), currentOffset, root);
|
| + return traverseMatchingElementsForwardToOffset(static_cast<const HTMLTagNodeList&>(*this), offset, toElement(currentNode), currentOffset, root);
|
| case ClassNodeListType:
|
| - return traverseMatchingElementsForwardToOffset(static_cast<const ClassNodeList*>(this), offset, toElement(currentNode), currentOffset, root);
|
| + return traverseMatchingElementsForwardToOffset(static_cast<const ClassNodeList&>(*this), offset, toElement(currentNode), currentOffset, root);
|
| default:
|
| - return traverseMatchingElementsForwardToOffset(this, offset, toElement(currentNode), currentOffset, root);
|
| + return traverseMatchingElementsForwardToOffset(*this, offset, toElement(currentNode), currentOffset, root);
|
| }
|
| }
|
|
|
| @@ -455,10 +455,10 @@ Node* LiveNodeListBase::item(unsigned offset) const
|
| if (cachedItemOffset() == offset)
|
| return cachedItem();
|
|
|
| - return itemBeforeOrAfterCachedItem(offset, root);
|
| + return itemBeforeOrAfterCachedItem(offset, *root);
|
| }
|
|
|
| -inline Node* LiveNodeListBase::itemBeforeOrAfterCachedItem(unsigned offset, ContainerNode* root) const
|
| +inline Node* LiveNodeListBase::itemBeforeOrAfterCachedItem(unsigned offset, const ContainerNode& root) const
|
| {
|
| unsigned currentOffset = cachedItemOffset();
|
| Node* currentItem = cachedItem();
|
| @@ -499,70 +499,70 @@ Element* HTMLCollection::virtualItemAfter(Element*) const
|
| return 0;
|
| }
|
|
|
| -static inline bool nameShouldBeVisibleInDocumentAll(HTMLElement* element)
|
| +static inline bool nameShouldBeVisibleInDocumentAll(const HTMLElement& element)
|
| {
|
| // The document.all collection returns only certain types of elements by name,
|
| // although it returns any type of element by id.
|
| - return element->hasLocalName(appletTag)
|
| - || element->hasLocalName(embedTag)
|
| - || element->hasLocalName(formTag)
|
| - || element->hasLocalName(imgTag)
|
| - || element->hasLocalName(inputTag)
|
| - || element->hasLocalName(objectTag)
|
| - || element->hasLocalName(selectTag);
|
| + return element.hasLocalName(appletTag)
|
| + || element.hasLocalName(embedTag)
|
| + || element.hasLocalName(formTag)
|
| + || element.hasLocalName(imgTag)
|
| + || element.hasLocalName(inputTag)
|
| + || element.hasLocalName(objectTag)
|
| + || element.hasLocalName(selectTag);
|
| }
|
|
|
| -bool HTMLCollection::checkForNameMatch(Element* element, bool checkName, const AtomicString& name) const
|
| +bool HTMLCollection::checkForNameMatch(const Element& element, bool checkName, const AtomicString& name) const
|
| {
|
| - if (!element->isHTMLElement())
|
| + if (!element.isHTMLElement())
|
| return false;
|
|
|
| - HTMLElement* e = toHTMLElement(element);
|
| + const HTMLElement& e = toHTMLElement(element);
|
| if (!checkName)
|
| - return e->getIdAttribute() == name;
|
| + return e.getIdAttribute() == name;
|
|
|
| if (type() == DocAll && !nameShouldBeVisibleInDocumentAll(e))
|
| return false;
|
|
|
| - return e->getNameAttribute() == name && e->getIdAttribute() != name;
|
| + return e.getNameAttribute() == name && e.getIdAttribute() != name;
|
| }
|
|
|
| -inline Element* firstMatchingChildElement(const HTMLCollection* nodeList, ContainerNode& root)
|
| +inline Element* firstMatchingChildElement(const HTMLCollection& nodeList, const ContainerNode& root)
|
| {
|
| Element* element = ElementTraversal::firstWithin(root);
|
| - while (element && !isMatchingElement(nodeList, element))
|
| + while (element && !isMatchingElement(nodeList, *element))
|
| element = ElementTraversal::nextSkippingChildren(*element, &root);
|
| return element;
|
| }
|
|
|
| -inline Element* nextMatchingChildElement(const HTMLCollection* nodeList, Element& current, ContainerNode* root)
|
| +inline Element* nextMatchingChildElement(const HTMLCollection& nodeList, Element& current, const ContainerNode& root)
|
| {
|
| Element* next = ¤t;
|
| do {
|
| - next = ElementTraversal::nextSkippingChildren(*next, root);
|
| - } while (next && !isMatchingElement(nodeList, next));
|
| + next = ElementTraversal::nextSkippingChildren(*next, &root);
|
| + } while (next && !isMatchingElement(nodeList, *next));
|
| return next;
|
| }
|
|
|
| -inline Element* HTMLCollection::traverseToFirstElement(ContainerNode& root) const
|
| +inline Element* HTMLCollection::traverseToFirstElement(const ContainerNode& root) const
|
| {
|
| if (overridesItemAfter())
|
| return virtualItemAfter(0);
|
| if (shouldOnlyIncludeDirectChildren())
|
| - return firstMatchingChildElement(static_cast<const HTMLCollection*>(this), root);
|
| - return firstMatchingElement(static_cast<const HTMLCollection*>(this), root);
|
| + return firstMatchingChildElement(*this, root);
|
| + return firstMatchingElement(*this, root);
|
| }
|
|
|
| -inline Element* HTMLCollection::traverseNextElement(Element& previous, ContainerNode* root) const
|
| +inline Element* HTMLCollection::traverseNextElement(Element& previous, const ContainerNode& root) const
|
| {
|
| if (overridesItemAfter())
|
| return virtualItemAfter(&previous);
|
| if (shouldOnlyIncludeDirectChildren())
|
| - return nextMatchingChildElement(this, previous, root);
|
| - return nextMatchingElement(this, previous, root);
|
| + return nextMatchingChildElement(*this, previous, root);
|
| + return nextMatchingElement(*this, previous, root);
|
| }
|
|
|
| -inline Element* HTMLCollection::traverseForwardToOffset(unsigned offset, Element& currentElement, unsigned& currentOffset, ContainerNode* root) const
|
| +inline Element* HTMLCollection::traverseForwardToOffset(unsigned offset, Element& currentElement, unsigned& currentOffset, const ContainerNode& root) const
|
| {
|
| ASSERT(currentOffset < offset);
|
| if (overridesItemAfter()) {
|
| @@ -575,13 +575,13 @@ inline Element* HTMLCollection::traverseForwardToOffset(unsigned offset, Element
|
| }
|
| if (shouldOnlyIncludeDirectChildren()) {
|
| Element* next = ¤tElement;
|
| - while ((next = nextMatchingChildElement(this, *next, root))) {
|
| + while ((next = nextMatchingChildElement(*this, *next, root))) {
|
| if (++currentOffset == offset)
|
| return next;
|
| }
|
| return 0;
|
| }
|
| - return traverseMatchingElementsForwardToOffset(this, offset, currentElement, currentOffset, root);
|
| + return traverseMatchingElementsForwardToOffset(*this, offset, currentElement, currentOffset, root);
|
| }
|
|
|
| Node* HTMLCollection::namedItem(const AtomicString& name) const
|
| @@ -597,8 +597,8 @@ Node* HTMLCollection::namedItem(const AtomicString& name) const
|
| return 0;
|
|
|
| unsigned i = 0;
|
| - for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, root)) {
|
| - if (checkForNameMatch(element, /* checkName */ false, name)) {
|
| + for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, *root)) {
|
| + if (checkForNameMatch(*element, /* checkName */ false, name)) {
|
| setItemCache(element, i);
|
| return element;
|
| }
|
| @@ -606,8 +606,8 @@ Node* HTMLCollection::namedItem(const AtomicString& name) const
|
| }
|
|
|
| i = 0;
|
| - for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, root)) {
|
| - if (checkForNameMatch(element, /* checkName */ true, name)) {
|
| + for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, *root)) {
|
| + if (checkForNameMatch(*element, /* checkName */ true, name)) {
|
| setItemCache(element, i);
|
| return element;
|
| }
|
| @@ -626,14 +626,14 @@ void HTMLCollection::updateNameCache() const
|
| if (!root)
|
| return;
|
|
|
| - for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, root)) {
|
| + for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, *root)) {
|
| const AtomicString& idAttrVal = element->getIdAttribute();
|
| if (!idAttrVal.isEmpty())
|
| appendIdCache(idAttrVal, element);
|
| if (!element->isHTMLElement())
|
| continue;
|
| const AtomicString& nameAttrVal = element->getNameAttribute();
|
| - if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && (type() != DocAll || nameShouldBeVisibleInDocumentAll(toHTMLElement(element))))
|
| + if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && (type() != DocAll || nameShouldBeVisibleInDocumentAll(toHTMLElement(*element))))
|
| appendNameCache(nameAttrVal, element);
|
| }
|
|
|
|
|