#ifndef TagNodeList_h
#define TagNodeList_h
#include "Element.h"
#include "LiveNodeList.h"
#include <wtf/text/AtomicString.h>
namespace WebCore {
class TagNodeList : public LiveNodeList {
public:
static PassRefPtr<TagNodeList> create(PassRefPtr<Node> rootNode, const AtomicString& namespaceURI, const AtomicString& localName)
{
ASSERT(namespaceURI != starAtom);
return adoptRef(new TagNodeList(rootNode, TagNodeListType, namespaceURI, localName));
}
static PassRefPtr<TagNodeList> create(PassRefPtr<Node> rootNode, CollectionType type, const AtomicString& localName)
{
ASSERT_UNUSED(type, type == TagNodeListType);
return adoptRef(new TagNodeList(rootNode, TagNodeListType, starAtom, localName));
}
virtual ~TagNodeList();
protected:
TagNodeList(PassRefPtr<Node> rootNode, CollectionType, const AtomicString& namespaceURI, const AtomicString& localName);
virtual bool nodeMatches(Element*) const;
AtomicString m_namespaceURI;
AtomicString m_localName;
};
class HTMLTagNodeList : public TagNodeList {
public:
static PassRefPtr<HTMLTagNodeList> create(PassRefPtr<Node> rootNode, CollectionType type, const AtomicString& localName)
{
ASSERT_UNUSED(type, type == HTMLTagNodeListType);
return adoptRef(new HTMLTagNodeList(rootNode, localName));
}
bool nodeMatchesInlined(Element*) const;
private:
HTMLTagNodeList(PassRefPtr<Node> rootNode, const AtomicString& localName);
virtual bool nodeMatches(Element*) const;
AtomicString m_loweredLocalName;
};
inline bool HTMLTagNodeList::nodeMatchesInlined(Element* testNode) const
{
if (m_localName != starAtom) {
const AtomicString& localName = testNode->isHTMLElement() ? m_loweredLocalName : m_localName;
if (localName != testNode->localName())
return false;
}
ASSERT(m_namespaceURI == starAtom);
return true;
}
}
#endif // TagNodeList_h