15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef TagNodeList_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define TagNodeList_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/LiveNodeList.h"
29e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/text/AtomicString.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// NodeList that limits to a particular tag.
34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class TagNodeList : public LiveNodeList {
35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static PassRefPtr<TagNodeList> create(PassRefPtr<Node> rootNode, const AtomicString& namespaceURI, const AtomicString& localName)
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(namespaceURI != starAtom);
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return adoptRef(new TagNodeList(rootNode, TagNodeListType, namespaceURI, localName));
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static PassRefPtr<TagNodeList> create(PassRefPtr<Node> rootNode, CollectionType type, const AtomicString& localName)
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT_UNUSED(type, type == TagNodeListType);
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return adoptRef(new TagNodeList(rootNode, TagNodeListType, starAtom, localName));
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual ~TagNodeList();
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)protected:
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TagNodeList(PassRefPtr<Node> rootNode, CollectionType, const AtomicString& namespaceURI, const AtomicString& localName);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual bool nodeMatches(Element*) const;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AtomicString m_namespaceURI;
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AtomicString m_localName;
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class HTMLTagNodeList : public TagNodeList {
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static PassRefPtr<HTMLTagNodeList> create(PassRefPtr<Node> rootNode, CollectionType type, const AtomicString& localName)
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT_UNUSED(type, type == HTMLTagNodeListType);
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return adoptRef(new HTMLTagNodeList(rootNode, localName));
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool nodeMatchesInlined(Element*) const;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HTMLTagNodeList(PassRefPtr<Node> rootNode, const AtomicString& localName);
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual bool nodeMatches(Element*) const;
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AtomicString m_loweredLocalName;
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline bool HTMLTagNodeList::nodeMatchesInlined(Element* testNode) const
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Implements http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#concept-getelementsbytagname
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_localName != starAtom) {
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const AtomicString& localName = testNode->isHTMLElement() ? m_loweredLocalName : m_localName;
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (localName != testNode->localName())
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return false;
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_namespaceURI == starAtom);
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // TagNodeList_h
92