Changeset 128329 in webkit
- Timestamp:
- Sep 12, 2012 9:50:33 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r128325 r128329 1 2012-09-12 Dimitri Glazkov <dglazkov@chromium.org> 2 3 Remove transient state regarding uknown pseudoelements from SelectorChecker. 4 https://bugs.webkit.org/show_bug.cgi?id=96425 5 6 Reviewed by Eric Seidel. 7 8 The fact that an unknown pseudoelement was found when checking selector was stored as extra state on SelectorChecker. That's bad, 9 because this state is at odds with the lifecycle of the instance and had to be explicitly reset prior to each checking. To address 10 this, I made checkSelector report the value as its result (by-ref parameter, actually). 11 12 No new tests, refactoring only. Covered by existing tests. 13 14 * css/SelectorChecker.cpp: 15 (WebCore::SelectorChecker::SelectorChecker): Removed the now-unneded state initialization. 16 (WebCore::SelectorChecker::checkSelector): Changed to take extra parameter. 17 (WebCore): 18 (WebCore::SelectorChecker::checkOneSelector): Ditto. 19 * css/SelectorChecker.h: 20 (SelectorChecker): Changed decls accordingly. 21 * css/StyleResolver.cpp: 22 (WebCore::StyleResolver::StyleResolver): Added state to StyleResolver. 23 (WebCore::StyleResolver::collectMatchingRulesForList): Changed to use own state, rather than StyleChecker's state. 24 * css/StyleResolver.h: 25 (StyleResolver): Moved state here from StyleChecker. 26 1 27 2012-09-12 Andrei Onea <onea@adobe.com> 2 28 -
trunk/Source/WebCore/css/SelectorChecker.cpp
r124180 r128329 72 72 , m_mode(ResolvingStyle) 73 73 , m_pseudoStyle(NOPSEUDO) 74 , m_hasUnknownPseudoElements(false)75 74 { 76 75 } … … 269 268 270 269 PseudoId dynamicPseudo = NOPSEUDO; 271 return checkSelector(SelectorCheckingContext(sel, element, SelectorChecker::VisitedMatchDisabled), dynamicPseudo) == SelectorMatches; 270 bool hasUnknownPseudoElements = false; 271 return checkSelector(SelectorCheckingContext(sel, element, SelectorChecker::VisitedMatchDisabled), dynamicPseudo, hasUnknownPseudoElements) == SelectorMatches; 272 272 } 273 273 … … 440 440 // * SelectorFailsAllSiblings - the selector fails for e and any sibling of e 441 441 // * SelectorFailsCompletely - the selector fails for e and any sibling or ancestor of e 442 SelectorChecker::SelectorMatch SelectorChecker::checkSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo ) const442 SelectorChecker::SelectorMatch SelectorChecker::checkSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo, bool& hasUnknownPseudoElements) const 443 443 { 444 444 // first selector has to match 445 if (!checkOneSelector(context, dynamicPseudo ))445 if (!checkOneSelector(context, dynamicPseudo, hasUnknownPseudoElements)) 446 446 return SelectorFailsLocally; 447 447 … … 478 478 nextContext.elementParentStyle = 0; 479 479 for (; nextContext.element; nextContext.element = nextContext.element->parentElement()) { 480 SelectorMatch match = checkSelector(nextContext, dynamicPseudo );480 SelectorMatch match = checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements); 481 481 if (match == SelectorMatches || match == SelectorFailsCompletely) 482 482 return match; … … 493 493 nextContext.elementStyle = 0; 494 494 nextContext.elementParentStyle = 0; 495 return checkSelector(nextContext, dynamicPseudo );495 return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements); 496 496 497 497 case CSSSelector::DirectAdjacent: … … 507 507 nextContext.elementStyle = 0; 508 508 nextContext.elementParentStyle = 0; 509 return checkSelector(nextContext, dynamicPseudo );509 return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements); 510 510 511 511 case CSSSelector::IndirectAdjacent: … … 520 520 nextContext.elementParentStyle = 0; 521 521 for (; nextContext.element; nextContext.element = nextContext.element->previousElementSibling()) { 522 SelectorMatch match = checkSelector(nextContext, dynamicPseudo );522 SelectorMatch match = checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements); 523 523 if (match == SelectorMatches || match == SelectorFailsAllSiblings || match == SelectorFailsCompletely) 524 524 return match; … … 534 534 return SelectorFailsCompletely; 535 535 nextContext.isSubSelector = true; 536 return checkSelector(nextContext, dynamicPseudo );536 return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements); 537 537 538 538 case CSSSelector::ShadowDescendant: … … 548 548 nextContext.elementStyle = 0; 549 549 nextContext.elementParentStyle = 0; 550 return checkSelector(nextContext, dynamicPseudo );550 return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements); 551 551 } 552 552 } … … 702 702 } 703 703 704 bool SelectorChecker::checkOneSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo ) const704 bool SelectorChecker::checkOneSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo, bool& hasUnknownPseudoElements) const 705 705 { 706 706 Element* const & element = context.element; … … 749 749 if (subContext.selector->pseudoType() == CSSSelector::PseudoVisited || (subContext.selector->pseudoType() == CSSSelector::PseudoLink && subContext.visitedMatchType == VisitedMatchEnabled)) 750 750 return true; 751 if (!checkOneSelector(subContext, dynamicPseudo ))751 if (!checkOneSelector(subContext, dynamicPseudo, hasUnknownPseudoElements)) 752 752 return true; 753 753 } … … 999 999 subContext.isSubSelector = true; 1000 1000 for (subContext.selector = selector->selectorList()->first(); subContext.selector; subContext.selector = CSSSelectorList::next(subContext.selector)) { 1001 if (checkSelector(subContext, dynamicPseudo ) == SelectorMatches)1001 if (checkSelector(subContext, dynamicPseudo, hasUnknownPseudoElements) == SelectorMatches) 1002 1002 return true; 1003 1003 } … … 1179 1179 if (selector->m_match == CSSSelector::PseudoElement) { 1180 1180 if (selector->isUnknownPseudoElement()) { 1181 m_hasUnknownPseudoElements = true;1181 hasUnknownPseudoElements = true; 1182 1182 return element->shadowPseudoId() == selector->value(); 1183 1183 } -
trunk/Source/WebCore/css/SelectorChecker.h
r123636 r128329 77 77 78 78 bool checkSelector(CSSSelector*, Element*, bool isFastCheckableSelector = false) const; 79 SelectorMatch checkSelector(const SelectorCheckingContext&, PseudoId& ) const;79 SelectorMatch checkSelector(const SelectorCheckingContext&, PseudoId&, bool& hasUnknownPseudoElements) const; 80 80 static bool isFastCheckableSelector(const CSSSelector*); 81 81 bool fastCheckSelector(const CSSSelector*, const Element*) const; … … 103 103 PseudoId pseudoStyle() const { return m_pseudoStyle; } 104 104 void setPseudoStyle(PseudoId pseudoId) { m_pseudoStyle = pseudoId; } 105 106 bool hasUnknownPseudoElements() const { return m_hasUnknownPseudoElements; }107 void clearHasUnknownPseudoElements() { m_hasUnknownPseudoElements = false; }108 105 109 106 static bool tagMatches(const Element*, const CSSSelector*); … … 122 119 123 120 private: 124 bool checkOneSelector(const SelectorCheckingContext&, PseudoId& ) const;121 bool checkOneSelector(const SelectorCheckingContext&, PseudoId&, bool& hasUnknownPseudoElements) const; 125 122 bool checkScrollbarPseudoClass(CSSSelector*, PseudoId& dynamicPseudo) const; 126 123 static bool isFrameFocused(const Element*); … … 139 136 Mode m_mode; 140 137 PseudoId m_pseudoStyle; 141 mutable bool m_hasUnknownPseudoElements;142 138 mutable HashSet<LinkHash, LinkHashHash> m_linksCheckedForVisitedState; 143 139 -
trunk/Source/WebCore/css/StyleResolver.cpp
r128301 r128329 381 381 , m_sameOriginOnly(false) 382 382 , m_distributedToInsertionPoint(false) 383 , m_hasUnknownPseudoElements(false) 383 384 , m_fontSelector(CSSFontSelector::create(document)) 384 385 , m_applyPropertyToRegularStyle(true) … … 1103 1104 && (!options.scope || options.scope->treeScope() != treeScope) 1104 1105 #endif 1105 && !m_ checker.hasUnknownPseudoElements()) {1106 && !m_hasUnknownPseudoElements) { 1106 1107 1107 1108 InspectorInstrumentation::didMatchRule(cookie, false); … … 2401 2402 { 2402 2403 m_dynamicPseudo = NOPSEUDO; 2403 m_ checker.clearHasUnknownPseudoElements();2404 m_hasUnknownPseudoElements = false; 2404 2405 2405 2406 if (ruleData.hasFastCheckableSelector()) { … … 2424 2425 context.elementParentStyle = m_parentNode ? m_parentNode->renderStyle() : 0; 2425 2426 context.scope = scope; 2426 SelectorChecker::SelectorMatch match = m_checker.checkSelector(context, m_dynamicPseudo );2427 SelectorChecker::SelectorMatch match = m_checker.checkSelector(context, m_dynamicPseudo, m_hasUnknownPseudoElements); 2427 2428 if (match != SelectorChecker::SelectorMatches) 2428 2429 return false; … … 2437 2438 return false; 2438 2439 2439 m_ checker.clearHasUnknownPseudoElements();2440 m_hasUnknownPseudoElements = false; 2440 2441 m_checker.setPseudoStyle(NOPSEUDO); 2441 2442 -
trunk/Source/WebCore/css/StyleResolver.h
r128228 r128329 498 498 bool m_sameOriginOnly; 499 499 bool m_distributedToInsertionPoint; 500 bool m_hasUnknownPseudoElements; 500 501 501 502 RefPtr<CSSFontSelector> m_fontSelector;
Note: See TracChangeset
for help on using the changeset viewer.