[CSS Shadow Parts] Correct interaction with other pseudo elements
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Oct 2019 05:22:42 +0000 (05:22 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Oct 2019 05:22:42 +0000 (05:22 +0000)
https://bugs.webkit.org/show_bug.cgi?id=202526

Reviewed by Ryosuke Niwa.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-shadow-parts/interaction-with-pseudo-elements-expected.txt:

Source/WebCore:

Cases like foo::part(bar)::before should work.

This patch doesn't cover ::placeholder which is implemented as PseudoElementWebKitCustom (like internal -webkit-* properties).

* css/CSSSelector.h:
(WebCore::isTreeStructuralPseudoClass):

Add a helper.

* css/parser/CSSSelectorParser.cpp:

Allow non-structural pseudo classes after ::part().
Allow other pseudo elements after ::part().

(WebCore::CSSSelectorParser::consumePseudo):

No need for DisallowPseudoElementsScope, we are just parsing identifiers.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250701 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-pseudo-elements-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/css/CSSSelector.h
Source/WebCore/css/parser/CSSSelectorParser.cpp

index cae7c79..3dd487a 100644 (file)
@@ -1,3 +1,12 @@
+2019-10-03  Antti Koivisto  <antti@apple.com>
+
+        [CSS Shadow Parts] Correct interaction with other pseudo elements
+        https://bugs.webkit.org/show_bug.cgi?id=202526
+
+        Reviewed by Ryosuke Niwa.
+
+        * web-platform-tests/css/css-shadow-parts/interaction-with-pseudo-elements-expected.txt:
+
 2019-10-03  Ryosuke Niwa  <rniwa@webkit.org>
 
         Resync WPT shadow DOM tests
index c379999..b62008b 100644 (file)
@@ -1,8 +1,8 @@
 
-FAIL ::before in selected host is styled assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL ::after in selected host is styled assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS ::before in selected host is styled 
+PASS ::after in selected host is styled 
 FAIL ::placeholder in selected host is styled assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
-FAIL ::selection in selected host is styled assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL ::first-line in selected host is styled assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL ::first-letter in selected host is styled assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS ::selection in selected host is styled 
+PASS ::first-line in selected host is styled 
+PASS ::first-letter in selected host is styled 
 
index 93a9aed..5753bf3 100644 (file)
@@ -1,3 +1,28 @@
+2019-10-03  Antti Koivisto  <antti@apple.com>
+
+        [CSS Shadow Parts] Correct interaction with other pseudo elements
+        https://bugs.webkit.org/show_bug.cgi?id=202526
+
+        Reviewed by Ryosuke Niwa.
+
+        Cases like foo::part(bar)::before should work.
+
+        This patch doesn't cover ::placeholder which is implemented as PseudoElementWebKitCustom (like internal -webkit-* properties).
+
+        * css/CSSSelector.h:
+        (WebCore::isTreeStructuralPseudoClass):
+
+        Add a helper.
+
+        * css/parser/CSSSelectorParser.cpp:
+
+        Allow non-structural pseudo classes after ::part().
+        Allow other pseudo elements after ::part().
+
+        (WebCore::CSSSelectorParser::consumePseudo):
+
+        No need for DisallowPseudoElementsScope, we are just parsing identifiers.
+
 2019-10-03  James Darpinian  <jdarpinian@chromium.org>
 
         Fix WebGL 1 conformance regressions when USE_ANGLE=1
index 40fdc6f..87343c4 100644 (file)
@@ -439,6 +439,11 @@ static inline bool pseudoClassIsRelativeToSiblings(CSSSelector::PseudoClassType
         || type == CSSSelector::PseudoClassNthLastOfType;
 }
 
+static inline bool isTreeStructuralPseudoClass(CSSSelector::PseudoClassType type)
+{
+    return pseudoClassIsRelativeToSiblings(type) || type == CSSSelector::PseudoClassRoot;
+}
+
 inline bool CSSSelector::isSiblingSelector() const
 {
     return relation() == DirectAdjacent
index 7bdce1c..3172d25 100644 (file)
@@ -209,6 +209,7 @@ bool isUserActionPseudoClass(CSSSelector::PseudoClassType pseudo)
     case CSSSelector::PseudoClassHover:
     case CSSSelector::PseudoClassFocus:
     case CSSSelector::PseudoClassActive:
+    case CSSSelector::PseudoClassFocusWithin:
         return true;
     default:
         return false;
@@ -218,6 +219,8 @@ bool isUserActionPseudoClass(CSSSelector::PseudoClassType pseudo)
 bool isPseudoClassValidAfterPseudoElement(CSSSelector::PseudoClassType pseudoClass, CSSSelector::PseudoElementType compoundPseudoElement)
 {
     switch (compoundPseudoElement) {
+    case CSSSelector::PseudoElementPart:
+        return !isTreeStructuralPseudoClass(pseudoClass);
     case CSSSelector::PseudoElementResizer:
     case CSSSelector::PseudoElementScrollbar:
     case CSSSelector::PseudoElementScrollbarCorner:
@@ -240,9 +243,10 @@ bool isSimpleSelectorValidAfterPseudoElement(const CSSParserSelector& simpleSele
 {
     if (compoundPseudoElement == CSSSelector::PseudoElementUnknown)
         return true;
-    // FIXME-NEWPARSER: This doesn't exist for us.
-    // if (compoundPseudoElement == CSSSelector::PseudoElementContent)
-    //    return simpleSelector.match() != CSSSelector::PseudoElement;
+    if (compoundPseudoElement == CSSSelector::PseudoElementPart) {
+        if (simpleSelector.match() == CSSSelector::PseudoElement && simpleSelector.pseudoElementType() != CSSSelector::PseudoElementPart)
+            return true;
+    }
     if (simpleSelector.match() != CSSSelector::PseudoClass)
         return false;
     CSSSelector::PseudoClassType pseudo = simpleSelector.pseudoClassType();
@@ -618,8 +622,6 @@ std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumePseudo(CSSParserTok
         }
 #endif
         case CSSSelector::PseudoElementPart: {
-            DisallowPseudoElementsScope scope(this);
-
             auto argumentList = makeUnique<Vector<AtomString>>();
             do {
                 auto& ident = block.consumeIncludingWhitespace();