| 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
reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights |
| 6 * reserved. |
| 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 10 * (http://www.torchmobile.com/) |
| 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 11 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
| 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 12 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
| 11 * Copyright (C) 2012 Google Inc. All rights reserved. | 13 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 12 * | 14 * |
| 13 * This library is free software; you can redistribute it and/or | 15 * This library is free software; you can redistribute it and/or |
| 14 * modify it under the terms of the GNU Library General Public | 16 * modify it under the terms of the GNU Library General Public |
| 15 * License as published by the Free Software Foundation; either | 17 * License as published by the Free Software Foundation; either |
| 16 * version 2 of the License, or (at your option) any later version. | 18 * version 2 of the License, or (at your option) any later version. |
| 17 * | 19 * |
| 18 * This library is distributed in the hope that it will be useful, | 20 * This library is distributed in the hope that it will be useful, |
| 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 21 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 21 * Library General Public License for more details. | 23 * Library General Public License for more details. |
| 22 * | 24 * |
| 23 * You should have received a copy of the GNU Library General Public License | 25 * You should have received a copy of the GNU Library General Public License |
| 24 * along with this library; see the file COPYING.LIB. If not, write to | 26 * along with this library; see the file COPYING.LIB. If not, write to |
| 25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 27 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 26 * Boston, MA 02110-1301, USA. | 28 * Boston, MA 02110-1301, USA. |
| 27 */ | 29 */ |
| 28 | 30 |
| 29 #include "core/css/SelectorFilter.h" | 31 #include "core/css/SelectorFilter.h" |
| 30 | 32 |
| 31 #include "core/css/CSSSelector.h" | 33 #include "core/css/CSSSelector.h" |
| 32 #include "core/dom/Document.h" | 34 #include "core/dom/Document.h" |
| 33 #include "wtf/PtrUtil.h" | 35 #include "wtf/PtrUtil.h" |
| 34 | 36 |
| 35 namespace blink { | 37 namespace blink { |
| 36 | 38 |
| 37 // Salt to separate otherwise identical string hashes so a class-selector like .
article won't match <article> elements. | 39 // Salt to separate otherwise identical string hashes so a class-selector like |
| 40 // .article won't match <article> elements. |
| 38 enum { TagNameSalt = 13, IdAttributeSalt = 17, ClassAttributeSalt = 19 }; | 41 enum { TagNameSalt = 13, IdAttributeSalt = 17, ClassAttributeSalt = 19 }; |
| 39 | 42 |
| 40 static inline void collectElementIdentifierHashes( | 43 static inline void collectElementIdentifierHashes( |
| 41 const Element& element, | 44 const Element& element, |
| 42 Vector<unsigned, 4>& identifierHashes) { | 45 Vector<unsigned, 4>& identifierHashes) { |
| 43 identifierHashes.append( | 46 identifierHashes.append( |
| 44 element.localNameForSelectorMatching().impl()->existingHash() * | 47 element.localNameForSelectorMatching().impl()->existingHash() * |
| 45 TagNameSalt); | 48 TagNameSalt); |
| 46 if (element.hasID()) | 49 if (element.hasID()) |
| 47 identifierHashes.append( | 50 identifierHashes.append( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 ASSERT(parent.document().inStyleRecalc()); | 96 ASSERT(parent.document().inStyleRecalc()); |
| 94 ASSERT(parent.inActiveDocument()); | 97 ASSERT(parent.inActiveDocument()); |
| 95 if (m_parentStack.isEmpty()) { | 98 if (m_parentStack.isEmpty()) { |
| 96 ASSERT(parent == parent.document().documentElement()); | 99 ASSERT(parent == parent.document().documentElement()); |
| 97 ASSERT(!m_ancestorIdentifierFilter); | 100 ASSERT(!m_ancestorIdentifierFilter); |
| 98 m_ancestorIdentifierFilter = wrapUnique(new IdentifierFilter); | 101 m_ancestorIdentifierFilter = wrapUnique(new IdentifierFilter); |
| 99 pushParentStackFrame(parent); | 102 pushParentStackFrame(parent); |
| 100 return; | 103 return; |
| 101 } | 104 } |
| 102 ASSERT(m_ancestorIdentifierFilter); | 105 ASSERT(m_ancestorIdentifierFilter); |
| 103 // We may get invoked for some random elements in some wacky cases during styl
e resolve. | 106 // We may get invoked for some random elements in some wacky cases during |
| 104 // Pause maintaining the stack in this case. | 107 // style resolve. Pause maintaining the stack in this case. |
| 105 if (m_parentStack.last().element != parent.parentOrShadowHostElement()) | 108 if (m_parentStack.last().element != parent.parentOrShadowHostElement()) |
| 106 return; | 109 return; |
| 107 pushParentStackFrame(parent); | 110 pushParentStackFrame(parent); |
| 108 } | 111 } |
| 109 | 112 |
| 110 void SelectorFilter::popParent(Element& parent) { | 113 void SelectorFilter::popParent(Element& parent) { |
| 111 ASSERT(parent.document().inStyleRecalc()); | 114 ASSERT(parent.document().inStyleRecalc()); |
| 112 ASSERT(parent.inActiveDocument()); | 115 ASSERT(parent.inActiveDocument()); |
| 113 // Note that we may get invoked for some random elements in some wacky cases d
uring style resolve. | 116 // Note that we may get invoked for some random elements in some wacky cases |
| 114 // Pause maintaining the stack in this case. | 117 // during style resolve. Pause maintaining the stack in this case. |
| 115 if (!parentStackIsConsistent(&parent)) | 118 if (!parentStackIsConsistent(&parent)) |
| 116 return; | 119 return; |
| 117 popParentStackFrame(); | 120 popParentStackFrame(); |
| 118 } | 121 } |
| 119 | 122 |
| 120 static inline void collectDescendantSelectorIdentifierHashes( | 123 static inline void collectDescendantSelectorIdentifierHashes( |
| 121 const CSSSelector& selector, | 124 const CSSSelector& selector, |
| 122 unsigned*& hash) { | 125 unsigned*& hash) { |
| 123 switch (selector.match()) { | 126 switch (selector.match()) { |
| 124 case CSSSelector::Id: | 127 case CSSSelector::Id: |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 196 |
| 194 DEFINE_TRACE(SelectorFilter::ParentStackFrame) { | 197 DEFINE_TRACE(SelectorFilter::ParentStackFrame) { |
| 195 visitor->trace(element); | 198 visitor->trace(element); |
| 196 } | 199 } |
| 197 | 200 |
| 198 DEFINE_TRACE(SelectorFilter) { | 201 DEFINE_TRACE(SelectorFilter) { |
| 199 visitor->trace(m_parentStack); | 202 visitor->trace(m_parentStack); |
| 200 } | 203 } |
| 201 | 204 |
| 202 } // namespace blink | 205 } // namespace blink |
| OLD | NEW |