Diff
Modified: trunk/LayoutTests/ChangeLog (284864 => 284865)
--- trunk/LayoutTests/ChangeLog 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/ChangeLog 2021-10-26 14:55:58 UTC (rev 284865)
@@ -1,5 +1,14 @@
2021-10-26 Antti Koivisto <an...@apple.com>
+ Fix ::part(foo):hover
+ https://bugs.webkit.org/show_bug.cgi?id=232301
+
+ Reviewed by Alan Bujtas.
+
+ * TestExpectations:
+
+2021-10-26 Antti Koivisto <an...@apple.com>
+
[CSS Cascade Layers] Media queries should be able to affect layer order
https://bugs.webkit.org/show_bug.cgi?id=232238
Modified: trunk/LayoutTests/TestExpectations (284864 => 284865)
--- trunk/LayoutTests/TestExpectations 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/TestExpectations 2021-10-26 14:55:58 UTC (rev 284865)
@@ -5191,3 +5191,5 @@
# IPC test failing in Debug mode due to assert.
[ Debug ] ipc/send-invalid-message.html [ Skip ]
+
+imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html [ ImageOnlyFailure ]
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (284864 => 284865)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2021-10-26 14:55:58 UTC (rev 284865)
@@ -1,5 +1,20 @@
2021-10-26 Antti Koivisto <an...@apple.com>
+ Fix ::part(foo):hover
+ https://bugs.webkit.org/show_bug.cgi?id=232301
+
+ Reviewed by Alan Bujtas.
+
+ * web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html: Added.
+ * web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html: Added.
+ * web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt: Added.
+ * web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html: Added.
+ * web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html: Added.
+ * web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html: Added.
+ * web-platform-tests/css/css-shadow-parts/w3c-import.log:
+
+2021-10-26 Antti Koivisto <an...@apple.com>
+
Serialize :part() argument as identifier
https://bugs.webkit.org/show_bug.cgi?id=232297
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html (0 => 284865)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html 2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<button style="color:green">Should be green on focus</button>
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html (0 => 284865)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html 2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>CSS Shadow Parts - Nested Pseudo Classes</title>
+<link rel="help" href="" >
+<link rel="help" href=""
+<link href="" rel="help">
+<link rel="match" href=""
+<script src=""
+<script src=""
+<script src=""
+<style>
+ :root { color: red; }
+ ::part(test):is(:focus) { color: green; }
+</style>
+<div id=host></div>
+<script>
+ const root = host.attachShadow({mode: 'closed'});
+ root.innerHTML = '<button part=test>Should be green on focus</button>';
+ const button = root.querySelector('button');
+ button.addEventListener('focus', takeScreenshot);
+ test_driver.bless('focus button', () => button.focus());
+</script>
+</html>
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt (0 => 284865)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt 2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,3 @@
+
+PASS Invalidation of nested part on hover
+
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html (0 => 284865)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html 2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,50 @@
+<!doctype html>
+<title>CSS Shadow Parts - Pseudo class and exported parts</title>
+<link rel="help" href="" >
+<link rel="help" href=""
+<link href="" rel="help">
+<link rel="match" href=""
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+<style>
+/* NOTE: Even though it might be tempting to use :focus instead, because we
+ can more easily add that state programmatically, that'd defeat the point
+ of the test, since :focus / :focus-visible has default styles which
+ invalidate the element's style anyways */
+#host::part(a):hover {
+ background: blue;
+}
+</style>
+<div id="host"></div>
+<script>
+let host = document.querySelector('#host')
+host.attachShadow({mode: 'open'}).innerHTML = `<div part="b" exportparts="a"></div>`;
+
+let innerHost = host.shadowRoot.querySelector('div');
+innerHost.attachShadow({mode: 'open'}).innerHTML = `
+ <style>
+ div {
+ width: 100px;
+ height: 100px;
+ background: black;
+ color: white;
+ }
+ </style>
+ <div part="a">hover, the background should be blue</div>
+`;
+
+let part = innerHost.shadowRoot.querySelector("div");
+let t = async_test("Invalidation of nested part on hover");
+part.addEventListener("mouseover", t.step_func_done(function() {
+ assert_true(part.matches(":hover"), "Element should be hovered");
+ assert_equals(getComputedStyle(part).backgroundColor, "rgb(0, 0, 255)", "Hover style should apply");
+}));
+
+new test_driver.Actions()
+ .pointerMove(0, 0)
+ .pointerMove(50, 50)
+ .send();
+</script>
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html (0 => 284865)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html 2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,9 @@
+<!doctype html>
+<title>CSS Test Reference</title>
+<style>
+input {
+ border: 1px solid green;
+}
+</style>
+<input type=file part=input>
+<input type=text part=input placeholder=Foobar>
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html (0 => 284865)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html 2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,17 @@
+<!doctype html>
+<title>::part() doesn't incorrectly match pseudo-elements of the part</title>
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="match" href=""
+<style>
+#host::part(input) {
+ border: 1px solid green;
+}
+</style>
+<div id="host"></div>
+<script>
+ document.getElementById("host").attachShadow({ mode: "open" }).innerHTML = `
+ <input type=file part=input>
+ <input type=text part=input placeholder=Foobar>
+ `;
+</script>
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/w3c-import.log (284864 => 284865)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/w3c-import.log 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/w3c-import.log 2021-10-26 14:55:58 UTC (rev 284865)
@@ -26,6 +26,8 @@
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/host-stylesheet.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/idlharness.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/inner-host.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-placeholder-expected.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-placeholder.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-pseudo-elements.html
@@ -36,8 +38,12 @@
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-change-part-name.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-complex-selector-forward.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-complex-selector.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/multiple-parts.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-name-idl.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/precedence-part-vs-part.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/serialization.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/simple-forward-shorthand.html
Modified: trunk/Source/WebCore/ChangeLog (284864 => 284865)
--- trunk/Source/WebCore/ChangeLog 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/ChangeLog 2021-10-26 14:55:58 UTC (rev 284865)
@@ -1,5 +1,44 @@
2021-10-26 Antti Koivisto <an...@apple.com>
+ Fix ::part(foo):hover
+ https://bugs.webkit.org/show_bug.cgi?id=232301
+
+ Reviewed by Alan Bujtas.
+
+ We fail to match on shadow tree border if the right side of ::part() has other selectors.
+
+ Tests: imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html
+
+ * css/CSSSelector.cpp:
+ (WebCore::CSSSelector::selectorText const):
+ * css/CSSSelector.h:
+
+ Add a new ShadowPartDescendant relation type that behaves like the existing ShadowDescendant relation
+ except it is only used for ::part.
+
+ * css/SelectorChecker.cpp:
+ (WebCore::SelectorChecker::matchRecursively const):
+
+ We can now identify the ::part case easily from the relation type.
+
+ (WebCore::canMatchHoverOrActiveInQuirksMode):
+ * css/SelectorFilter.cpp:
+ (WebCore::collectSelectorHashes):
+ * css/parser/CSSParserSelector.h:
+ (WebCore::CSSParserSelector::hasShadowDescendant const): Deleted.
+ * css/parser/CSSSelectorParser.cpp:
+ (WebCore::CSSSelectorParser::splitCompoundAtImplicitShadowCrossingCombinator):
+
+ Use ShadowPartDescendant as appropriate.
+
+ * cssjit/SelectorCompiler.cpp:
+ (WebCore::SelectorCompiler::fragmentRelationForSelectorRelation):
+ (WebCore::SelectorCompiler::constructFragmentsInternal):
+ * style/RuleFeature.cpp:
+ (WebCore::Style::RuleFeatureSet::computeNextMatchElement):
+
+2021-10-26 Antti Koivisto <an...@apple.com>
+
Serialize :part() argument as identifier
https://bugs.webkit.org/show_bug.cgi?id=232297
Modified: trunk/Source/WebCore/css/CSSSelector.cpp (284864 => 284865)
--- trunk/Source/WebCore/css/CSSSelector.cpp 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/CSSSelector.cpp 2021-10-26 14:55:58 UTC (rev 284865)
@@ -822,6 +822,7 @@
FALLTHROUGH;
#endif
case CSSSelector::ShadowDescendant:
+ case CSSSelector::ShadowPartDescendant:
builder.append(rightSide);
return tagHistory->selectorText(builder.toString());
}
Modified: trunk/Source/WebCore/css/CSSSelector.h (284864 => 284865)
--- trunk/Source/WebCore/css/CSSSelector.h 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/CSSSelector.h 2021-10-26 14:55:58 UTC (rev 284865)
@@ -86,7 +86,8 @@
Child,
DirectAdjacent,
IndirectAdjacent,
- ShadowDescendant
+ ShadowDescendant,
+ ShadowPartDescendant
};
enum PseudoClassType {
Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (284864 => 284865)
--- trunk/Source/WebCore/css/SelectorChecker.cpp 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp 2021-10-26 14:55:58 UTC (rev 284865)
@@ -77,7 +77,6 @@
bool hasScrollbarPseudo { false };
bool hasSelectionPseudo { false };
bool mayMatchHostPseudoClass { false };
-
};
static inline void addStyleRelation(SelectorChecker::CheckingContext& checkingContext, const Element& element, Style::Relation::Type type, unsigned value = 1)
@@ -409,10 +408,10 @@
return MatchResult::updateWithMatchType(result, matchType);
}
case CSSSelector::ShadowDescendant:
+ case CSSSelector::ShadowPartDescendant:
{
// When matching foo::part(bar) we skip directly to the tree of element 'foo'.
- bool isPart = context.selector->match() == CSSSelector::PseudoElement && context.selector->pseudoElementType() == CSSSelector::PseudoElementPart;
- auto* shadowHost = isPart ? checkingContext.shadowHostInPartRuleScope : context.element->shadowHost();
+ auto* shadowHost = relation == CSSSelector::ShadowPartDescendant ? checkingContext.shadowHostInPartRuleScope : context.element->shadowHost();
if (!shadowHost)
return MatchResult::fails(Match::SelectorFailsCompletely);
nextContext.element = shadowHost;
@@ -425,7 +424,6 @@
}
}
-
ASSERT_NOT_REACHED();
return MatchResult::fails(Match::SelectorFailsCompletely);
}
@@ -599,7 +597,7 @@
}
auto relation = selector->relation();
- if (relation == CSSSelector::ShadowDescendant)
+ if (relation == CSSSelector::ShadowDescendant || relation == CSSSelector::ShadowPartDescendant)
return true;
if (relation != CSSSelector::Subselector)
Modified: trunk/Source/WebCore/css/SelectorFilter.cpp (284864 => 284865)
--- trunk/Source/WebCore/css/SelectorFilter.cpp 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/SelectorFilter.cpp 2021-10-26 14:55:58 UTC (rev 284865)
@@ -194,6 +194,7 @@
case CSSSelector::DirectAdjacent:
case CSSSelector::IndirectAdjacent:
case CSSSelector::ShadowDescendant:
+ case CSSSelector::ShadowPartDescendant:
skipOverSubselectors = true;
break;
case CSSSelector::DescendantSpace:
Modified: trunk/Source/WebCore/css/parser/CSSParserSelector.h (284864 => 284865)
--- trunk/Source/WebCore/css/parser/CSSParserSelector.h 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/parser/CSSParserSelector.h 2021-10-26 14:55:58 UTC (rev 284865)
@@ -71,7 +71,6 @@
bool isPseudoElementCueFunction() const;
- bool hasShadowDescendant() const;
bool matchesPseudoElement() const;
bool isHostPseudoSelector() const;
@@ -96,11 +95,6 @@
std::unique_ptr<CSSParserSelector> m_tagHistory;
};
-inline bool CSSParserSelector::hasShadowDescendant() const
-{
- return m_selector->relation() == CSSSelector::ShadowDescendant;
-}
-
inline bool CSSParserSelector::needsImplicitShadowCombinatorForMatching() const
{
return match() == CSSSelector::PseudoElement
Modified: trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp (284864 => 284865)
--- trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp 2021-10-26 14:55:58 UTC (rev 284865)
@@ -1068,7 +1068,7 @@
} else
secondCompound = splitAfter->releaseTagHistory();
- secondCompound->appendTagHistory(CSSSelector::ShadowDescendant, WTFMove(compoundSelector));
+ secondCompound->appendTagHistory(isPart ? CSSSelector::ShadowPartDescendant : CSSSelector::ShadowDescendant, WTFMove(compoundSelector));
return secondCompound;
}
Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (284864 => 284865)
--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp 2021-10-26 14:55:58 UTC (rev 284865)
@@ -500,6 +500,7 @@
return FragmentRelation::IndirectAdjacent;
case CSSSelector::Subselector:
case CSSSelector::ShadowDescendant:
+ case CSSSelector::ShadowPartDescendant:
ASSERT_NOT_REACHED();
}
ASSERT_NOT_REACHED();
@@ -1322,7 +1323,7 @@
if (relation == CSSSelector::Subselector)
continue;
- if (relation == CSSSelector::ShadowDescendant && !selector->isLastInTagHistory())
+ if ((relation == CSSSelector::ShadowDescendant || relation == CSSSelector::ShadowPartDescendant) && !selector->isLastInTagHistory())
return FunctionType::CannotCompile;
if (relation == CSSSelector::DirectAdjacent || relation == CSSSelector::IndirectAdjacent) {
Modified: trunk/Source/WebCore/style/RuleFeature.cpp (284864 => 284865)
--- trunk/Source/WebCore/style/RuleFeature.cpp 2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/style/RuleFeature.cpp 2021-10-26 14:55:58 UTC (rev 284865)
@@ -84,6 +84,7 @@
return MatchElement::AnySibling;
return matchElement == MatchElement::Subject ? MatchElement::DirectSibling : MatchElement::IndirectSibling;
case CSSSelector::ShadowDescendant:
+ case CSSSelector::ShadowPartDescendant:
return MatchElement::Host;
};
}
@@ -97,6 +98,7 @@
case CSSSelector::DirectAdjacent:
return matchElement == MatchElement::Parent ? MatchElement::ParentSibling : MatchElement::AncestorSibling;
case CSSSelector::ShadowDescendant:
+ case CSSSelector::ShadowPartDescendant:
return MatchElement::Host;
};
ASSERT_NOT_REACHED();