Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/dom/NthIndexCache.h" | 5 #include "core/dom/NthIndexCache.h" |
| 6 | 6 |
| 7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
| 8 #include "core/dom/ElementTraversal.h" | 8 #include "core/dom/ElementTraversal.h" |
| 9 | 9 |
| 10 namespace blink { | 10 namespace blink { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 if (sibling->tagQName() == tag) | 72 if (sibling->tagQName() == tag) |
| 73 ++index; | 73 ++index; |
| 74 ++siblingCount; | 74 ++siblingCount; |
| 75 } | 75 } |
| 76 return index; | 76 return index; |
| 77 } | 77 } |
| 78 | 78 |
| 79 } // namespace | 79 } // namespace |
| 80 | 80 |
| 81 unsigned NthIndexCache::nthChildIndex(Element& element) { | 81 unsigned NthIndexCache::nthChildIndex(Element& element) { |
| 82 if (element.isPseudoElement()) | 82 if (element.isPseudoElement() || !element.parentNode()) |
| 83 return 1; | 83 return 1; |
| 84 DCHECK(element.parentNode()); | |
| 85 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); | 84 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); |
| 86 NthIndexData* nthIndexData = nullptr; | 85 NthIndexData* nthIndexData = nullptr; |
| 87 if (nthIndexCache && nthIndexCache->m_parentMap) | 86 if (nthIndexCache && nthIndexCache->m_parentMap) |
| 88 nthIndexData = nthIndexCache->m_parentMap->get(element.parentNode()); | 87 nthIndexData = nthIndexCache->m_parentMap->get(element.parentNode()); |
| 89 if (nthIndexData) | 88 if (nthIndexData) |
| 90 return nthIndexData->nthIndex(element); | 89 return nthIndexData->nthIndex(element); |
| 91 unsigned index = uncachedNthChildIndex(element); | 90 unsigned index = uncachedNthChildIndex(element); |
| 92 if (nthIndexCache && index > kCachedSiblingCountLimit) | 91 if (element.parentNode() && nthIndexCache && index > kCachedSiblingCountLimit) |
|
rune
2017/01/18 21:33:19
parentNode() is always non-null here.
emilio
2017/01/18 23:33:07
Good catches, sorry, should've paged in better all
| |
| 93 nthIndexCache->cacheNthIndexDataForParent(element); | 92 nthIndexCache->cacheNthIndexDataForParent(element); |
| 94 return index; | 93 return index; |
| 95 } | 94 } |
| 96 | 95 |
| 97 unsigned NthIndexCache::nthLastChildIndex(Element& element) { | 96 unsigned NthIndexCache::nthLastChildIndex(Element& element) { |
| 98 if (element.isPseudoElement()) | 97 if (element.isPseudoElement()) |
| 99 return 1; | 98 return 1; |
| 100 DCHECK(element.parentNode()); | |
| 101 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); | 99 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); |
| 102 NthIndexData* nthIndexData = nullptr; | 100 NthIndexData* nthIndexData = nullptr; |
| 103 if (nthIndexCache && nthIndexCache->m_parentMap) | 101 if (element.parentNode() && nthIndexCache && nthIndexCache->m_parentMap) |
|
rune
2017/01/18 21:33:19
Check !parentNode and return 1 as for nthChildInde
| |
| 104 nthIndexData = nthIndexCache->m_parentMap->get(element.parentNode()); | 102 nthIndexData = nthIndexCache->m_parentMap->get(element.parentNode()); |
| 105 if (nthIndexData) | 103 if (nthIndexData) |
| 106 return nthIndexData->nthLastIndex(element); | 104 return nthIndexData->nthLastIndex(element); |
| 107 unsigned index = uncachedNthLastChildIndex(element); | 105 unsigned index = uncachedNthLastChildIndex(element); |
| 108 if (nthIndexCache && index > kCachedSiblingCountLimit) | 106 if (element.parentNode() && nthIndexCache && index > kCachedSiblingCountLimit) |
|
rune
2017/01/18 21:33:19
No need to add the parentNode() check if you early
| |
| 109 nthIndexCache->cacheNthIndexDataForParent(element); | 107 nthIndexCache->cacheNthIndexDataForParent(element); |
| 110 return index; | 108 return index; |
| 111 } | 109 } |
| 112 | 110 |
| 113 NthIndexData* NthIndexCache::nthTypeIndexDataForParent(Element& element) const { | 111 NthIndexData* NthIndexCache::nthTypeIndexDataForParent(Element& element) const { |
| 114 DCHECK(element.parentNode()); | 112 if (!m_parentMapForType || !element.parentNode()) |
|
rune
2017/01/18 21:33:19
Early return in nthOfTypeIndex and nthLastOfTypeIn
| |
| 115 if (!m_parentMapForType) | |
| 116 return nullptr; | 113 return nullptr; |
| 117 if (const IndexByType* map = m_parentMapForType->get(element.parentNode())) | 114 if (const IndexByType* map = m_parentMapForType->get(element.parentNode())) |
| 118 return map->get(element.tagName()); | 115 return map->get(element.tagName()); |
| 119 return nullptr; | 116 return nullptr; |
| 120 } | 117 } |
| 121 | 118 |
| 122 unsigned NthIndexCache::nthOfTypeIndex(Element& element) { | 119 unsigned NthIndexCache::nthOfTypeIndex(Element& element) { |
| 123 if (element.isPseudoElement()) | 120 if (element.isPseudoElement()) |
| 124 return 1; | 121 return 1; |
| 125 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); | 122 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 256 } | 253 } |
| 257 DCHECK(count); | 254 DCHECK(count); |
| 258 m_count = count; | 255 m_count = count; |
| 259 } | 256 } |
| 260 | 257 |
| 261 DEFINE_TRACE(NthIndexData) { | 258 DEFINE_TRACE(NthIndexData) { |
| 262 visitor->trace(m_elementIndexMap); | 259 visitor->trace(m_elementIndexMap); |
| 263 } | 260 } |
| 264 | 261 |
| 265 } // namespace blink | 262 } // namespace blink |
| OLD | NEW |