1/*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#pragma once
32
33#include <wtf/HashMap.h>
34#include <wtf/HashSet.h>
35#include <wtf/Vector.h>
36#include <wtf/text/AtomStringImpl.h>
37
38namespace WebCore {
39
40class Element;
41class HTMLImageElement;
42class HTMLLabelElement;
43class HTMLMapElement;
44class TreeScope;
45
46class TreeScopeOrderedMap {
47 WTF_MAKE_FAST_ALLOCATED;
48public:
49 void add(const AtomStringImpl&, Element&, const TreeScope&);
50 void remove(const AtomStringImpl&, Element&);
51 void clear();
52
53 bool contains(const AtomStringImpl&) const;
54 bool containsSingle(const AtomStringImpl&) const;
55 bool containsMultiple(const AtomStringImpl&) const;
56
57 // concrete instantiations of the get<>() method template
58 Element* getElementById(const AtomStringImpl&, const TreeScope&) const;
59 Element* getElementByName(const AtomStringImpl&, const TreeScope&) const;
60 HTMLMapElement* getElementByMapName(const AtomStringImpl&, const TreeScope&) const;
61 HTMLImageElement* getElementByUsemap(const AtomStringImpl&, const TreeScope&) const;
62 HTMLLabelElement* getElementByLabelForAttribute(const AtomStringImpl&, const TreeScope&) const;
63 Element* getElementByWindowNamedItem(const AtomStringImpl&, const TreeScope&) const;
64 Element* getElementByDocumentNamedItem(const AtomStringImpl&, const TreeScope&) const;
65
66 const Vector<Element*>* getAllElementsById(const AtomStringImpl&, const TreeScope&) const;
67
68private:
69 template <typename KeyMatchingFunction>
70 Element* get(const AtomStringImpl&, const TreeScope&, const KeyMatchingFunction&) const;
71
72 struct MapEntry {
73 MapEntry() { }
74 explicit MapEntry(Element* firstElement)
75 : element(firstElement)
76 , count(1)
77 { }
78
79 Element* element { nullptr };
80 unsigned count { 0 };
81 Vector<Element*> orderedList;
82#if !ASSERT_DISABLED || ENABLE(SECURITY_ASSERTIONS)
83 HashSet<Element*> registeredElements;
84#endif
85 };
86
87 typedef HashMap<const AtomStringImpl*, MapEntry> Map;
88
89 mutable Map m_map;
90};
91
92inline bool TreeScopeOrderedMap::containsSingle(const AtomStringImpl& id) const
93{
94 auto it = m_map.find(&id);
95 return it != m_map.end() && it->value.count == 1;
96}
97
98inline bool TreeScopeOrderedMap::contains(const AtomStringImpl& id) const
99{
100 return m_map.contains(&id);
101}
102
103inline bool TreeScopeOrderedMap::containsMultiple(const AtomStringImpl& id) const
104{
105 auto it = m_map.find(&id);
106 return it != m_map.end() && it->value.count > 1;
107}
108
109} // namespace WebCore
110