Skip to content

Commit

Permalink
[view-transitions] Support :active-view-transition pseudo-class
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=275488
rdar://129851076

Reviewed by Darin Adler.

This is part of the level 2 spec: https://drafts.csswg.org/css-view-transitions-2/#the-active-view-transition-pseudo

This matches anytime there is an active view transition on the document.

* LayoutTests/TestExpectations:
* LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/active-view-transition-pseudo-class-match-expected.html: Renamed from LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-universal-match-expected.html.
* LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/active-view-transition-pseudo-class-match.html: Renamed from LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-universal-match.html.
* Source/WebCore/css/CSSPseudoSelectors.json:
* Source/WebCore/css/SelectorChecker.cpp:
(WebCore::SelectorChecker::checkOne const):
* Source/WebCore/css/SelectorCheckerTestFunctions.h:
(WebCore::matchesActiveViewTransitionPseudoClass):
* Source/WebCore/cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::JSC_DEFINE_NOEXCEPT_JIT_OPERATION):
(WebCore::SelectorCompiler::addPseudoClassType):
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::setActiveViewTransition):

Canonical link: https://commits.webkit.org/280027@main
  • Loading branch information
nt1m committed Jun 14, 2024
1 parent 5c367f9 commit cd6cadf
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 1 deletion.
1 change: 0 additions & 1 deletion LayoutTests/TestExpectations
Original file line number Diff line number Diff line change
Expand Up @@ -6981,7 +6981,6 @@ imported/w3c/web-platform-tests/css/css-view-transitions/pseudo-with-classes-vie
imported/w3c/web-platform-tests/css/css-view-transitions/navigation [ Skip ]

# View transitions Level 2 - types.
imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-universal-match.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-match-early-mutation.html [ Skip ]
imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-match-early.html [ Skip ]
imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-match-late-mutation.html [ Skip ]
Expand Down
3 changes: 3 additions & 0 deletions Source/WebCore/css/CSSPseudoSelectors.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@
"status": "non-standard"
},
"active": {},
"active-view-transition": {
"settings-flag": "viewTransitionsEnabled"
},
"any-link": {
"aliases": [
"-webkit-any-link"
Expand Down
3 changes: 3 additions & 0 deletions Source/WebCore/css/SelectorChecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1161,6 +1161,9 @@ bool SelectorChecker::checkOne(CheckingContext& checkingContext, const LocalCont

case CSSSelector::PseudoClass::UserValid:
return matchesUserValidPseudoClass(element);

case CSSSelector::PseudoClass::ActiveViewTransition:
return matchesActiveViewTransitionPseudoClass(element);
}
return false;
}
Expand Down
7 changes: 7 additions & 0 deletions Source/WebCore/css/SelectorCheckerTestFunctions.h
Original file line number Diff line number Diff line change
Expand Up @@ -583,4 +583,11 @@ ALWAYS_INLINE bool matchesUserValidPseudoClass(const Element& element)
return element.matchesUserValidPseudoClass();
}

ALWAYS_INLINE bool matchesActiveViewTransitionPseudoClass(const Element& element)
{
if (&element != element.document().documentElement())
return false;
return !!element.document().activeViewTransition();
}

} // namespace WebCore
12 changes: 12 additions & 0 deletions Source/WebCore/cssjit/SelectorCompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ using PseudoClassesSet = HashSet<CSSSelector::PseudoClass, IntHash<CSSSelector::
v(operationMatchesPopoverOpenPseudoClass) \
v(operationMatchesModalPseudoClass) \
v(operationMatchesHtmlDocumentPseudoClass) \
v(operationMatchesActiveViewTransitionPseudoClass) \
v(operationIsUserInvalid) \
v(operationIsUserValid) \
v(operationAddStyleRelationFunction) \
Expand Down Expand Up @@ -281,6 +282,7 @@ static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationHasAttac
static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesHtmlDocumentPseudoClass, bool, (const Element&));
static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesPopoverOpenPseudoClass, bool, (const Element&));
static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesModalPseudoClass, bool, (const Element&));
static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesActiveViewTransitionPseudoClass, bool, (const Element&));
static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationIsUserInvalid, bool, (const Element&));
static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationIsUserValid, bool, (const Element&));

Expand Down Expand Up @@ -1024,6 +1026,12 @@ JSC_DEFINE_NOEXCEPT_JIT_OPERATION(operationMatchesModalPseudoClass, bool, (const
return matchesModalPseudoClass(element);
}

JSC_DEFINE_NOEXCEPT_JIT_OPERATION(operationMatchesActiveViewTransitionPseudoClass, bool, (const Element& element))
{
COUNT_SELECTOR_OPERATION(operationMatchesActiveViewTransitionPseudoClass);
return matchesActiveViewTransitionPseudoClass(element);
}

JSC_DEFINE_NOEXCEPT_JIT_OPERATION(operationIsUserInvalid, bool, (const Element& element))
{
COUNT_SELECTOR_OPERATION(operationIsUserInvalid);
Expand Down Expand Up @@ -1191,6 +1199,10 @@ static inline FunctionType addPseudoClassType(const CSSSelector& selector, Selec
fragment.unoptimizedPseudoClasses.append(CodePtr<JSC::OperationPtrTag>(operationIsUserValid));
return FunctionType::SimpleSelectorChecker;

case CSSSelector::PseudoClass::ActiveViewTransition:
fragment.unoptimizedPseudoClasses.append(CodePtr<JSC::OperationPtrTag>(operationMatchesActiveViewTransitionPseudoClass));
return FunctionType::SimpleSelectorChecker;

// These pseudo-classes only have meaning with scrollbars.
case CSSSelector::PseudoClass::Horizontal:
case CSSSelector::PseudoClass::Vertical:
Expand Down
3 changes: 3 additions & 0 deletions Source/WebCore/dom/Document.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10582,6 +10582,9 @@ bool Document::activeViewTransitionCapturedDocumentElement() const

void Document::setActiveViewTransition(RefPtr<ViewTransition>&& viewTransition)
{
std::optional<Style::PseudoClassChangeInvalidation> styleInvalidation;
if (documentElement())
styleInvalidation.emplace(*documentElement(), CSSSelector::PseudoClass::ActiveViewTransition, !!viewTransition);
m_activeViewTransition = WTFMove(viewTransition);
}

Expand Down

0 comments on commit cd6cadf

Please sign in to comment.