OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "HTMLNames.h" | 34 #include "HTMLNames.h" |
35 #include "core/dom/Element.h" | 35 #include "core/dom/Element.h" |
36 #include "core/dom/ElementTraversal.h" | 36 #include "core/dom/ElementTraversal.h" |
37 #include "core/dom/TreeScope.h" | 37 #include "core/dom/TreeScope.h" |
38 #include "core/html/HTMLMapElement.h" | 38 #include "core/html/HTMLMapElement.h" |
39 | 39 |
40 namespace WebCore { | 40 namespace WebCore { |
41 | 41 |
42 using namespace HTMLNames; | 42 using namespace HTMLNames; |
43 | 43 |
44 inline bool keyMatchesId(StringImpl* key, Element* element) | 44 inline bool keyMatchesId(StringImpl* key, Element& element) |
45 { | 45 { |
46 return element->getIdAttribute().impl() == key; | 46 return element.getIdAttribute().impl() == key; |
47 } | 47 } |
48 | 48 |
49 inline bool keyMatchesMapName(StringImpl* key, Element* element) | 49 inline bool keyMatchesMapName(StringImpl* key, Element& element) |
50 { | 50 { |
51 return element->hasTagName(mapTag) && toHTMLMapElement(element)->getName().i
mpl() == key; | 51 return isHTMLMapElement(element) && toHTMLMapElement(element).getName().impl
() == key; |
52 } | 52 } |
53 | 53 |
54 inline bool keyMatchesLowercasedMapName(StringImpl* key, Element* element) | 54 inline bool keyMatchesLowercasedMapName(StringImpl* key, Element& element) |
55 { | 55 { |
56 return element->hasTagName(mapTag) && toHTMLMapElement(element)->getName().l
ower().impl() == key; | 56 return isHTMLMapElement(element) && toHTMLMapElement(element).getName().lowe
r().impl() == key; |
57 } | 57 } |
58 | 58 |
59 inline bool keyMatchesLabelForAttribute(StringImpl* key, Element* element) | 59 inline bool keyMatchesLabelForAttribute(StringImpl* key, Element& element) |
60 { | 60 { |
61 return element->hasTagName(labelTag) && element->getAttribute(forAttr).impl(
) == key; | 61 return isHTMLLabelElement(element) && element.getAttribute(forAttr).impl() =
= key; |
62 } | 62 } |
63 | 63 |
64 void DocumentOrderedMap::add(StringImpl* key, Element* element) | 64 void DocumentOrderedMap::add(StringImpl* key, Element* element) |
65 { | 65 { |
66 ASSERT(key); | 66 ASSERT(key); |
67 ASSERT(element); | 67 ASSERT(element); |
68 | 68 |
69 Map::AddResult addResult = m_map.add(key, adoptPtr(new MapEntry(element))); | 69 Map::AddResult addResult = m_map.add(key, adoptPtr(new MapEntry(element))); |
70 if (addResult.isNewEntry) | 70 if (addResult.isNewEntry) |
71 return; | 71 return; |
(...skipping 22 matching lines...) Expand all Loading... |
94 } else { | 94 } else { |
95 if (entry->element == element) { | 95 if (entry->element == element) { |
96 ASSERT(entry->orderedList.isEmpty() || entry->orderedList.first() ==
element); | 96 ASSERT(entry->orderedList.isEmpty() || entry->orderedList.first() ==
element); |
97 entry->element = entry->orderedList.size() > 1 ? entry->orderedList[
1] : 0; | 97 entry->element = entry->orderedList.size() > 1 ? entry->orderedList[
1] : 0; |
98 } | 98 } |
99 entry->count--; | 99 entry->count--; |
100 entry->orderedList.clear(); | 100 entry->orderedList.clear(); |
101 } | 101 } |
102 } | 102 } |
103 | 103 |
104 template<bool keyMatches(StringImpl*, Element*)> | 104 template<bool keyMatches(StringImpl*, Element&)> |
105 inline Element* DocumentOrderedMap::get(StringImpl* key, const TreeScope* scope)
const | 105 inline Element* DocumentOrderedMap::get(StringImpl* key, const TreeScope* scope)
const |
106 { | 106 { |
107 ASSERT(key); | 107 ASSERT(key); |
108 ASSERT(scope); | 108 ASSERT(scope); |
109 | 109 |
110 MapEntry* entry = m_map.get(key); | 110 MapEntry* entry = m_map.get(key); |
111 if (!entry) | 111 if (!entry) |
112 return 0; | 112 return 0; |
113 | 113 |
114 ASSERT(entry->count); | 114 ASSERT(entry->count); |
115 if (entry->element) | 115 if (entry->element) |
116 return entry->element; | 116 return entry->element; |
117 | 117 |
118 // We know there's at least one node that matches; iterate to find the first
one. | 118 // We know there's at least one node that matches; iterate to find the first
one. |
119 for (Element* element = ElementTraversal::firstWithin(scope->rootNode()); el
ement; element = ElementTraversal::next(*element)) { | 119 for (Element* element = ElementTraversal::firstWithin(scope->rootNode()); el
ement; element = ElementTraversal::next(*element)) { |
120 if (!keyMatches(key, element)) | 120 if (!keyMatches(key, *element)) |
121 continue; | 121 continue; |
122 entry->element = element; | 122 entry->element = element; |
123 return element; | 123 return element; |
124 } | 124 } |
125 ASSERT_NOT_REACHED(); | 125 ASSERT_NOT_REACHED(); |
126 return 0; | 126 return 0; |
127 } | 127 } |
128 | 128 |
129 Element* DocumentOrderedMap::getElementById(StringImpl* key, const TreeScope* sc
ope) const | 129 Element* DocumentOrderedMap::getElementById(StringImpl* key, const TreeScope* sc
ope) const |
130 { | 130 { |
(...skipping 10 matching lines...) Expand all Loading... |
141 if (it == m_map.end()) | 141 if (it == m_map.end()) |
142 return emptyVector; | 142 return emptyVector; |
143 | 143 |
144 OwnPtr<MapEntry>& entry = it->value; | 144 OwnPtr<MapEntry>& entry = it->value; |
145 ASSERT(entry->count); | 145 ASSERT(entry->count); |
146 | 146 |
147 if (entry->orderedList.isEmpty()) { | 147 if (entry->orderedList.isEmpty()) { |
148 entry->orderedList.reserveCapacity(entry->count); | 148 entry->orderedList.reserveCapacity(entry->count); |
149 for (Element* element = entry->element ? entry->element : ElementTravers
al::firstWithin(scope->rootNode()); entry->orderedList.size() < entry->count; el
ement = ElementTraversal::next(*element)) { | 149 for (Element* element = entry->element ? entry->element : ElementTravers
al::firstWithin(scope->rootNode()); entry->orderedList.size() < entry->count; el
ement = ElementTraversal::next(*element)) { |
150 ASSERT(element); | 150 ASSERT(element); |
151 if (!keyMatchesId(key, element)) | 151 if (!keyMatchesId(key, *element)) |
152 continue; | 152 continue; |
153 entry->orderedList.uncheckedAppend(element); | 153 entry->orderedList.uncheckedAppend(element); |
154 } | 154 } |
155 if (!entry->element) | 155 if (!entry->element) |
156 entry->element = entry->orderedList.first(); | 156 entry->element = entry->orderedList.first(); |
157 } | 157 } |
158 | 158 |
159 return entry->orderedList; | 159 return entry->orderedList; |
160 } | 160 } |
161 | 161 |
162 Element* DocumentOrderedMap::getElementByMapName(StringImpl* key, const TreeScop
e* scope) const | 162 Element* DocumentOrderedMap::getElementByMapName(StringImpl* key, const TreeScop
e* scope) const |
163 { | 163 { |
164 return get<keyMatchesMapName>(key, scope); | 164 return get<keyMatchesMapName>(key, scope); |
165 } | 165 } |
166 | 166 |
167 Element* DocumentOrderedMap::getElementByLowercasedMapName(StringImpl* key, cons
t TreeScope* scope) const | 167 Element* DocumentOrderedMap::getElementByLowercasedMapName(StringImpl* key, cons
t TreeScope* scope) const |
168 { | 168 { |
169 return get<keyMatchesLowercasedMapName>(key, scope); | 169 return get<keyMatchesLowercasedMapName>(key, scope); |
170 } | 170 } |
171 | 171 |
172 Element* DocumentOrderedMap::getElementByLabelForAttribute(StringImpl* key, cons
t TreeScope* scope) const | 172 Element* DocumentOrderedMap::getElementByLabelForAttribute(StringImpl* key, cons
t TreeScope* scope) const |
173 { | 173 { |
174 return get<keyMatchesLabelForAttribute>(key, scope); | 174 return get<keyMatchesLabelForAttribute>(key, scope); |
175 } | 175 } |
176 | 176 |
177 } // namespace WebCore | 177 } // namespace WebCore |
OLD | NEW |