Chromium Code Reviews| Index: Source/core/dom/DocumentOrderedMap.cpp |
| diff --git a/Source/core/dom/DocumentOrderedMap.cpp b/Source/core/dom/DocumentOrderedMap.cpp |
| index 7c7edc66a87bf198ca086b71f28a5e082d672c1c..eabe7bce6fcfd0b1cb8ad0afaf2f7399973dc0c6 100644 |
| --- a/Source/core/dom/DocumentOrderedMap.cpp |
| +++ b/Source/core/dom/DocumentOrderedMap.cpp |
| @@ -80,6 +80,7 @@ void DocumentOrderedMap::add(StringImpl* key, Element* element) |
| ASSERT(entry.count); |
| entry.element = 0; |
| entry.count++; |
| + entry.orderedList.clear(); |
| } |
| void DocumentOrderedMap::remove(StringImpl* key, Element* element) |
| @@ -97,9 +98,12 @@ void DocumentOrderedMap::remove(StringImpl* key, Element* element) |
| ASSERT(!entry.element || entry.element == element); |
| m_map.remove(it); |
| } else { |
| - if (entry.element == element) |
| - entry.element = 0; |
| + if (entry.element == element) { |
| + ASSERT(entry.orderedList.isEmpty() || entry.orderedList.first() == element); |
| + entry.element = entry.orderedList.size() > 1 ? entry.orderedList[1] : 0; |
| + } |
| entry.count--; |
| + entry.orderedList.clear(); |
| } |
| } |
| @@ -134,6 +138,35 @@ Element* DocumentOrderedMap::getElementById(StringImpl* key, const TreeScope* sc |
| return get<keyMatchesId>(key, scope); |
| } |
| +const Vector<Element*>& DocumentOrderedMap::getAllElementsById(StringImpl* key, const TreeScope* scope) const |
| +{ |
| + ASSERT(key); |
| + ASSERT(scope); |
| + |
| + Map::iterator it = m_map.find(key); |
| + if (it == m_map.end()) { |
| + DEFINE_STATIC_LOCAL(Vector<Element*>, emptyVector, ()); |
|
esprehn
2013/12/18 00:16:50
nit: This should be at the top of the function.
Inactive
2013/12/18 15:25:56
Done.
|
| + return emptyVector; |
| + } |
| + |
| + MapEntry& entry = it->value; |
| + ASSERT(entry.count); |
| + |
| + if (entry.orderedList.isEmpty()) { |
| + entry.orderedList.reserveCapacity(entry.count); |
| + for (Element* element = entry.element ? entry.element : ElementTraversal::firstWithin(*scope->rootNode()); entry.orderedList.size() < entry.count; element = ElementTraversal::next(*element)) { |
| + ASSERT(element); |
| + if (!keyMatchesId(key, element)) |
| + continue; |
| + entry.orderedList.uncheckedAppend(element); |
| + } |
| + if (!entry.element) |
| + entry.element = entry.orderedList.first(); |
| + } |
| + |
| + return entry.orderedList; |
| +} |
| + |
| Element* DocumentOrderedMap::getElementByMapName(StringImpl* key, const TreeScope* scope) const |
| { |
| return get<keyMatchesMapName>(key, scope); |