Title: [128329] trunk/Source/WebCore
Revision
128329
Author
dglaz...@chromium.org
Date
2012-09-12 09:50:33 -0700 (Wed, 12 Sep 2012)

Log Message

Remove transient state regarding uknown pseudoelements from SelectorChecker.
https://bugs.webkit.org/show_bug.cgi?id=96425

Reviewed by Eric Seidel.

The fact that an unknown pseudoelement was found when checking selector was stored as extra state on SelectorChecker. That's bad,
because this state is at odds with the lifecycle of the instance and had to be explicitly reset prior to each checking. To address
this, I made checkSelector report the value as its result (by-ref parameter, actually).

No new tests, refactoring only. Covered by existing tests.

* css/SelectorChecker.cpp:
(WebCore::SelectorChecker::SelectorChecker): Removed the now-unneded state initialization.
(WebCore::SelectorChecker::checkSelector): Changed to take extra parameter.
(WebCore):
(WebCore::SelectorChecker::checkOneSelector): Ditto.
* css/SelectorChecker.h:
(SelectorChecker): Changed decls accordingly.
* css/StyleResolver.cpp:
(WebCore::StyleResolver::StyleResolver): Added state to StyleResolver.
(WebCore::StyleResolver::collectMatchingRulesForList): Changed to use own state, rather than StyleChecker's state.
* css/StyleResolver.h:
(StyleResolver): Moved state here from StyleChecker.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (128328 => 128329)


--- trunk/Source/WebCore/ChangeLog	2012-09-12 16:43:17 UTC (rev 128328)
+++ trunk/Source/WebCore/ChangeLog	2012-09-12 16:50:33 UTC (rev 128329)
@@ -1,3 +1,29 @@
+2012-09-12  Dimitri Glazkov  <dglaz...@chromium.org>
+
+        Remove transient state regarding uknown pseudoelements from SelectorChecker.
+        https://bugs.webkit.org/show_bug.cgi?id=96425
+
+        Reviewed by Eric Seidel.
+
+        The fact that an unknown pseudoelement was found when checking selector was stored as extra state on SelectorChecker. That's bad,
+        because this state is at odds with the lifecycle of the instance and had to be explicitly reset prior to each checking. To address
+        this, I made checkSelector report the value as its result (by-ref parameter, actually).
+
+        No new tests, refactoring only. Covered by existing tests.
+
+        * css/SelectorChecker.cpp:
+        (WebCore::SelectorChecker::SelectorChecker): Removed the now-unneded state initialization.
+        (WebCore::SelectorChecker::checkSelector): Changed to take extra parameter.
+        (WebCore):
+        (WebCore::SelectorChecker::checkOneSelector): Ditto.
+        * css/SelectorChecker.h:
+        (SelectorChecker): Changed decls accordingly.
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::StyleResolver): Added state to StyleResolver.
+        (WebCore::StyleResolver::collectMatchingRulesForList): Changed to use own state, rather than StyleChecker's state.
+        * css/StyleResolver.h:
+        (StyleResolver): Moved state here from StyleChecker.
+
 2012-09-12  Andrei Onea  <o...@adobe.com>
 
         [CSSRegions]Use RefPtr's instead of weak references on DOMNamedFlowCollection

Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (128328 => 128329)


--- trunk/Source/WebCore/css/SelectorChecker.cpp	2012-09-12 16:43:17 UTC (rev 128328)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp	2012-09-12 16:50:33 UTC (rev 128329)
@@ -71,7 +71,6 @@
     , m_documentIsHTML(document->isHTMLDocument())
     , m_mode(ResolvingStyle)
     , m_pseudoStyle(NOPSEUDO)
-    , m_hasUnknownPseudoElements(false)
 {
 }
 
@@ -268,7 +267,8 @@
     }
 
     PseudoId dynamicPseudo = NOPSEUDO;
-    return checkSelector(SelectorCheckingContext(sel, element, SelectorChecker::VisitedMatchDisabled), dynamicPseudo) == SelectorMatches;
+    bool hasUnknownPseudoElements = false;
+    return checkSelector(SelectorCheckingContext(sel, element, SelectorChecker::VisitedMatchDisabled), dynamicPseudo, hasUnknownPseudoElements) == SelectorMatches;
 }
 
 namespace {
@@ -439,10 +439,10 @@
 // * SelectorFailsLocally     - the selector fails for the element e
 // * SelectorFailsAllSiblings - the selector fails for e and any sibling of e
 // * SelectorFailsCompletely  - the selector fails for e and any sibling or ancestor of e
-SelectorChecker::SelectorMatch SelectorChecker::checkSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo) const
+SelectorChecker::SelectorMatch SelectorChecker::checkSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo, bool& hasUnknownPseudoElements) const
 {
     // first selector has to match
-    if (!checkOneSelector(context, dynamicPseudo))
+    if (!checkOneSelector(context, dynamicPseudo, hasUnknownPseudoElements))
         return SelectorFailsLocally;
 
     // The rest of the selectors has to match
@@ -477,7 +477,7 @@
         nextContext.elementStyle = 0;
         nextContext.elementParentStyle = 0;
         for (; nextContext.element; nextContext.element = nextContext.element->parentElement()) {
-            SelectorMatch match = checkSelector(nextContext, dynamicPseudo);
+            SelectorMatch match = checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements);
             if (match == SelectorMatches || match == SelectorFailsCompletely)
                 return match;
             if (nextContext.element == nextContext.scope)
@@ -492,7 +492,7 @@
         nextContext.isSubSelector = false;
         nextContext.elementStyle = 0;
         nextContext.elementParentStyle = 0;
-        return checkSelector(nextContext, dynamicPseudo);
+        return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements);
 
     case CSSSelector::DirectAdjacent:
         if (m_mode == ResolvingStyle && context.element->parentElement()) {
@@ -506,7 +506,7 @@
         nextContext.isSubSelector = false;
         nextContext.elementStyle = 0;
         nextContext.elementParentStyle = 0;
-        return checkSelector(nextContext, dynamicPseudo);
+        return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements);
 
     case CSSSelector::IndirectAdjacent:
         if (m_mode == ResolvingStyle && context.element->parentElement()) {
@@ -519,7 +519,7 @@
         nextContext.elementStyle = 0;
         nextContext.elementParentStyle = 0;
         for (; nextContext.element; nextContext.element = nextContext.element->previousElementSibling()) {
-            SelectorMatch match = checkSelector(nextContext, dynamicPseudo);
+            SelectorMatch match = checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements);
             if (match == SelectorMatches || match == SelectorFailsAllSiblings || match == SelectorFailsCompletely)
                 return match;
         };
@@ -533,7 +533,7 @@
              && !((RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER) && nextContext.selector->m_match == CSSSelector::PseudoClass))
             return SelectorFailsCompletely;
         nextContext.isSubSelector = true;
-        return checkSelector(nextContext, dynamicPseudo);
+        return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements);
 
     case CSSSelector::ShadowDescendant:
         {
@@ -547,7 +547,7 @@
             nextContext.isSubSelector = false;
             nextContext.elementStyle = 0;
             nextContext.elementParentStyle = 0;
-            return checkSelector(nextContext, dynamicPseudo);
+            return checkSelector(nextContext, dynamicPseudo, hasUnknownPseudoElements);
         }
     }
 
@@ -701,7 +701,7 @@
     return false;
 }
 
-bool SelectorChecker::checkOneSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo) const
+bool SelectorChecker::checkOneSelector(const SelectorCheckingContext& context, PseudoId& dynamicPseudo, bool& hasUnknownPseudoElements) const
 {
     Element* const & element = context.element;
     CSSSelector* const & selector = context.selector;
@@ -748,7 +748,7 @@
                 // We select between :visited and :link when applying. We don't know which one applied (or not) yet.
                 if (subContext.selector->pseudoType() == CSSSelector::PseudoVisited || (subContext.selector->pseudoType() == CSSSelector::PseudoLink && subContext.visitedMatchType == VisitedMatchEnabled))
                     return true;
-                if (!checkOneSelector(subContext, dynamicPseudo))
+                if (!checkOneSelector(subContext, dynamicPseudo, hasUnknownPseudoElements))
                     return true;
             }
         } else if (dynamicPseudo != NOPSEUDO && (RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER)) {
@@ -998,7 +998,7 @@
                 SelectorCheckingContext subContext(context);
                 subContext.isSubSelector = true;
                 for (subContext.selector = selector->selectorList()->first(); subContext.selector; subContext.selector = CSSSelectorList::next(subContext.selector)) {
-                    if (checkSelector(subContext, dynamicPseudo) == SelectorMatches)
+                    if (checkSelector(subContext, dynamicPseudo, hasUnknownPseudoElements) == SelectorMatches)
                         return true;
                 }
             }
@@ -1178,7 +1178,7 @@
     }
     if (selector->m_match == CSSSelector::PseudoElement) {
         if (selector->isUnknownPseudoElement()) {
-            m_hasUnknownPseudoElements = true;
+            hasUnknownPseudoElements = true;
             return element->shadowPseudoId() == selector->value();
         }
 

Modified: trunk/Source/WebCore/css/SelectorChecker.h (128328 => 128329)


--- trunk/Source/WebCore/css/SelectorChecker.h	2012-09-12 16:43:17 UTC (rev 128328)
+++ trunk/Source/WebCore/css/SelectorChecker.h	2012-09-12 16:50:33 UTC (rev 128329)
@@ -76,7 +76,7 @@
     };
 
     bool checkSelector(CSSSelector*, Element*, bool isFastCheckableSelector = false) const;
-    SelectorMatch checkSelector(const SelectorCheckingContext&, PseudoId&) const;
+    SelectorMatch checkSelector(const SelectorCheckingContext&, PseudoId&, bool& hasUnknownPseudoElements) const;
     static bool isFastCheckableSelector(const CSSSelector*);
     bool fastCheckSelector(const CSSSelector*, const Element*) const;
 
@@ -103,9 +103,6 @@
     PseudoId pseudoStyle() const { return m_pseudoStyle; }
     void setPseudoStyle(PseudoId pseudoId) { m_pseudoStyle = pseudoId; }
 
-    bool hasUnknownPseudoElements() const { return m_hasUnknownPseudoElements; }
-    void clearHasUnknownPseudoElements() { m_hasUnknownPseudoElements = false; }
-
     static bool tagMatches(const Element*, const CSSSelector*);
     static bool attributeNameMatches(const Attribute*, const QualifiedName&);
     static bool isCommonPseudoClassSelector(const CSSSelector*);
@@ -121,7 +118,7 @@
     static bool elementMatchesSelectorScopes(const StyledElement*, const HashSet<AtomicStringImpl*>& idScopes, const HashSet<AtomicStringImpl*>& classScopes);
 
 private:
-    bool checkOneSelector(const SelectorCheckingContext&, PseudoId&) const;
+    bool checkOneSelector(const SelectorCheckingContext&, PseudoId&, bool& hasUnknownPseudoElements) const;
     bool checkScrollbarPseudoClass(CSSSelector*, PseudoId& dynamicPseudo) const;
     static bool isFrameFocused(const Element*);
 
@@ -138,7 +135,6 @@
     bool m_documentIsHTML;
     Mode m_mode;
     PseudoId m_pseudoStyle;
-    mutable bool m_hasUnknownPseudoElements;
     mutable HashSet<LinkHash, LinkHashHash> m_linksCheckedForVisitedState;
 
     struct ParentStackFrame {

Modified: trunk/Source/WebCore/css/StyleResolver.cpp (128328 => 128329)


--- trunk/Source/WebCore/css/StyleResolver.cpp	2012-09-12 16:43:17 UTC (rev 128328)
+++ trunk/Source/WebCore/css/StyleResolver.cpp	2012-09-12 16:50:33 UTC (rev 128329)
@@ -380,6 +380,7 @@
     , m_matchAuthorAndUserStyles(matchAuthorAndUserStyles)
     , m_sameOriginOnly(false)
     , m_distributedToInsertionPoint(false)
+    , m_hasUnknownPseudoElements(false)
     , m_fontSelector(CSSFontSelector::create(document))
     , m_applyPropertyToRegularStyle(true)
     , m_applyPropertyToVisitedLinkStyle(false)
@@ -1102,7 +1103,7 @@
 #if ENABLE(STYLE_SCOPED)
                 && (!options.scope || options.scope->treeScope() != treeScope)
 #endif
-                && !m_checker.hasUnknownPseudoElements()) {
+                && !m_hasUnknownPseudoElements) {
 
                 InspectorInstrumentation::didMatchRule(cookie, false);
                 continue;
@@ -2400,7 +2401,7 @@
 inline bool StyleResolver::checkSelector(const RuleData& ruleData, const ContainerNode* scope)
 {
     m_dynamicPseudo = NOPSEUDO;
-    m_checker.clearHasUnknownPseudoElements();
+    m_hasUnknownPseudoElements = false;
 
     if (ruleData.hasFastCheckableSelector()) {
         // We know this selector does not include any pseudo elements.
@@ -2423,7 +2424,7 @@
     context.elementStyle = style();
     context.elementParentStyle = m_parentNode ? m_parentNode->renderStyle() : 0;
     context.scope = scope;
-    SelectorChecker::SelectorMatch match = m_checker.checkSelector(context, m_dynamicPseudo);
+    SelectorChecker::SelectorMatch match = m_checker.checkSelector(context, m_dynamicPseudo, m_hasUnknownPseudoElements);
     if (match != SelectorChecker::SelectorMatches)
         return false;
     if (m_checker.pseudoStyle() != NOPSEUDO && m_checker.pseudoStyle() != m_dynamicPseudo)
@@ -2436,7 +2437,7 @@
     if (!regionSelector || !regionElement)
         return false;
 
-    m_checker.clearHasUnknownPseudoElements();
+    m_hasUnknownPseudoElements = false;
     m_checker.setPseudoStyle(NOPSEUDO);
 
     for (CSSSelector* s = regionSelector; s; s = CSSSelectorList::next(s))

Modified: trunk/Source/WebCore/css/StyleResolver.h (128328 => 128329)


--- trunk/Source/WebCore/css/StyleResolver.h	2012-09-12 16:43:17 UTC (rev 128328)
+++ trunk/Source/WebCore/css/StyleResolver.h	2012-09-12 16:50:33 UTC (rev 128329)
@@ -497,6 +497,7 @@
     bool m_matchAuthorAndUserStyles;
     bool m_sameOriginOnly;
     bool m_distributedToInsertionPoint;
+    bool m_hasUnknownPseudoElements;
 
     RefPtr<CSSFontSelector> m_fontSelector;
     Vector<OwnPtr<MediaQueryResult> > m_viewportDependentMediaQueryResults;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to