2c02747c6c5a28fb7dc6daf18f7bbfa7e4a54029
[WebKit-https.git] / Source / WebCore / dom / TagCollection.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004-2008, 2014-2016 Apple Inc. All rights reserved.
6  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  */
23
24 #pragma once
25
26 #include "CachedHTMLCollection.h"
27 #include <wtf/text/AtomicString.h>
28
29 namespace WebCore {
30
31 // HTMLCollection that limits to a particular tag.
32 class TagCollection final : public CachedHTMLCollection<TagCollection, CollectionTypeTraits<ByTag>::traversalType> {
33 public:
34     static Ref<TagCollection> create(ContainerNode& rootNode, CollectionType type, const AtomicString& qualifiedName)
35     {
36         ASSERT_UNUSED(type, type == ByTag);
37         return adoptRef(*new TagCollection(rootNode, qualifiedName));
38     }
39
40     virtual ~TagCollection();
41     bool elementMatches(Element&) const;
42
43 private:
44     TagCollection(ContainerNode& rootNode, const AtomicString& qualifiedName);
45
46     AtomicString m_qualifiedName;
47 };
48
49 class TagCollectionNS final : public CachedHTMLCollection<TagCollectionNS, CollectionTypeTraits<ByTag>::traversalType> {
50 public:
51     static Ref<TagCollectionNS> create(ContainerNode& rootNode, const AtomicString& namespaceURI, const AtomicString& localName)
52     {
53         return adoptRef(*new TagCollectionNS(rootNode, namespaceURI, localName));
54     }
55
56     virtual ~TagCollectionNS();
57     bool elementMatches(Element&) const;
58
59 private:
60     TagCollectionNS(ContainerNode& rootNode, const AtomicString& namespaceURI, const AtomicString& localName);
61
62     AtomicString m_namespaceURI;
63     AtomicString m_localName;
64 };
65
66 class HTMLTagCollection final : public CachedHTMLCollection<HTMLTagCollection, CollectionTypeTraits<ByHTMLTag>::traversalType> {
67 public:
68     static Ref<HTMLTagCollection> create(ContainerNode& rootNode, CollectionType type, const AtomicString& qualifiedName)
69     {
70         ASSERT_UNUSED(type, type == ByHTMLTag);
71         return adoptRef(*new HTMLTagCollection(rootNode, qualifiedName));
72     }
73
74     virtual ~HTMLTagCollection();
75     bool elementMatches(Element&) const;
76
77 private:
78     HTMLTagCollection(ContainerNode& rootNode, const AtomicString& qualifiedName);
79
80     AtomicString m_qualifiedName;
81     AtomicString m_loweredQualifiedName;
82 };
83
84 inline bool TagCollection::elementMatches(Element& element) const
85 {
86     return m_qualifiedName == element.tagQName().toString();
87 }
88
89 inline bool TagCollectionNS::elementMatches(Element& element) const
90 {
91     if (m_localName != starAtom && m_localName != element.localName())
92         return false;
93     return m_namespaceURI == starAtom || m_namespaceURI == element.namespaceURI();
94 }
95
96 inline bool HTMLTagCollection::elementMatches(Element& element) const
97 {
98     if (element.isHTMLElement())
99         return m_loweredQualifiedName == element.tagQName().toString();
100     return m_qualifiedName == element.tagQName().toString();
101 }
102
103 } // namespace WebCore