-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[view-transitions] Implement parsing & checking for pseudo-elements
https://bugs.webkit.org/show_bug.cgi?id=265167 rdar://118666802 Reviewed by Cameron McCormack. This implements parsing and adapts CSS highlight resolution code for view-transition pseudos. The following pseudo-elements are covered: - ::view-transition - ::view-transition-group() - ::view-transition-image-pair() - ::view-transition-old() - ::view-transition-new() https://drafts.csswg.org/css-view-transitions/#pseudo * LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml.html: * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-invalid-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-invalid.html: Added. * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-valid-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-valid.html: Added. * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/view-transition-name-computed-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/view-transition-name-computed.html: * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/view-transition-name-invalid-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/parsing/view-transition-name-invalid.html: * Source/JavaScriptCore/inspector/protocol/CSS.json: * Source/WebCore/animation/WebAnimationUtilities.cpp: (WebCore::pseudoIdFromString): * Source/WebCore/css/CSSComputedStyleDeclaration.cpp: (WebCore::CSSComputedStyleDeclaration::CSSComputedStyleDeclaration): * Source/WebCore/css/CSSSelector.cpp: (WebCore::CSSSelector::pseudoId): (WebCore::CSSSelector::parsePseudoElementType): (WebCore::CSSSelector::selectorText const): * Source/WebCore/css/CSSSelector.h: * Source/WebCore/css/SelectorChecker.cpp: (WebCore::SelectorChecker::checkOne const): * Source/WebCore/css/SelectorChecker.h: * Source/WebCore/css/SelectorPseudoElementTypeMap.in: * Source/WebCore/css/parser/CSSParserContext.cpp: (WebCore::CSSParserContext::CSSParserContext): * Source/WebCore/css/parser/CSSParserSelector.cpp: (WebCore::CSSParserSelector::parsePseudoElementSelector): * Source/WebCore/css/parser/CSSParserSelector.h: * Source/WebCore/css/parser/CSSSelectorParser.cpp: (WebCore::isOnlyPseudoElementFunction): (WebCore::CSSSelectorParser::consumePseudo): * Source/WebCore/css/parser/CSSSelectorParserContext.cpp: (WebCore::CSSSelectorParserContext::CSSSelectorParserContext): (WebCore::add): * Source/WebCore/css/parser/CSSSelectorParserContext.h: * Source/WebCore/cssjit/SelectorCompiler.cpp: (WebCore::SelectorCompiler::constructFragmentsInternal): * Source/WebCore/inspector/agents/InspectorCSSAgent.cpp: (WebCore::InspectorCSSAgent::protocolValueForPseudoId): * Source/WebCore/page/LocalDOMWindow.cpp: (WebCore::LocalDOMWindow::getMatchedCSSRules const): * Source/WebCore/rendering/style/RenderStyle.h: * Source/WebCore/rendering/style/RenderStyleConstants.cpp: (WebCore::operator<<): * Source/WebCore/rendering/style/RenderStyleConstants.h: * Source/WebCore/style/ElementRuleCollector.cpp: (WebCore::Style::ElementRuleCollector::ruleMatches): * Source/WebCore/style/ElementRuleCollector.h: (WebCore::Style::PseudoElementRequest::PseudoElementRequest):: Co-authored-by: Vitaly Dyachkov <vitaly@igalia.com> Canonical link: https://commits.webkit.org/271089@main
- Loading branch information
Showing
31 changed files
with
744 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
358 changes: 358 additions & 0 deletions
358
.../web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-invalid-expected.txt
Large diffs are not rendered by default.
Oops, something went wrong.
69 changes: 69 additions & 0 deletions
69
...rted/w3c/web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-invalid.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
<!doctype html> | ||
<meta charset="utf-8"> | ||
<title>Test pseudo elements parsing of invalid selectors</title> | ||
<link rel="author" href="https://github.com/nt1m"> | ||
<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/"> | ||
<script src="/resources/testharness.js"></script> | ||
<script src="/resources/testharnessreport.js"></script> | ||
<script src="/css/support/parsing-testcommon.js"></script> | ||
<script> | ||
const functionPseudoElements = [ | ||
"::view-transition-group", | ||
"::view-transition-image-pair", | ||
"::view-transition-old", | ||
"::view-transition-new", | ||
]; | ||
|
||
function test_invalid_selector_combinations(pseudo) { | ||
test_invalid_selector(`${pseudo}.a`); | ||
test_invalid_selector(`${pseudo} div`); | ||
test_invalid_selector(`${pseudo}:hover`); | ||
test_invalid_selector(`:not(${pseudo})`); | ||
test_invalid_selector(`:has(${pseudo})`); | ||
} | ||
|
||
test_invalid_selector_combinations("::view-transition"); | ||
test_invalid_selector("::view-transition(*)"); | ||
test_invalid_selector("::view-transition(valid)"); | ||
test_invalid_selector("::view-transition(root)"); | ||
|
||
for (const fn of functionPseudoElements) { | ||
for (const validArgument of ["*", "valid", "root"]) { | ||
test_invalid_selector_combinations(`${fn}(${validArgument})`); | ||
} | ||
|
||
// Test function without argument. | ||
test_invalid_selector(fn); | ||
test_invalid_selector_combinations(fn); | ||
|
||
// Test function with empty argument. | ||
test_invalid_selector(`${fn}()`); | ||
test_invalid_selector_combinations(`${fn}()`); | ||
|
||
// Test function with keywords excluded from <custom-ident>. | ||
test_invalid_selector(`${fn}(default)`); | ||
test_invalid_selector_combinations(`${fn}(default)`); | ||
test_invalid_selector(`${fn}(unset)`); | ||
test_invalid_selector_combinations(`${fn}(unset)`); | ||
test_invalid_selector(`${fn}(initial)`); | ||
test_invalid_selector_combinations(`${fn}(initial)`); | ||
test_invalid_selector(`${fn}(inherit)`); | ||
test_invalid_selector_combinations(`${fn}(inherit)`); | ||
test_invalid_selector(`${fn}(revert)`); | ||
test_invalid_selector_combinations(`${fn}(revert)`); | ||
test_invalid_selector(`${fn}(revert-layer)`); | ||
test_invalid_selector_combinations(`${fn}(revert-layer)`); | ||
|
||
// Test function with multiple arguments. | ||
test_invalid_selector(`${fn}(foo, bar)`); | ||
test_invalid_selector_combinations(`${fn}(foo, bar)`); | ||
test_invalid_selector(`${fn}(foo bar)`); | ||
test_invalid_selector_combinations(`${fn}(foo bar)`); | ||
|
||
// Test function with selector arguments. | ||
test_invalid_selector(`${fn}(.foo)`); | ||
test_invalid_selector_combinations(`${fn}(.foo)`); | ||
test_invalid_selector(`${fn}(#bar)`); | ||
test_invalid_selector_combinations(`${fn}(#bar)`); | ||
} | ||
</script> |
102 changes: 102 additions & 0 deletions
102
...3c/web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-valid-expected.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
|
||
PASS "::view-transition" should be a valid selector | ||
PASS ":root::view-transition" should be a valid selector | ||
PASS ".a::view-transition" should be a valid selector | ||
PASS "div ::view-transition" should be a valid selector | ||
PASS "::view-transition-group(*)" should be a valid selector | ||
PASS ":root::view-transition-group(*)" should be a valid selector | ||
PASS ".a::view-transition-group(*)" should be a valid selector | ||
PASS "div ::view-transition-group(*)" should be a valid selector | ||
FAIL "::view-transition-group(*):only-child" should be a valid selector '::view-transition-group(*):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-group(*):only-child" should be a valid selector ':root::view-transition-group(*):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-group(*):only-child" should be a valid selector '.a::view-transition-group(*):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-group(*):only-child" should be a valid selector 'div ::view-transition-group(*):only-child' is not a valid selector. | ||
PASS "::view-transition-group(root)" should be a valid selector | ||
PASS ":root::view-transition-group(root)" should be a valid selector | ||
PASS ".a::view-transition-group(root)" should be a valid selector | ||
PASS "div ::view-transition-group(root)" should be a valid selector | ||
FAIL "::view-transition-group(root):only-child" should be a valid selector '::view-transition-group(root):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-group(root):only-child" should be a valid selector ':root::view-transition-group(root):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-group(root):only-child" should be a valid selector '.a::view-transition-group(root):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-group(root):only-child" should be a valid selector 'div ::view-transition-group(root):only-child' is not a valid selector. | ||
PASS "::view-transition-group(dashed-ident)" should be a valid selector | ||
PASS ":root::view-transition-group(dashed-ident)" should be a valid selector | ||
PASS ".a::view-transition-group(dashed-ident)" should be a valid selector | ||
PASS "div ::view-transition-group(dashed-ident)" should be a valid selector | ||
FAIL "::view-transition-group(dashed-ident):only-child" should be a valid selector '::view-transition-group(dashed-ident):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-group(dashed-ident):only-child" should be a valid selector ':root::view-transition-group(dashed-ident):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-group(dashed-ident):only-child" should be a valid selector '.a::view-transition-group(dashed-ident):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-group(dashed-ident):only-child" should be a valid selector 'div ::view-transition-group(dashed-ident):only-child' is not a valid selector. | ||
PASS "::view-transition-image-pair(*)" should be a valid selector | ||
PASS ":root::view-transition-image-pair(*)" should be a valid selector | ||
PASS ".a::view-transition-image-pair(*)" should be a valid selector | ||
PASS "div ::view-transition-image-pair(*)" should be a valid selector | ||
FAIL "::view-transition-image-pair(*):only-child" should be a valid selector '::view-transition-image-pair(*):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-image-pair(*):only-child" should be a valid selector ':root::view-transition-image-pair(*):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-image-pair(*):only-child" should be a valid selector '.a::view-transition-image-pair(*):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-image-pair(*):only-child" should be a valid selector 'div ::view-transition-image-pair(*):only-child' is not a valid selector. | ||
PASS "::view-transition-image-pair(root)" should be a valid selector | ||
PASS ":root::view-transition-image-pair(root)" should be a valid selector | ||
PASS ".a::view-transition-image-pair(root)" should be a valid selector | ||
PASS "div ::view-transition-image-pair(root)" should be a valid selector | ||
FAIL "::view-transition-image-pair(root):only-child" should be a valid selector '::view-transition-image-pair(root):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-image-pair(root):only-child" should be a valid selector ':root::view-transition-image-pair(root):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-image-pair(root):only-child" should be a valid selector '.a::view-transition-image-pair(root):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-image-pair(root):only-child" should be a valid selector 'div ::view-transition-image-pair(root):only-child' is not a valid selector. | ||
PASS "::view-transition-image-pair(dashed-ident)" should be a valid selector | ||
PASS ":root::view-transition-image-pair(dashed-ident)" should be a valid selector | ||
PASS ".a::view-transition-image-pair(dashed-ident)" should be a valid selector | ||
PASS "div ::view-transition-image-pair(dashed-ident)" should be a valid selector | ||
FAIL "::view-transition-image-pair(dashed-ident):only-child" should be a valid selector '::view-transition-image-pair(dashed-ident):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-image-pair(dashed-ident):only-child" should be a valid selector ':root::view-transition-image-pair(dashed-ident):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-image-pair(dashed-ident):only-child" should be a valid selector '.a::view-transition-image-pair(dashed-ident):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-image-pair(dashed-ident):only-child" should be a valid selector 'div ::view-transition-image-pair(dashed-ident):only-child' is not a valid selector. | ||
PASS "::view-transition-old(*)" should be a valid selector | ||
PASS ":root::view-transition-old(*)" should be a valid selector | ||
PASS ".a::view-transition-old(*)" should be a valid selector | ||
PASS "div ::view-transition-old(*)" should be a valid selector | ||
FAIL "::view-transition-old(*):only-child" should be a valid selector '::view-transition-old(*):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-old(*):only-child" should be a valid selector ':root::view-transition-old(*):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-old(*):only-child" should be a valid selector '.a::view-transition-old(*):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-old(*):only-child" should be a valid selector 'div ::view-transition-old(*):only-child' is not a valid selector. | ||
PASS "::view-transition-old(root)" should be a valid selector | ||
PASS ":root::view-transition-old(root)" should be a valid selector | ||
PASS ".a::view-transition-old(root)" should be a valid selector | ||
PASS "div ::view-transition-old(root)" should be a valid selector | ||
FAIL "::view-transition-old(root):only-child" should be a valid selector '::view-transition-old(root):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-old(root):only-child" should be a valid selector ':root::view-transition-old(root):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-old(root):only-child" should be a valid selector '.a::view-transition-old(root):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-old(root):only-child" should be a valid selector 'div ::view-transition-old(root):only-child' is not a valid selector. | ||
PASS "::view-transition-old(dashed-ident)" should be a valid selector | ||
PASS ":root::view-transition-old(dashed-ident)" should be a valid selector | ||
PASS ".a::view-transition-old(dashed-ident)" should be a valid selector | ||
PASS "div ::view-transition-old(dashed-ident)" should be a valid selector | ||
FAIL "::view-transition-old(dashed-ident):only-child" should be a valid selector '::view-transition-old(dashed-ident):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-old(dashed-ident):only-child" should be a valid selector ':root::view-transition-old(dashed-ident):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-old(dashed-ident):only-child" should be a valid selector '.a::view-transition-old(dashed-ident):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-old(dashed-ident):only-child" should be a valid selector 'div ::view-transition-old(dashed-ident):only-child' is not a valid selector. | ||
PASS "::view-transition-new(*)" should be a valid selector | ||
PASS ":root::view-transition-new(*)" should be a valid selector | ||
PASS ".a::view-transition-new(*)" should be a valid selector | ||
PASS "div ::view-transition-new(*)" should be a valid selector | ||
FAIL "::view-transition-new(*):only-child" should be a valid selector '::view-transition-new(*):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-new(*):only-child" should be a valid selector ':root::view-transition-new(*):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-new(*):only-child" should be a valid selector '.a::view-transition-new(*):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-new(*):only-child" should be a valid selector 'div ::view-transition-new(*):only-child' is not a valid selector. | ||
PASS "::view-transition-new(root)" should be a valid selector | ||
PASS ":root::view-transition-new(root)" should be a valid selector | ||
PASS ".a::view-transition-new(root)" should be a valid selector | ||
PASS "div ::view-transition-new(root)" should be a valid selector | ||
FAIL "::view-transition-new(root):only-child" should be a valid selector '::view-transition-new(root):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-new(root):only-child" should be a valid selector ':root::view-transition-new(root):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-new(root):only-child" should be a valid selector '.a::view-transition-new(root):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-new(root):only-child" should be a valid selector 'div ::view-transition-new(root):only-child' is not a valid selector. | ||
PASS "::view-transition-new(dashed-ident)" should be a valid selector | ||
PASS ":root::view-transition-new(dashed-ident)" should be a valid selector | ||
PASS ".a::view-transition-new(dashed-ident)" should be a valid selector | ||
PASS "div ::view-transition-new(dashed-ident)" should be a valid selector | ||
FAIL "::view-transition-new(dashed-ident):only-child" should be a valid selector '::view-transition-new(dashed-ident):only-child' is not a valid selector. | ||
FAIL ":root::view-transition-new(dashed-ident):only-child" should be a valid selector ':root::view-transition-new(dashed-ident):only-child' is not a valid selector. | ||
FAIL ".a::view-transition-new(dashed-ident):only-child" should be a valid selector '.a::view-transition-new(dashed-ident):only-child' is not a valid selector. | ||
FAIL "div ::view-transition-new(dashed-ident):only-child" should be a valid selector 'div ::view-transition-new(dashed-ident):only-child' is not a valid selector. | ||
|
32 changes: 32 additions & 0 deletions
32
...ported/w3c/web-platform-tests/css/css-view-transitions/parsing/pseudo-elements-valid.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
<!doctype html> | ||
<meta charset="utf-8"> | ||
<title>Test pseudo elements parsing of valid selectors</title> | ||
<link rel="author" href="https://github.com/nt1m"> | ||
<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/"> | ||
<script src="/resources/testharness.js"></script> | ||
<script src="/resources/testharnessreport.js"></script> | ||
<script src="/css/support/parsing-testcommon.js"></script> | ||
<script> | ||
const functionPseudoElements = [ | ||
"::view-transition-group", | ||
"::view-transition-image-pair", | ||
"::view-transition-old", | ||
"::view-transition-new", | ||
]; | ||
|
||
function test_valid_selector_combinations(pseudo) { | ||
test_valid_selector(pseudo); | ||
test_valid_selector(`:root${pseudo}`); | ||
test_valid_selector(`.a${pseudo}`); | ||
test_valid_selector(`div ${pseudo}`); | ||
} | ||
|
||
test_valid_selector_combinations("::view-transition"); | ||
|
||
for (const functionName of functionPseudoElements) { | ||
for (const validArgument of ["*", "root", "dashed-ident"]) { | ||
test_valid_selector_combinations(`${functionName}(${validArgument})`); | ||
test_valid_selector_combinations(`${functionName}(${validArgument}):only-child`); | ||
} | ||
} | ||
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
...platform-tests/css/css-view-transitions/parsing/view-transition-name-invalid-expected.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.