| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
| 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights |
| 6 * reserved. | 6 * reserved. |
| 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
| 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 10 * (http://www.torchmobile.com/) | 10 * (http://www.torchmobile.com/) |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 DCHECK(classNames[i].impl()); | 57 DCHECK(classNames[i].impl()); |
| 58 // Speculative fix for https://crbug.com/646026 | 58 // Speculative fix for https://crbug.com/646026 |
| 59 if (classNames[i].impl()) | 59 if (classNames[i].impl()) |
| 60 identifierHashes.push_back(classNames[i].impl()->existingHash() * | 60 identifierHashes.push_back(classNames[i].impl()->existingHash() * |
| 61 ClassAttributeSalt); | 61 ClassAttributeSalt); |
| 62 } | 62 } |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 | 65 |
| 66 void SelectorFilter::pushParentStackFrame(Element& parent) { | 66 void SelectorFilter::pushParentStackFrame(Element& parent) { |
| 67 ASSERT(m_ancestorIdentifierFilter); | 67 DCHECK(m_ancestorIdentifierFilter); |
| 68 ASSERT(m_parentStack.isEmpty() || | 68 DCHECK(m_parentStack.isEmpty() || |
| 69 m_parentStack.back().element == parent.parentOrShadowHostElement()); | 69 m_parentStack.back().element == parent.parentOrShadowHostElement()); |
| 70 ASSERT(!m_parentStack.isEmpty() || !parent.parentOrShadowHostElement()); | 70 DCHECK(!m_parentStack.isEmpty() || !parent.parentOrShadowHostElement()); |
| 71 m_parentStack.push_back(ParentStackFrame(parent)); | 71 m_parentStack.push_back(ParentStackFrame(parent)); |
| 72 ParentStackFrame& parentFrame = m_parentStack.back(); | 72 ParentStackFrame& parentFrame = m_parentStack.back(); |
| 73 // Mix tags, class names and ids into some sort of weird bouillabaisse. | 73 // Mix tags, class names and ids into some sort of weird bouillabaisse. |
| 74 // The filter is used for fast rejection of child and descendant selectors. | 74 // The filter is used for fast rejection of child and descendant selectors. |
| 75 collectElementIdentifierHashes(parent, parentFrame.identifierHashes); | 75 collectElementIdentifierHashes(parent, parentFrame.identifierHashes); |
| 76 size_t count = parentFrame.identifierHashes.size(); | 76 size_t count = parentFrame.identifierHashes.size(); |
| 77 for (size_t i = 0; i < count; ++i) | 77 for (size_t i = 0; i < count; ++i) |
| 78 m_ancestorIdentifierFilter->add(parentFrame.identifierHashes[i]); | 78 m_ancestorIdentifierFilter->add(parentFrame.identifierHashes[i]); |
| 79 } | 79 } |
| 80 | 80 |
| 81 void SelectorFilter::popParentStackFrame() { | 81 void SelectorFilter::popParentStackFrame() { |
| 82 ASSERT(!m_parentStack.isEmpty()); | 82 DCHECK(!m_parentStack.isEmpty()); |
| 83 ASSERT(m_ancestorIdentifierFilter); | 83 DCHECK(m_ancestorIdentifierFilter); |
| 84 const ParentStackFrame& parentFrame = m_parentStack.back(); | 84 const ParentStackFrame& parentFrame = m_parentStack.back(); |
| 85 size_t count = parentFrame.identifierHashes.size(); | 85 size_t count = parentFrame.identifierHashes.size(); |
| 86 for (size_t i = 0; i < count; ++i) | 86 for (size_t i = 0; i < count; ++i) |
| 87 m_ancestorIdentifierFilter->remove(parentFrame.identifierHashes[i]); | 87 m_ancestorIdentifierFilter->remove(parentFrame.identifierHashes[i]); |
| 88 m_parentStack.pop_back(); | 88 m_parentStack.pop_back(); |
| 89 if (m_parentStack.isEmpty()) { | 89 if (m_parentStack.isEmpty()) { |
| 90 ASSERT(m_ancestorIdentifierFilter->likelyEmpty()); | 90 ASSERT(m_ancestorIdentifierFilter->likelyEmpty()); |
| 91 m_ancestorIdentifierFilter.reset(); | 91 m_ancestorIdentifierFilter.reset(); |
| 92 } | 92 } |
| 93 } | 93 } |
| 94 | 94 |
| 95 void SelectorFilter::pushParent(Element& parent) { | 95 void SelectorFilter::pushParent(Element& parent) { |
| 96 ASSERT(parent.document().inStyleRecalc()); | 96 DCHECK(parent.document().inStyleRecalc()); |
| 97 ASSERT(parent.inActiveDocument()); | 97 DCHECK(parent.inActiveDocument()); |
| 98 if (m_parentStack.isEmpty()) { | 98 if (m_parentStack.isEmpty()) { |
| 99 ASSERT(parent == parent.document().documentElement()); | 99 DCHECK_EQ(parent, parent.document().documentElement()); |
| 100 ASSERT(!m_ancestorIdentifierFilter); | 100 DCHECK(!m_ancestorIdentifierFilter); |
| 101 m_ancestorIdentifierFilter = WTF::wrapUnique(new IdentifierFilter); | 101 m_ancestorIdentifierFilter = WTF::wrapUnique(new IdentifierFilter); |
| 102 pushParentStackFrame(parent); | 102 pushParentStackFrame(parent); |
| 103 return; | 103 return; |
| 104 } | 104 } |
| 105 ASSERT(m_ancestorIdentifierFilter); | 105 DCHECK(m_ancestorIdentifierFilter); |
| 106 // We may get invoked for some random elements in some wacky cases during | 106 // We may get invoked for some random elements in some wacky cases during |
| 107 // style resolve. Pause maintaining the stack in this case. | 107 // style resolve. Pause maintaining the stack in this case. |
| 108 if (m_parentStack.back().element != parent.parentOrShadowHostElement()) | 108 if (m_parentStack.back().element != parent.parentOrShadowHostElement()) |
| 109 return; | 109 return; |
| 110 pushParentStackFrame(parent); | 110 pushParentStackFrame(parent); |
| 111 } | 111 } |
| 112 | 112 |
| 113 void SelectorFilter::popParent(Element& parent) { | 113 void SelectorFilter::popParent(Element& parent) { |
| 114 ASSERT(parent.document().inStyleRecalc()); | 114 DCHECK(parent.document().inStyleRecalc()); |
| 115 ASSERT(parent.inActiveDocument()); | 115 DCHECK(parent.inActiveDocument()); |
| 116 // Note that we may get invoked for some random elements in some wacky cases | 116 // Note that we may get invoked for some random elements in some wacky cases |
| 117 // during style resolve. Pause maintaining the stack in this case. | 117 // during style resolve. Pause maintaining the stack in this case. |
| 118 if (!parentStackIsConsistent(&parent)) | 118 if (!parentStackIsConsistent(&parent)) |
| 119 return; | 119 return; |
| 120 popParentStackFrame(); | 120 popParentStackFrame(); |
| 121 } | 121 } |
| 122 | 122 |
| 123 static inline void collectDescendantSelectorIdentifierHashes( | 123 static inline void collectDescendantSelectorIdentifierHashes( |
| 124 const CSSSelector& selector, | 124 const CSSSelector& selector, |
| 125 unsigned*& hash) { | 125 unsigned*& hash) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 | 197 |
| 198 DEFINE_TRACE(SelectorFilter::ParentStackFrame) { | 198 DEFINE_TRACE(SelectorFilter::ParentStackFrame) { |
| 199 visitor->trace(element); | 199 visitor->trace(element); |
| 200 } | 200 } |
| 201 | 201 |
| 202 DEFINE_TRACE(SelectorFilter) { | 202 DEFINE_TRACE(SelectorFilter) { |
| 203 visitor->trace(m_parentStack); | 203 visitor->trace(m_parentStack); |
| 204 } | 204 } |
| 205 | 205 |
| 206 } // namespace blink | 206 } // namespace blink |
| OLD | NEW |