| 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 (nthIndexCache && index > kCachedSiblingCountLimit) |
| 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() && !element.parentNode()) |
| 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 (nthIndexCache && nthIndexCache->m_parentMap) |
| 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 (nthIndexCache && index > kCachedSiblingCountLimit) |
| 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 DCHECK(element.parentNode()); |
| 115 if (!m_parentMapForType) | 113 if (!m_parentMapForType) |
| 116 return nullptr; | 114 return nullptr; |
| 117 if (const IndexByType* map = m_parentMapForType->get(element.parentNode())) | 115 if (const IndexByType* map = m_parentMapForType->get(element.parentNode())) |
| 118 return map->get(element.tagName()); | 116 return map->get(element.tagName()); |
| 119 return nullptr; | 117 return nullptr; |
| 120 } | 118 } |
| 121 | 119 |
| 122 unsigned NthIndexCache::nthOfTypeIndex(Element& element) { | 120 unsigned NthIndexCache::nthOfTypeIndex(Element& element) { |
| 123 if (element.isPseudoElement()) | 121 if (element.isPseudoElement() || !element.parentNode()) |
| 124 return 1; | 122 return 1; |
| 125 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); | 123 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); |
| 126 if (nthIndexCache) { | 124 if (nthIndexCache) { |
| 127 if (NthIndexData* nthIndexData = | 125 if (NthIndexData* nthIndexData = |
| 128 nthIndexCache->nthTypeIndexDataForParent(element)) | 126 nthIndexCache->nthTypeIndexDataForParent(element)) |
| 129 return nthIndexData->nthOfTypeIndex(element); | 127 return nthIndexData->nthOfTypeIndex(element); |
| 130 } | 128 } |
| 131 unsigned siblingCount = 0; | 129 unsigned siblingCount = 0; |
| 132 unsigned index = uncachedNthOfTypeIndex(element, siblingCount); | 130 unsigned index = uncachedNthOfTypeIndex(element, siblingCount); |
| 133 if (nthIndexCache && siblingCount > kCachedSiblingCountLimit) | 131 if (nthIndexCache && siblingCount > kCachedSiblingCountLimit) |
| 134 nthIndexCache->cacheNthOfTypeIndexDataForParent(element); | 132 nthIndexCache->cacheNthOfTypeIndexDataForParent(element); |
| 135 return index; | 133 return index; |
| 136 } | 134 } |
| 137 | 135 |
| 138 unsigned NthIndexCache::nthLastOfTypeIndex(Element& element) { | 136 unsigned NthIndexCache::nthLastOfTypeIndex(Element& element) { |
| 139 if (element.isPseudoElement()) | 137 if (element.isPseudoElement() || !element.parentNode()) |
| 140 return 1; | 138 return 1; |
| 141 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); | 139 NthIndexCache* nthIndexCache = element.document().nthIndexCache(); |
| 142 if (nthIndexCache) { | 140 if (nthIndexCache) { |
| 143 if (NthIndexData* nthIndexData = | 141 if (NthIndexData* nthIndexData = |
| 144 nthIndexCache->nthTypeIndexDataForParent(element)) | 142 nthIndexCache->nthTypeIndexDataForParent(element)) |
| 145 return nthIndexData->nthLastOfTypeIndex(element); | 143 return nthIndexData->nthLastOfTypeIndex(element); |
| 146 } | 144 } |
| 147 unsigned siblingCount = 0; | 145 unsigned siblingCount = 0; |
| 148 unsigned index = uncachedNthLastOfTypeIndex(element, siblingCount); | 146 unsigned index = uncachedNthLastOfTypeIndex(element, siblingCount); |
| 149 if (nthIndexCache && siblingCount > kCachedSiblingCountLimit) | 147 if (nthIndexCache && siblingCount > kCachedSiblingCountLimit) |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 } | 254 } |
| 257 DCHECK(count); | 255 DCHECK(count); |
| 258 m_count = count; | 256 m_count = count; |
| 259 } | 257 } |
| 260 | 258 |
| 261 DEFINE_TRACE(NthIndexData) { | 259 DEFINE_TRACE(NthIndexData) { |
| 262 visitor->trace(m_elementIndexMap); | 260 visitor->trace(m_elementIndexMap); |
| 263 } | 261 } |
| 264 | 262 |
| 265 } // namespace blink | 263 } // namespace blink |
| OLD | NEW |