Title: [195311] trunk/Source/WebCore
Revision
195311
Author
[email protected]
Date
2016-01-19 13:26:35 -0800 (Tue, 19 Jan 2016)

Log Message

Use references in SelectorChecker
https://bugs.webkit.org/show_bug.cgi?id=153240

Reviewed by Andreas Kling.

Element and selector can't be null in most places.

* css/ElementRuleCollector.cpp:
(WebCore::ElementRuleCollector::collectMatchingRules):
* css/SelectorChecker.cpp:
(WebCore::attributeValueMatches):
(WebCore::anyAttributeMatches):
(WebCore::SelectorChecker::checkOne):
(WebCore::SelectorChecker::matchSelectorList):
(WebCore::SelectorChecker::checkScrollbarPseudoClass):
(WebCore::SelectorChecker::determineLinkMatchType):
(WebCore::isFrameFocused):
(WebCore::SelectorChecker::matchesFocusPseudoClass):
* css/SelectorChecker.h:
(WebCore::SelectorChecker::isCommonPseudoClassSelector):
(WebCore::SelectorChecker::checkExactAttribute): Deleted.
* css/SelectorCheckerTestFunctions.h:
(WebCore::isAutofilled):
(WebCore::isDefaultButtonForForm):
(WebCore::isDisabled):
(WebCore::isEnabled):
(WebCore::isMediaDocument):
(WebCore::isChecked):
(WebCore::isInRange):
(WebCore::isOutOfRange):
(WebCore::isInvalid):
(WebCore::isOptionalFormControl):
(WebCore::isRequiredFormControl):
(WebCore::isValid):
(WebCore::isWindowInactive):
(WebCore::containslanguageSubtagMatchingRange):
(WebCore::matchesLangPseudoClass):
(WebCore::matchesReadOnlyPseudoClass):
(WebCore::matchesReadWritePseudoClass):
(WebCore::shouldAppearIndeterminate):
(WebCore::scrollbarMatchesEnabledPseudoClass):
(WebCore::scrollbarMatchesCornerPresentPseudoClass):
(WebCore::matchesFullScreenPseudoClass):
(WebCore::matchesFullScreenAnimatingFullScreenTransitionPseudoClass):
(WebCore::matchesFullScreenAncestorPseudoClass):
(WebCore::matchesFullScreenDocumentPseudoClass):
(WebCore::matchesFutureCuePseudoClass):
(WebCore::matchesPastCuePseudoClass):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (195310 => 195311)


--- trunk/Source/WebCore/ChangeLog	2016-01-19 21:00:35 UTC (rev 195310)
+++ trunk/Source/WebCore/ChangeLog	2016-01-19 21:26:35 UTC (rev 195311)
@@ -1,3 +1,54 @@
+2016-01-19  Antti Koivisto  <[email protected]>
+
+        Use references in SelectorChecker
+        https://bugs.webkit.org/show_bug.cgi?id=153240
+
+        Reviewed by Andreas Kling.
+
+        Element and selector can't be null in most places.
+
+        * css/ElementRuleCollector.cpp:
+        (WebCore::ElementRuleCollector::collectMatchingRules):
+        * css/SelectorChecker.cpp:
+        (WebCore::attributeValueMatches):
+        (WebCore::anyAttributeMatches):
+        (WebCore::SelectorChecker::checkOne):
+        (WebCore::SelectorChecker::matchSelectorList):
+        (WebCore::SelectorChecker::checkScrollbarPseudoClass):
+        (WebCore::SelectorChecker::determineLinkMatchType):
+        (WebCore::isFrameFocused):
+        (WebCore::SelectorChecker::matchesFocusPseudoClass):
+        * css/SelectorChecker.h:
+        (WebCore::SelectorChecker::isCommonPseudoClassSelector):
+        (WebCore::SelectorChecker::checkExactAttribute): Deleted.
+        * css/SelectorCheckerTestFunctions.h:
+        (WebCore::isAutofilled):
+        (WebCore::isDefaultButtonForForm):
+        (WebCore::isDisabled):
+        (WebCore::isEnabled):
+        (WebCore::isMediaDocument):
+        (WebCore::isChecked):
+        (WebCore::isInRange):
+        (WebCore::isOutOfRange):
+        (WebCore::isInvalid):
+        (WebCore::isOptionalFormControl):
+        (WebCore::isRequiredFormControl):
+        (WebCore::isValid):
+        (WebCore::isWindowInactive):
+        (WebCore::containslanguageSubtagMatchingRange):
+        (WebCore::matchesLangPseudoClass):
+        (WebCore::matchesReadOnlyPseudoClass):
+        (WebCore::matchesReadWritePseudoClass):
+        (WebCore::shouldAppearIndeterminate):
+        (WebCore::scrollbarMatchesEnabledPseudoClass):
+        (WebCore::scrollbarMatchesCornerPresentPseudoClass):
+        (WebCore::matchesFullScreenPseudoClass):
+        (WebCore::matchesFullScreenAnimatingFullScreenTransitionPseudoClass):
+        (WebCore::matchesFullScreenAncestorPseudoClass):
+        (WebCore::matchesFullScreenDocumentPseudoClass):
+        (WebCore::matchesFutureCuePseudoClass):
+        (WebCore::matchesPastCuePseudoClass):
+
 2016-01-19  Chris Dumez  <[email protected]>
 
         Unreviewed, rolling out r195179.

Modified: trunk/Source/WebCore/css/ElementRuleCollector.cpp (195310 => 195311)


--- trunk/Source/WebCore/css/ElementRuleCollector.cpp	2016-01-19 21:00:35 UTC (rev 195310)
+++ trunk/Source/WebCore/css/ElementRuleCollector.cpp	2016-01-19 21:26:35 UTC (rev 195311)
@@ -149,7 +149,7 @@
 
     if (m_element.isLink())
         collectMatchingRulesForList(matchRequest.ruleSet->linkPseudoClassRules(), matchRequest, ruleRange);
-    if (SelectorChecker::matchesFocusPseudoClass(&m_element))
+    if (SelectorChecker::matchesFocusPseudoClass(m_element))
         collectMatchingRulesForList(matchRequest.ruleSet->focusPseudoClassRules(), matchRequest, ruleRange);
     collectMatchingRulesForList(matchRequest.ruleSet->tagRules(m_element.localName().impl(), m_element.isHTMLElement() && m_element.document().isHTMLDocument()), matchRequest, ruleRange);
     collectMatchingRulesForList(matchRequest.ruleSet->universalRules(), matchRequest, ruleRange);

Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (195310 => 195311)


--- trunk/Source/WebCore/css/SelectorChecker.cpp	2016-01-19 21:00:35 UTC (rev 195310)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp	2016-01-19 21:26:35 UTC (rev 195311)
@@ -504,14 +504,14 @@
     return true;
 }
 
-static bool anyAttributeMatches(const Element* element, const CSSSelector* selector, const QualifiedName& selectorAttr, bool caseSensitive)
+static bool anyAttributeMatches(const Element& element, const CSSSelector& selector, const QualifiedName& selectorAttr, bool caseSensitive)
 {
-    ASSERT(element->hasAttributesWithoutUpdate());
-    for (const Attribute& attribute : element->attributesIterator()) {
-        if (!attribute.matches(selectorAttr.prefix(), element->isHTMLElement() ? selector->attributeCanonicalLocalName() : selectorAttr.localName(), selectorAttr.namespaceURI()))
+    ASSERT(element.hasAttributesWithoutUpdate());
+    for (const Attribute& attribute : element.attributesIterator()) {
+        if (!attribute.matches(selectorAttr.prefix(), element.isHTMLElement() ? selector.attributeCanonicalLocalName() : selectorAttr.localName(), selectorAttr.namespaceURI()))
             continue;
 
-        if (attributeValueMatches(attribute, selector->match(), selector->value(), caseSensitive))
+        if (attributeValueMatches(attribute, selector.match(), selector.value(), caseSensitive))
             return true;
     }
 
@@ -590,40 +590,38 @@
 
 bool SelectorChecker::checkOne(CheckingContext& checkingContext, const LocalContext& context, PseudoIdSet& dynamicPseudoIdSet, MatchType& matchType, unsigned& specificity) const
 {
-    const Element* element = context.element;
-    const CSSSelector* const & selector = context.selector;
-    ASSERT(element);
-    ASSERT(selector);
+    const Element& element = *context.element;
+    const CSSSelector& selector = *context.selector;
 
-    specificity = CSSSelector::addSpecificities(specificity, selector->simpleSelectorSpecificity());
+    specificity = CSSSelector::addSpecificities(specificity, selector.simpleSelectorSpecificity());
 
-    if (selector->match() == CSSSelector::Tag)
-        return tagMatches(*element, *selector);
+    if (selector.match() == CSSSelector::Tag)
+        return tagMatches(element, selector);
 
-    if (selector->match() == CSSSelector::Class)
-        return element->hasClass() && element->classNames().contains(selector->value());
+    if (selector.match() == CSSSelector::Class)
+        return element.hasClass() && element.classNames().contains(selector.value());
 
-    if (selector->match() == CSSSelector::Id)
-        return element->hasID() && element->idForStyleResolution() == selector->value();
+    if (selector.match() == CSSSelector::Id)
+        return element.hasID() && element.idForStyleResolution() == selector.value();
 
-    if (selector->isAttributeSelector()) {
-        if (!element->hasAttributes())
+    if (selector.isAttributeSelector()) {
+        if (!element.hasAttributes())
             return false;
 
-        const QualifiedName& attr = selector->attribute();
+        const QualifiedName& attr = selector.attribute();
         bool caseSensitive = true;
-        if (selector->attributeValueMatchingIsCaseInsensitive())
+        if (selector.attributeValueMatchingIsCaseInsensitive())
             caseSensitive = false;
-        else if (m_documentIsHTML && element->isHTMLElement() && !HTMLDocument::isCaseSensitiveAttribute(attr))
+        else if (m_documentIsHTML && element.isHTMLElement() && !HTMLDocument::isCaseSensitiveAttribute(attr))
             caseSensitive = false;
 
         return anyAttributeMatches(element, selector, attr, caseSensitive);
     }
 
-    if (selector->match() == CSSSelector::PseudoClass) {
+    if (selector.match() == CSSSelector::PseudoClass) {
         // Handle :not up front.
-        if (selector->pseudoClassType() == CSSSelector::PseudoClassNot) {
-            const CSSSelectorList* selectorList = selector->selectorList();
+        if (selector.pseudoClassType() == CSSSelector::PseudoClassNot) {
+            const CSSSelectorList* selectorList = selector.selectorList();
 
             for (const CSSSelector* subselector = selectorList->first(); subselector; subselector = CSSSelectorList::next(subselector)) {
                 LocalContext subcontext(context);
@@ -640,21 +638,22 @@
                 }
             }
             return true;
-        } else if (context.hasScrollbarPseudo) {
+        }
+        if (context.hasScrollbarPseudo) {
             // CSS scrollbars match a specific subset of pseudo classes, and they have specialized rules for each
             // (since there are no elements involved except with window-inactive).
-            return checkScrollbarPseudoClass(checkingContext, *context.element, selector);
+            return checkScrollbarPseudoClass(checkingContext, element, selector);
         }
 
         // Normal element pseudo class checking.
-        switch (selector->pseudoClassType()) {
+        switch (selector.pseudoClassType()) {
             // Pseudo classes:
         case CSSSelector::PseudoClassNot:
             break; // Already handled up above.
         case CSSSelector::PseudoClassEmpty:
             {
                 bool result = true;
-                for (Node* node = element->firstChild(); node; node = node->nextSibling()) {
+                for (Node* node = element.firstChild(); node; node = node->nextSibling()) {
                     if (is<Element>(*node)) {
                         result = false;
                         break;
@@ -673,61 +672,61 @@
             }
         case CSSSelector::PseudoClassFirstChild:
             // first-child matches the first child that is an element
-            if (const Element* parentElement = element->parentElement()) {
-                bool isFirstChild = isFirstChildElement(*element);
+            if (const Element* parentElement = element.parentElement()) {
+                bool isFirstChild = isFirstChildElement(element);
                 if (isFirstChild)
-                    addStyleRelation(checkingContext, *element, StyleRelation::FirstChild);
+                    addStyleRelation(checkingContext, element, StyleRelation::FirstChild);
                 addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByFirstChildRules);
                 return isFirstChild;
             }
             break;
         case CSSSelector::PseudoClassFirstOfType:
             // first-of-type matches the first element of its type
-            if (element->parentElement()) {
-                addStyleRelation(checkingContext, *element, StyleRelation::AffectedByPreviousSibling);
-                return isFirstOfType(checkingContext, *element, element->tagQName());
+            if (element.parentElement()) {
+                addStyleRelation(checkingContext, element, StyleRelation::AffectedByPreviousSibling);
+                return isFirstOfType(checkingContext, element, element.tagQName());
             }
             break;
         case CSSSelector::PseudoClassLastChild:
             // last-child matches the last child that is an element
-            if (const Element* parentElement = element->parentElement()) {
-                bool isLastChild = parentElement->isFinishedParsingChildren() && isLastChildElement(*element);
+            if (const Element* parentElement = element.parentElement()) {
+                bool isLastChild = parentElement->isFinishedParsingChildren() && isLastChildElement(element);
                 if (isLastChild)
-                    addStyleRelation(checkingContext, *element, StyleRelation::LastChild);
+                    addStyleRelation(checkingContext, element, StyleRelation::LastChild);
                 addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByLastChildRules);
                 return isLastChild;
             }
             break;
         case CSSSelector::PseudoClassLastOfType:
             // last-of-type matches the last element of its type
-            if (Element* parentElement = element->parentElement()) {
+            if (Element* parentElement = element.parentElement()) {
                 addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByBackwardPositionalRules);
                 if (!parentElement->isFinishedParsingChildren())
                     return false;
-                return isLastOfType(*element, element->tagQName());
+                return isLastOfType(element, element.tagQName());
             }
             break;
         case CSSSelector::PseudoClassOnlyChild:
-            if (Element* parentElement = element->parentElement()) {
-                bool firstChild = isFirstChildElement(*element);
-                bool _onlyChild_ = firstChild && parentElement->isFinishedParsingChildren() && isLastChildElement(*element);
+            if (Element* parentElement = element.parentElement()) {
+                bool firstChild = isFirstChildElement(element);
+                bool _onlyChild_ = firstChild && parentElement->isFinishedParsingChildren() && isLastChildElement(element);
                 addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByFirstChildRules);
                 addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByLastChildRules);
                 if (firstChild)
-                    addStyleRelation(checkingContext, *element, StyleRelation::FirstChild);
+                    addStyleRelation(checkingContext, element, StyleRelation::FirstChild);
                 if (onlyChild)
-                    addStyleRelation(checkingContext, *element, StyleRelation::LastChild);
+                    addStyleRelation(checkingContext, element, StyleRelation::LastChild);
                 return onlyChild;
             }
             break;
         case CSSSelector::PseudoClassOnlyOfType:
             // FIXME: This selector is very slow.
-            if (Element* parentElement = element->parentElement()) {
-                addStyleRelation(checkingContext, *element, StyleRelation::AffectedByPreviousSibling);
+            if (Element* parentElement = element.parentElement()) {
+                addStyleRelation(checkingContext, element, StyleRelation::AffectedByPreviousSibling);
                 addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByBackwardPositionalRules);
                 if (!parentElement->isFinishedParsingChildren())
                     return false;
-                return isFirstOfType(checkingContext, *element, element->tagQName()) && isLastOfType(*element, element->tagQName());
+                return isFirstOfType(checkingContext, element, element.tagQName()) && isLastOfType(element, element.tagQName());
             }
             break;
         case CSSSelector::PseudoClassMatches:
@@ -736,7 +735,7 @@
                 unsigned maxSpecificity = 0;
 
                 MatchType localMatchType = MatchType::VirtualPseudoElementOnly;
-                for (const CSSSelector* subselector = selector->selectorList()->first(); subselector; subselector = CSSSelectorList::next(subselector)) {
+                for (const CSSSelector* subselector = selector.selectorList()->first(); subselector; subselector = CSSSelectorList::next(subselector)) {
                     LocalContext subcontext(context);
                     subcontext.inFunctionalPseudoClass = true;
                     subcontext.pseudoElementEffective = context.pseudoElementEffective;
@@ -762,28 +761,27 @@
                 return hasMatchedAnything;
             }
         case CSSSelector::PseudoClassPlaceholderShown:
-            if (is<HTMLTextFormControlElement>(*element)) {
-                addStyleRelation(checkingContext, *element, StyleRelation::Unique);
-                return downcast<HTMLTextFormControlElement>(*element).isPlaceholderVisible();
+            if (is<HTMLTextFormControlElement>(element)) {
+                addStyleRelation(checkingContext, element, StyleRelation::Unique);
+                return downcast<HTMLTextFormControlElement>(element).isPlaceholderVisible();
             }
             return false;
         case CSSSelector::PseudoClassNthChild:
-            if (!selector->parseNth())
+            if (!selector.parseNth())
                 break;
-            if (element->parentElement()) {
-                if (const CSSSelectorList* selectorList = selector->selectorList()) {
+            if (element.parentElement()) {
+                if (const CSSSelectorList* selectorList = selector.selectorList()) {
                     unsigned selectorListSpecificity;
-                    if (matchSelectorList(checkingContext, context, *element, *selectorList, selectorListSpecificity))
-                        specificity = CSSSelector::addSpecificities(specificity, selectorListSpecificity);
-                    else
+                    if (!matchSelectorList(checkingContext, context, element, *selectorList, selectorListSpecificity))
                         return false;
+                    specificity = CSSSelector::addSpecificities(specificity, selectorListSpecificity);
                 }
 
-                addStyleRelation(checkingContext, *element, StyleRelation::AffectedByPreviousSibling);
+                addStyleRelation(checkingContext, element, StyleRelation::AffectedByPreviousSibling);
 
                 int count = 1;
-                if (const CSSSelectorList* selectorList = selector->selectorList()) {
-                    for (Element* sibling = ElementTraversal::previousSibling(*element); sibling; sibling = ElementTraversal::previousSibling(*sibling)) {
+                if (const CSSSelectorList* selectorList = selector.selectorList()) {
+                    for (Element* sibling = ElementTraversal::previousSibling(element); sibling; sibling = ElementTraversal::previousSibling(*sibling)) {
                         addStyleRelation(checkingContext, *sibling, StyleRelation::AffectsNextSibling);
 
                         unsigned ignoredSpecificity;
@@ -791,36 +789,35 @@
                             ++count;
                     }
                 } else {
-                    count += countElementsBefore(checkingContext, *element);
-                    addStyleRelation(checkingContext, *element, StyleRelation::NthChildIndex, count);
+                    count += countElementsBefore(checkingContext, element);
+                    addStyleRelation(checkingContext, element, StyleRelation::NthChildIndex, count);
                 }
 
-                if (selector->matchNth(count))
+                if (selector.matchNth(count))
                     return true;
             }
             break;
         case CSSSelector::PseudoClassNthOfType:
-            if (!selector->parseNth())
+            if (!selector.parseNth())
                 break;
 
-            if (element->parentElement()) {
-                addStyleRelation(checkingContext, *element, StyleRelation::AffectedByPreviousSibling);
+            if (element.parentElement()) {
+                addStyleRelation(checkingContext, element, StyleRelation::AffectedByPreviousSibling);
 
-                int count = 1 + countElementsOfTypeBefore(checkingContext, *element, element->tagQName());
-                if (selector->matchNth(count))
+                int count = 1 + countElementsOfTypeBefore(checkingContext, element, element.tagQName());
+                if (selector.matchNth(count))
                     return true;
             }
             break;
         case CSSSelector::PseudoClassNthLastChild:
-            if (!selector->parseNth())
+            if (!selector.parseNth())
                 break;
-            if (Element* parentElement = element->parentElement()) {
-                if (const CSSSelectorList* selectorList = selector->selectorList()) {
+            if (Element* parentElement = element.parentElement()) {
+                if (const CSSSelectorList* selectorList = selector.selectorList()) {
                     unsigned selectorListSpecificity;
-                    if (matchSelectorList(checkingContext, context, *element, *selectorList, selectorListSpecificity))
-                        specificity = CSSSelector::addSpecificities(specificity, selectorListSpecificity);
-                    else
+                    if (!matchSelectorList(checkingContext, context, element, *selectorList, selectorListSpecificity))
                         return false;
+                    specificity = CSSSelector::addSpecificities(specificity, selectorListSpecificity);
 
                     addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByPropertyBasedBackwardPositionalRules);
                 } else
@@ -830,35 +827,35 @@
                     return false;
 
                 int count = 1;
-                if (const CSSSelectorList* selectorList = selector->selectorList()) {
-                    for (Element* sibling = ElementTraversal::nextSibling(*element); sibling; sibling = ElementTraversal::nextSibling(*sibling)) {
+                if (const CSSSelectorList* selectorList = selector.selectorList()) {
+                    for (Element* sibling = ElementTraversal::nextSibling(element); sibling; sibling = ElementTraversal::nextSibling(*sibling)) {
                         unsigned ignoredSpecificity;
                         if (matchSelectorList(checkingContext, context, *sibling, *selectorList, ignoredSpecificity))
                             ++count;
                     }
                 } else
-                    count += countElementsAfter(*element);
+                    count += countElementsAfter(element);
 
-                if (selector->matchNth(count))
+                if (selector.matchNth(count))
                     return true;
             }
             break;
         case CSSSelector::PseudoClassNthLastOfType:
-            if (!selector->parseNth())
+            if (!selector.parseNth())
                 break;
-            if (Element* parentElement = element->parentElement()) {
+            if (Element* parentElement = element.parentElement()) {
                 addStyleRelation(checkingContext, *parentElement, StyleRelation::ChildrenAffectedByBackwardPositionalRules);
 
                 if (!parentElement->isFinishedParsingChildren())
                     return false;
 
-                int count = 1 + countElementsOfTypeAfter(*element, element->tagQName());
-                if (selector->matchNth(count))
+                int count = 1 + countElementsOfTypeAfter(element, element.tagQName());
+                if (selector.matchNth(count))
                     return true;
             }
             break;
         case CSSSelector::PseudoClassTarget:
-            if (element == element->document().cssTarget())
+            if (&element == element.document().cssTarget())
                 return true;
             break;
         case CSSSelector::PseudoClassAny:
@@ -866,7 +863,7 @@
                 LocalContext subcontext(context);
                 subcontext.inFunctionalPseudoClass = true;
                 subcontext.pseudoElementEffective = false;
-                for (subcontext.selector = selector->selectorList()->first(); subcontext.selector; subcontext.selector = CSSSelectorList::next(subcontext.selector)) {
+                for (subcontext.selector = selector.selectorList()->first(); subcontext.selector; subcontext.selector = CSSSelectorList::next(subcontext.selector)) {
                     subcontext.firstSelectorOfTheFragment = subcontext.selector;
                     PseudoIdSet ignoreDynamicPseudo;
                     unsigned ingoredSpecificity = 0;
@@ -876,39 +873,39 @@
             }
             break;
         case CSSSelector::PseudoClassAutofill:
-            return isAutofilled(*element);
+            return isAutofilled(element);
         case CSSSelector::PseudoClassAnyLink:
         case CSSSelector::PseudoClassAnyLinkDeprecated:
         case CSSSelector::PseudoClassLink:
             // :visited and :link matches are separated later when applying the style. Here both classes match all links...
-            return element->isLink();
+            return element.isLink();
         case CSSSelector::PseudoClassVisited:
             // ...except if :visited matching is disabled for ancestor/sibling matching.
             // Inside functional pseudo class except for :not, :visited never matches.
             if (context.inFunctionalPseudoClass)
                 return false;
-            return element->isLink() && context.visitedMatchType == VisitedMatchType::Enabled;
+            return element.isLink() && context.visitedMatchType == VisitedMatchType::Enabled;
         case CSSSelector::PseudoClassDrag:
-            addStyleRelation(checkingContext, *element, StyleRelation::AffectedByDrag);
+            addStyleRelation(checkingContext, element, StyleRelation::AffectedByDrag);
 
-            if (element->renderer() && element->renderer()->isDragging())
+            if (element.renderer() && element.renderer()->isDragging())
                 return true;
             break;
         case CSSSelector::PseudoClassFocus:
             return matchesFocusPseudoClass(element);
         case CSSSelector::PseudoClassHover:
-            if (m_strictParsing || element->isLink() || canMatchHoverOrActiveInQuirksMode(context)) {
-                addStyleRelation(checkingContext, *element, StyleRelation::AffectedByHover);
+            if (m_strictParsing || element.isLink() || canMatchHoverOrActiveInQuirksMode(context)) {
+                addStyleRelation(checkingContext, element, StyleRelation::AffectedByHover);
 
-                if (element->hovered() || InspectorInstrumentation::forcePseudoState(const_cast<Element&>(*element), CSSSelector::PseudoClassHover))
+                if (element.hovered() || InspectorInstrumentation::forcePseudoState(const_cast<Element&>(element), CSSSelector::PseudoClassHover))
                     return true;
             }
             break;
         case CSSSelector::PseudoClassActive:
-            if (m_strictParsing || element->isLink() || canMatchHoverOrActiveInQuirksMode(context)) {
-                addStyleRelation(checkingContext, *element, StyleRelation::AffectedByActive);
+            if (m_strictParsing || element.isLink() || canMatchHoverOrActiveInQuirksMode(context)) {
+                addStyleRelation(checkingContext, element, StyleRelation::AffectedByActive);
 
-                if (element->active() || InspectorInstrumentation::forcePseudoState(const_cast<Element&>(*element), CSSSelector::PseudoClassActive))
+                if (element.active() || InspectorInstrumentation::forcePseudoState(const_cast<Element&>(element), CSSSelector::PseudoClassActive))
                     return true;
             }
             break;
@@ -933,17 +930,17 @@
         case CSSSelector::PseudoClassInvalid:
             return isInvalid(element);
         case CSSSelector::PseudoClassChecked:
-            return isChecked(*element);
+            return isChecked(element);
         case CSSSelector::PseudoClassIndeterminate:
             return shouldAppearIndeterminate(element);
         case CSSSelector::PseudoClassRoot:
-            if (element == element->document().documentElement())
+            if (&element == element.document().documentElement())
                 return true;
             break;
         case CSSSelector::PseudoClassLang:
             {
-                ASSERT(selector->langArgumentList() && !selector->langArgumentList()->isEmpty());
-                return matchesLangPseudoClass(element, *selector->langArgumentList());
+                ASSERT(selector.langArgumentList() && !selector.langArgumentList()->isEmpty());
+                return matchesLangPseudoClass(element, *selector.langArgumentList());
             }
 #if ENABLE(FULLSCREEN_API)
         case CSSSelector::PseudoClassFullScreen:
@@ -968,8 +965,8 @@
 
         case CSSSelector::PseudoClassScope:
             {
-                const Node* contextualReferenceNode = !checkingContext.scope ? element->document().documentElement() : checkingContext.scope;
-                if (element == contextualReferenceNode)
+                const Node* contextualReferenceNode = !checkingContext.scope ? element.document().documentElement() : checkingContext.scope;
+                if (&element == contextualReferenceNode)
                     return true;
                 break;
             }
@@ -1010,7 +1007,7 @@
         return false;
     }
 #if ENABLE(VIDEO_TRACK)
-    if (selector->match() == CSSSelector::PseudoElement && selector->pseudoElementType() == CSSSelector::PseudoElementCue) {
+    if (selector.match() == CSSSelector::PseudoElement && selector.pseudoElementType() == CSSSelector::PseudoElementCue) {
         LocalContext subcontext(context);
 
         const CSSSelector* const & selector = context.selector;
@@ -1054,13 +1051,13 @@
     return hasMatchedAnything;
 }
 
-bool SelectorChecker::checkScrollbarPseudoClass(const CheckingContext& checkingContext, const Element& element, const CSSSelector* selector) const
+bool SelectorChecker::checkScrollbarPseudoClass(const CheckingContext& checkingContext, const Element& element, const CSSSelector& selector) const
 {
-    ASSERT(selector->match() == CSSSelector::PseudoClass);
+    ASSERT(selector.match() == CSSSelector::PseudoClass);
 
-    switch (selector->pseudoClassType()) {
+    switch (selector.pseudoClassType()) {
     case CSSSelector::PseudoClassWindowInactive:
-        return isWindowInactive(&element);
+        return isWindowInactive(element);
     case CSSSelector::PseudoClassEnabled:
         return scrollbarMatchesEnabledPseudoClass(checkingContext);
     case CSSSelector::PseudoClassDisabled:
@@ -1124,16 +1121,16 @@
     return linkMatchType;
 }
 
-static bool isFrameFocused(const Element* element)
+static bool isFrameFocused(const Element& element)
 {
-    return element->document().frame() && element->document().frame()->selection().isFocusedAndActive();
+    return element.document().frame() && element.document().frame()->selection().isFocusedAndActive();
 }
 
-bool SelectorChecker::matchesFocusPseudoClass(const Element* element)
+bool SelectorChecker::matchesFocusPseudoClass(const Element& element)
 {
-    if (InspectorInstrumentation::forcePseudoState(const_cast<Element&>(*element), CSSSelector::PseudoClassFocus))
+    if (InspectorInstrumentation::forcePseudoState(const_cast<Element&>(element), CSSSelector::PseudoClassFocus))
         return true;
-    return element->focused() && isFrameFocused(element);
+    return element.focused() && isFrameFocused(element);
 }
 
 }

Modified: trunk/Source/WebCore/css/SelectorChecker.h (195310 => 195311)


--- trunk/Source/WebCore/css/SelectorChecker.h	2016-01-19 21:00:35 UTC (rev 195310)
+++ trunk/Source/WebCore/css/SelectorChecker.h	2016-01-19 21:26:35 UTC (rev 195311)
@@ -118,8 +118,7 @@
     bool match(const CSSSelector&, const Element&, CheckingContext&, unsigned& specificity) const;
 
     static bool isCommonPseudoClassSelector(const CSSSelector*);
-    static bool matchesFocusPseudoClass(const Element*);
-    static bool checkExactAttribute(const Element*, const CSSSelector*, const QualifiedName& selectorAttributeName, const AtomicStringImpl* value);
+    static bool matchesFocusPseudoClass(const Element&);
 
     enum LinkMatchMask { MatchDefault = 0, MatchLink = 1, MatchVisited = 2, MatchAll = MatchLink | MatchVisited };
     static unsigned determineLinkMatchType(const CSSSelector*);
@@ -131,7 +130,7 @@
     bool checkOne(CheckingContext&, const LocalContext&, PseudoIdSet&, MatchType&, unsigned& specificity) const;
     bool matchSelectorList(CheckingContext&, const LocalContext&, const Element&, const CSSSelectorList&, unsigned& specificity) const;
 
-    bool checkScrollbarPseudoClass(const CheckingContext&, const Element&, const CSSSelector*) const;
+    bool checkScrollbarPseudoClass(const CheckingContext&, const Element&, const CSSSelector&) const;
 
     bool m_strictParsing;
     bool m_documentIsHTML;
@@ -149,18 +148,6 @@
         || pseudoType == CSSSelector::PseudoClassFocus;
 }
 
-inline bool SelectorChecker::checkExactAttribute(const Element* element, const CSSSelector* selector, const QualifiedName& selectorAttributeName, const AtomicStringImpl* value)
-{
-    if (!element->hasAttributesWithoutUpdate())
-        return false;
-    const AtomicString& localName = element->isHTMLElement() ? selector->attributeCanonicalLocalName() : selectorAttributeName.localName();
-    for (const Attribute& attribute : element->attributesIterator()) {
-        if (attribute.matches(selectorAttributeName.prefix(), localName, selectorAttributeName.namespaceURI()) && (!value || attribute.value().impl() == value))
-            return true;
-    }
-    return false;
 }
 
-}
-
 #endif

Modified: trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h (195310 => 195311)


--- trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h	2016-01-19 21:00:35 UTC (rev 195310)
+++ trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h	2016-01-19 21:26:35 UTC (rev 195311)
@@ -46,26 +46,26 @@
     return is<HTMLInputElement>(element) && downcast<HTMLInputElement>(element).isAutoFilled();
 }
 
-ALWAYS_INLINE bool isDefaultButtonForForm(const Element* element)
+ALWAYS_INLINE bool isDefaultButtonForForm(const Element& element)
 {
-    return element->isDefaultButtonForForm();
+    return element.isDefaultButtonForForm();
 }
 
-ALWAYS_INLINE bool isDisabled(const Element* element)
+ALWAYS_INLINE bool isDisabled(const Element& element)
 {
-    return (is<HTMLFormControlElement>(*element) || is<HTMLOptionElement>(*element) || is<HTMLOptGroupElement>(*element))
-        && element->isDisabledFormControl();
+    return (is<HTMLFormControlElement>(element) || is<HTMLOptionElement>(element) || is<HTMLOptGroupElement>(element))
+        && element.isDisabledFormControl();
 }
 
-ALWAYS_INLINE bool isEnabled(const Element* element)
+ALWAYS_INLINE bool isEnabled(const Element& element)
 {
-    return (is<HTMLFormControlElement>(*element) || is<HTMLOptionElement>(*element) || is<HTMLOptGroupElement>(*element))
-        && !element->isDisabledFormControl();
+    return (is<HTMLFormControlElement>(element) || is<HTMLOptionElement>(element) || is<HTMLOptGroupElement>(element))
+        && !element.isDisabledFormControl();
 }
 
-ALWAYS_INLINE bool isMediaDocument(const Element* element)
+ALWAYS_INLINE bool isMediaDocument(const Element& element)
 {
-    return element->document().isMediaDocument();
+    return element.document().isMediaDocument();
 }
 
 ALWAYS_INLINE bool isChecked(const Element& element)
@@ -83,39 +83,39 @@
     return false;
 }
 
-ALWAYS_INLINE bool isInRange(const Element* element)
+ALWAYS_INLINE bool isInRange(const Element& element)
 {
-    return element->isInRange();
+    return element.isInRange();
 }
 
-ALWAYS_INLINE bool isOutOfRange(const Element* element)
+ALWAYS_INLINE bool isOutOfRange(const Element& element)
 {
-    return element->isOutOfRange();
+    return element.isOutOfRange();
 }
 
-ALWAYS_INLINE bool isInvalid(const Element* element)
+ALWAYS_INLINE bool isInvalid(const Element& element)
 {
-    return element->matchesInvalidPseudoClass();
+    return element.matchesInvalidPseudoClass();
 }
 
-ALWAYS_INLINE bool isOptionalFormControl(const Element* element)
+ALWAYS_INLINE bool isOptionalFormControl(const Element& element)
 {
-    return element->isOptionalFormControl();
+    return element.isOptionalFormControl();
 }
 
-ALWAYS_INLINE bool isRequiredFormControl(const Element* element)
+ALWAYS_INLINE bool isRequiredFormControl(const Element& element)
 {
-    return element->isRequiredFormControl();
+    return element.isRequiredFormControl();
 }
 
-ALWAYS_INLINE bool isValid(const Element* element)
+ALWAYS_INLINE bool isValid(const Element& element)
 {
-    return element->matchesValidPseudoClass();
+    return element.matchesValidPseudoClass();
 }
 
-ALWAYS_INLINE bool isWindowInactive(const Element* element)
+ALWAYS_INLINE bool isWindowInactive(const Element& element)
 {
-    auto* page = element->document().page();
+    auto* page = element.document().page();
     if (!page)
         return false;
     return !page->focusController().isActive();
@@ -151,17 +151,15 @@
     return false;
 }
 
-ALWAYS_INLINE bool matchesLangPseudoClass(const Element* element, const Vector<AtomicString>& argumentList)
+ALWAYS_INLINE bool matchesLangPseudoClass(const Element& element, const Vector<AtomicString>& argumentList)
 {
-    ASSERT(element);
-
     AtomicString language;
 #if ENABLE(VIDEO_TRACK)
-    if (is<WebVTTElement>(*element))
-        language = downcast<WebVTTElement>(*element).language();
+    if (is<WebVTTElement>(element))
+        language = downcast<WebVTTElement>(element).language();
     else
 #endif
-        language = element->computeInheritedLanguage();
+        language = element.computeInheritedLanguage();
 
     if (language.isEmpty())
         return false;
@@ -206,19 +204,19 @@
     return false;
 }
 
-ALWAYS_INLINE bool matchesReadOnlyPseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesReadOnlyPseudoClass(const Element& element)
 {
-    return !element->matchesReadWritePseudoClass();
+    return !element.matchesReadWritePseudoClass();
 }
 
-ALWAYS_INLINE bool matchesReadWritePseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesReadWritePseudoClass(const Element& element)
 {
-    return element->matchesReadWritePseudoClass();
+    return element.matchesReadWritePseudoClass();
 }
 
-ALWAYS_INLINE bool shouldAppearIndeterminate(const Element* element)
+ALWAYS_INLINE bool shouldAppearIndeterminate(const Element& element)
 {
-    return element->shouldAppearIndeterminate();
+    return element.shouldAppearIndeterminate();
 }
 
 ALWAYS_INLINE bool scrollbarMatchesEnabledPseudoClass(const SelectorChecker::CheckingContext& context)
@@ -325,50 +323,50 @@
 }
 
 #if ENABLE(FULLSCREEN_API)
-ALWAYS_INLINE bool matchesFullScreenPseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesFullScreenPseudoClass(const Element& element)
 {
     // While a Document is in the fullscreen state, and the document's current fullscreen
     // element is an element in the document, the 'full-screen' pseudoclass applies to
     // that element. Also, an <iframe>, <object> or <embed> element whose child browsing
     // context's Document is in the fullscreen state has the 'full-screen' pseudoclass applied.
-    if (element->isFrameElementBase() && element->containsFullScreenElement())
+    if (element.isFrameElementBase() && element.containsFullScreenElement())
         return true;
-    if (!element->document().webkitIsFullScreen())
+    if (!element.document().webkitIsFullScreen())
         return false;
-    return element == element->document().webkitCurrentFullScreenElement();
+    return &element == element.document().webkitCurrentFullScreenElement();
 }
 
-ALWAYS_INLINE bool matchesFullScreenAnimatingFullScreenTransitionPseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesFullScreenAnimatingFullScreenTransitionPseudoClass(const Element& element)
 {
-    if (element != element->document().webkitCurrentFullScreenElement())
+    if (&element != element.document().webkitCurrentFullScreenElement())
         return false;
-    return element->document().isAnimatingFullScreen();
+    return element.document().isAnimatingFullScreen();
 }
 
-ALWAYS_INLINE bool matchesFullScreenAncestorPseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesFullScreenAncestorPseudoClass(const Element& element)
 {
-    return element->containsFullScreenElement();
+    return element.containsFullScreenElement();
 }
 
-ALWAYS_INLINE bool matchesFullScreenDocumentPseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesFullScreenDocumentPseudoClass(const Element& element)
 {
     // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
     // to all elements of that Document.
-    if (!element->document().webkitIsFullScreen())
+    if (!element.document().webkitIsFullScreen())
         return false;
     return true;
 }
 #endif
 
 #if ENABLE(VIDEO_TRACK)
-ALWAYS_INLINE bool matchesFutureCuePseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesFutureCuePseudoClass(const Element& element)
 {
-    return is<WebVTTElement>(*element) && !downcast<WebVTTElement>(*element).isPastNode();
+    return is<WebVTTElement>(element) && !downcast<WebVTTElement>(element).isPastNode();
 }
 
-ALWAYS_INLINE bool matchesPastCuePseudoClass(const Element* element)
+ALWAYS_INLINE bool matchesPastCuePseudoClass(const Element& element)
 {
-    return is<WebVTTElement>(*element) && downcast<WebVTTElement>(*element).isPastNode();
+    return is<WebVTTElement>(element) && downcast<WebVTTElement>(element).isPastNode();
 }
 #endif
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to