a4b06877ae64ed798a249578b35d82ecfdcaec8a
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / dom / SelectorQuery.h
1 /*
2  * Copyright (C) 2011, 2013 Apple Inc. All rights reserved.
3  * Copyright (C) 2014 Samsung Electronics. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
19  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef SelectorQuery_h
28 #define SelectorQuery_h
29
30 #include "core/css/CSSSelectorList.h"
31 #include "wtf/HashMap.h"
32 #include "wtf/Vector.h"
33 #include "wtf/text/AtomicStringHash.h"
34
35 namespace WebCore {
36
37 class CSSSelector;
38 class ContainerNode;
39 class Document;
40 class Element;
41 class ExceptionState;
42 class Node;
43 class NodeList;
44 class SimpleNodeList;
45 class SpaceSplitString;
46
47 class SelectorDataList {
48 public:
49     void initialize(const CSSSelectorList&);
50     bool matches(Element&) const;
51     PassRefPtr<NodeList> queryAll(ContainerNode& rootNode) const;
52     PassRefPtr<Element> queryFirst(ContainerNode& rootNode) const;
53
54 private:
55     struct SelectorData {
56         SelectorData(const CSSSelector* selector, bool isFastCheckable) : selector(selector), isFastCheckable(isFastCheckable) { }
57         const CSSSelector* selector;
58         bool isFastCheckable;
59     };
60
61     bool canUseFastQuery(const ContainerNode& rootNode) const;
62     bool selectorMatches(const SelectorData&, Element&, const ContainerNode&) const;
63
64     template <typename SelectorQueryTrait>
65     void collectElementsByClassName(ContainerNode& rootNode, const AtomicString& className, typename SelectorQueryTrait::OutputType&) const;
66     template <typename SelectorQueryTrait>
67     void collectElementsByTagName(ContainerNode& rootNode, const QualifiedName& tagName, typename SelectorQueryTrait::OutputType&) const;
68
69     template <typename SelectorQueryTrait>
70     void findTraverseRootsAndExecute(ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
71
72     enum MatchTraverseRootState { DoesNotMatchTraverseRoots, MatchesTraverseRoots };
73     template <typename SelectorQueryTrait>
74     void executeForTraverseRoot(const SelectorData&, Node* traverseRoot, MatchTraverseRootState, ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
75     template <typename SelectorQueryTrait, typename SimpleNodeListType>
76     void executeForTraverseRoots(const SelectorData&, SimpleNodeListType& traverseRoots, MatchTraverseRootState, ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
77
78     template <typename SelectorQueryTrait>
79     void executeSlow(ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
80     template <typename SelectorQueryTrait>
81     void execute(ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
82     const CSSSelector* selectorForIdLookup(const CSSSelector*) const;
83
84     Vector<SelectorData> m_selectors;
85 };
86
87 class SelectorQuery {
88     WTF_MAKE_NONCOPYABLE(SelectorQuery);
89     WTF_MAKE_FAST_ALLOCATED;
90 public:
91     explicit SelectorQuery(const CSSSelectorList&);
92     bool matches(Element&) const;
93     PassRefPtr<NodeList> queryAll(ContainerNode& rootNode) const;
94     PassRefPtr<Element> queryFirst(ContainerNode& rootNode) const;
95 private:
96     SelectorDataList m_selectors;
97     CSSSelectorList m_selectorList;
98 };
99
100 class SelectorQueryCache {
101     WTF_MAKE_FAST_ALLOCATED;
102 public:
103     SelectorQuery* add(const AtomicString&, const Document&, ExceptionState&);
104     void invalidate();
105
106 private:
107     HashMap<AtomicString, OwnPtr<SelectorQuery> > m_entries;
108 };
109
110 }
111
112 #endif