Diff
Modified: trunk/LayoutTests/inspector/css/forcePseudoState-expected.txt (295650 => 295651)
--- trunk/LayoutTests/inspector/css/forcePseudoState-expected.txt 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/LayoutTests/inspector/css/forcePseudoState-expected.txt 2022-06-17 23:59:31 UTC (rev 295651)
@@ -42,6 +42,14 @@
PASS: Should not have any enabled pseudo classes.
PASS: Should change back to initial style.
+-- Running test case: CSS.forcePseudoState.target
+Forcing pseudo class...
+PASS: Should have one enabled pseudo class.
+PASS: Should change styles.
+Removing forced pseudo class...
+PASS: Should not have any enabled pseudo classes.
+PASS: Should change back to initial style.
+
-- Running test case: CSS.forcePseudoState.visited
Forcing pseudo class...
PASS: Should have one enabled pseudo class.
Modified: trunk/LayoutTests/inspector/css/forcePseudoState.html (295650 => 295651)
--- trunk/LayoutTests/inspector/css/forcePseudoState.html 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/LayoutTests/inspector/css/forcePseudoState.html 2022-06-17 23:59:31 UTC (rev 295651)
@@ -15,7 +15,8 @@
{forceablePseudoClass: WI.CSSManager.ForceablePseudoClass.FocusVisible, expectedBackgroundColor: "rgb(0, 0, 30)"},
{forceablePseudoClass: WI.CSSManager.ForceablePseudoClass.FocusWithin, expectedBackgroundColor: "rgb(0, 0, 40)"},
{forceablePseudoClass: WI.CSSManager.ForceablePseudoClass.Hover, expectedBackgroundColor: "rgb(0, 0, 50)"},
- {forceablePseudoClass: WI.CSSManager.ForceablePseudoClass.Visited, expectedBackgroundColor: "rgb(0, 0, 60)"},
+ {forceablePseudoClass: WI.CSSManager.ForceablePseudoClass.Target, expectedBackgroundColor: "rgb(0, 0, 60)"},
+ {forceablePseudoClass: WI.CSSManager.ForceablePseudoClass.Visited, expectedBackgroundColor: "rgb(0, 0, 70)"},
].forEach(({forceablePseudoClass, expectedBackgroundColor}) => {
suite.addTestCase({
name: "CSS.forcePseudoState." + forceablePseudoClass,
@@ -83,9 +84,12 @@
#test-element:hover {
background-color: rgb(0, 0, 50);
}
-#test-element:visited {
+#test-element:target {
background-color: rgb(0, 0, 60);
}
+#test-element:visited {
+ background-color: rgb(0, 0, 70);
+}
</style>
<a href="" id="test-element"></a>
</body>
Modified: trunk/Source/_javascript_Core/inspector/protocol/CSS.json (295650 => 295651)
--- trunk/Source/_javascript_Core/inspector/protocol/CSS.json 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/Source/_javascript_Core/inspector/protocol/CSS.json 2022-06-17 23:59:31 UTC (rev 295651)
@@ -63,6 +63,7 @@
"focus-visible",
"focus-within",
"hover",
+ "target",
"visited"
],
"description": "Pseudo-style identifier (see <code>enum PseudoId</code> in <code>RenderStyleConstants.h</code>)."
Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (295650 => 295651)
--- trunk/Source/WebCore/css/SelectorChecker.cpp 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp 2022-06-17 23:59:31 UTC (rev 295651)
@@ -962,7 +962,7 @@
return selector.matchNth(count);
}
case CSSSelector::PseudoClassTarget:
- if (&element == element.document().cssTarget())
+ if (&element == element.document().cssTarget() || InspectorInstrumentation::forcePseudoState(element, CSSSelector::PseudoClassTarget))
return true;
break;
case CSSSelector::PseudoClassAutofill:
Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (295650 => 295651)
--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp 2022-06-17 23:59:31 UTC (rev 295651)
@@ -77,6 +77,7 @@
static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationSynchronizeAllAnimatedSVGAttribute, void, (SVGElement&));
static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationSynchronizeStyleAttributeInternal, void, (StyledElement* styledElement));
static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationEqualIgnoringASCIICaseNonNull, bool, (const StringImpl*, const StringImpl*));
+static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationElementIsTarget, bool, (const Element*));
static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationIsAutofilled, bool, (const Element&));
static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationIsAutofilledAndObscured, bool, (const Element&));
static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationIsAutofilledStrongPassword, bool, (const Element&));
@@ -981,7 +982,6 @@
case CSSSelector::PseudoClassAnyLink:
case CSSSelector::PseudoClassLink:
case CSSSelector::PseudoClassRoot:
- case CSSSelector::PseudoClassTarget:
fragment.pseudoClasses.add(type);
return FunctionType::SimpleSelectorChecker;
case CSSSelector::PseudoClassAnyLinkDeprecated:
@@ -1017,6 +1017,7 @@
case CSSSelector::PseudoClassLastChild:
case CSSSelector::PseudoClassOnlyChild:
case CSSSelector::PseudoClassPlaceholderShown:
+ case CSSSelector::PseudoClassTarget:
fragment.pseudoClasses.add(type);
if (selectorContext == SelectorContext::QuerySelector)
return FunctionType::SimpleSelectorChecker;
@@ -4186,11 +4187,18 @@
failureCases.append(m_assembler.branchPtr(Assembler::NotEqual, scope, elementAddressRegister));
}
+JSC_DEFINE_JIT_OPERATION(operationElementIsTarget, bool, (const Element* element))
+{
+ return element == element->document().cssTarget() || InspectorInstrumentation::forcePseudoState(*element, CSSSelector::PseudoClassTarget);
+}
+
void SelectorCodeGenerator::generateElementIsTarget(Assembler::JumpList& failureCases)
{
- LocalRegister document(m_registerAllocator);
- DOMJIT::loadDocument(m_assembler, elementAddressRegister, document);
- failureCases.append(m_assembler.branchPtr(Assembler::NotEqual, Assembler::Address(document, Document::cssTargetMemoryOffset()), elementAddressRegister));
+ // FIXME: <https://webkit.org/b/241733> optimize CSS JIT for `:target`
+ FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
+ functionCall.setFunctionAddress(operationElementIsTarget);
+ functionCall.setOneArgument(elementAddressRegister);
+ failureCases.append(functionCall.callAndBranchOnBooleanReturnValue(Assembler::Zero));
}
void SelectorCodeGenerator::generateElementIsFirstLink(Assembler::JumpList& failureCases, Assembler::RegisterID element)
Modified: trunk/Source/WebCore/dom/Document.h (295650 => 295651)
--- trunk/Source/WebCore/dom/Document.h 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/Source/WebCore/dom/Document.h 2022-06-17 23:59:31 UTC (rev 295651)
@@ -823,7 +823,6 @@
// Updates for :target (CSS3 selector).
void setCSSTarget(Element*);
Element* cssTarget() const { return m_cssTarget; }
- static ptrdiff_t cssTargetMemoryOffset() { return OBJECT_OFFSETOF(Document, m_cssTarget); }
WEBCORE_EXPORT void scheduleFullStyleRebuild();
void scheduleStyleRecalc();
Modified: trunk/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp (295650 => 295651)
--- trunk/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp 2022-06-17 23:59:31 UTC (rev 295651)
@@ -910,6 +910,10 @@
forcedPseudoClassesToSet.add(CSSSelector::PseudoClassFocusWithin);
break;
+ case Protocol::CSS::ForceablePseudoClass::Target:
+ forcedPseudoClassesToSet.add(CSSSelector::PseudoClassTarget);
+ break;
+
case Protocol::CSS::ForceablePseudoClass::Visited:
forcedPseudoClassesToSet.add(CSSSelector::PseudoClassVisited);
break;
Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/CSSManager.js (295650 => 295651)
--- trunk/Source/WebInspectorUI/UserInterface/Controllers/CSSManager.js 2022-06-17 23:56:37 UTC (rev 295650)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/CSSManager.js 2022-06-17 23:59:31 UTC (rev 295651)
@@ -277,6 +277,8 @@
return WI.unlocalizedString(":focus-within");
case WI.CSSManager.ForceablePseudoClass.Hover:
return WI.unlocalizedString(":hover");
+ case WI.CSSManager.ForceablePseudoClass.Target:
+ return WI.unlocalizedString(":target");
case WI.CSSManager.ForceablePseudoClass.Visited:
return WI.unlocalizedString(":visited");
}
@@ -378,6 +380,7 @@
case WI.CSSManager.ForceablePseudoClass.FocusVisible:
case WI.CSSManager.ForceablePseudoClass.FocusWithin:
+ case WI.CSSManager.ForceablePseudoClass.Target:
// COMPATIBILITY (iOS 15.4): CSS.ForceablePseudoClass did not exist yet.
return !!InspectorBackend.Enum.CSS.ForceablePseudoClass;
}
@@ -849,6 +852,7 @@
FocusVisible: "focus-visible",
FocusWithin: "focus-within",
Hover: "hover",
+ Target: "target",
Visited: "visited",
};