void SelectorFilter::pushParent(Element& parent) { ASSERT(parent.document().inStyleRecalc()); ASSERT(parent.inActiveDocument()); if (m_parentStack.isEmpty()) { ASSERT(parent == parent.document().documentElement()); ASSERT(!m_ancestorIdentifierFilter); m_ancestorIdentifierFilter = wrapUnique(new IdentifierFilter); pushParentStackFrame(parent); return; } ASSERT(m_ancestorIdentifierFilter); // We may get invoked for some random elements in some wacky cases during // style resolve. Pause maintaining the stack in this case. if (m_parentStack.last().element != parent.parentOrShadowHostElement()) return; pushParentStackFrame(parent); }
void SelectorFilter::setupParentStack(Element* parent) { ASSERT(m_parentStack.isEmpty() == !m_ancestorIdentifierFilter); // Kill whatever we stored before. m_parentStack.shrink(0); m_ancestorIdentifierFilter = adoptPtr(new BloomFilter<bloomFilterKeyBits>); // Fast version if parent is a root element: if (!parent->parentOrShadowHostNode()) { pushParentStackFrame(parent); return; } // Otherwise climb up the tree. Vector<Element*, 30> ancestors; for (Element* ancestor = parent; ancestor; ancestor = ancestor->parentOrShadowHostElement()) ancestors.append(ancestor); for (size_t n = ancestors.size(); n; --n) pushParentStackFrame(ancestors[n - 1]); }
void SelectorFilter::pushParent(Element* parent) { ASSERT(m_ancestorIdentifierFilter); // We may get invoked for some random elements in some wacky cases during style resolve. // Pause maintaining the stack in this case. if (m_parentStack.last().element != parent->parentOrShadowHostElement()) return; pushParentStackFrame(parent); }