Branch: refs/heads/main Home: https://github.com/WebKit/WebKit Commit: 21ebfdcf906c11c01ead1af39be3fa7de873002e https://github.com/WebKit/WebKit/commit/21ebfdcf906c11c01ead1af39be3fa7de873002e Author: Antoine Quint <grao...@webkit.org> Date: 2025-02-06 (Thu, 06 Feb 2025)
Changed paths: M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-with-document-timeline-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/contain-alignment-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/get-keyframes-with-timeline-offset-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/timeline-offset-in-keyframe-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/view-timeline-source.tentative-expected.txt M LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative-expected.txt M Source/WebCore/animation/AnimationEffect.cpp M Source/WebCore/animation/AnimationEffect.h M Source/WebCore/animation/BlendingKeyframes.cpp M Source/WebCore/animation/BlendingKeyframes.h M Source/WebCore/animation/KeyframeEffect.cpp M Source/WebCore/animation/KeyframeEffect.h M Source/WebCore/animation/KeyframeEffect.idl M Source/WebCore/animation/KeyframeInterpolation.cpp M Source/WebCore/animation/KeyframeInterpolation.h M Source/WebCore/animation/ScrollTimeline.cpp M Source/WebCore/animation/ViewTimeline.cpp M Source/WebCore/animation/ViewTimeline.h M Source/WebCore/animation/WebAnimation.cpp M Source/WebCore/css/CSSKeyframeRule.cpp M Source/WebCore/css/CSSKeyframeRule.h M Source/WebCore/css/CSSKeyframesRule.cpp M Source/WebCore/css/parser/CSSParser.cpp M Source/WebCore/css/parser/CSSParser.h M Source/WebCore/css/parser/CSSParserImpl.cpp M Source/WebCore/css/parser/CSSParserImpl.h M Source/WebCore/css/parser/CSSPropertyParserConsumer+Animations.cpp M Source/WebCore/css/parser/CSSPropertyParserConsumer+Animations.h M Source/WebCore/css/parser/CSSPropertyParserConsumer+Timeline.cpp M Source/WebCore/css/parser/CSSPropertyParserConsumer+Timeline.h M Source/WebCore/style/StyleResolver.cpp M Source/WebCore/style/StyleResolver.h Log Message: ----------- [scroll-animations] allow timeline ranges to be used when specifying keyframes https://bugs.webkit.org/show_bug.cgi?id=286920 Reviewed by Sam Weinig. The Scroll-driven Animations specification extends the definition of keyframes to allow for timeline ranges to be used on top of the existing percentage values. This means that for view timelines, authors can specify specific points within that timeline's range as keyframe offsets. For instance, here is an animation which would animate the opacity from 0 to 1 as the target element enters the visible range within its scrolling container, and then from 1 to 0 as it leaves it: ``` @keyframes my-anim { cover 0% { opacity: 0 } contain 0% { opacity: 1 } contain 100% { opacity: 1 } cover 100% { opacity: 0 } } ``` This is a pretty big change since until now, keyframe offsets were either implicit omitted values or explicit numeric values that could synchronously be computed to a finite value. With timeline ranges, computed offsets will be NaN until we have viable metrics for the view timeline's source and subject and will dynamically update as the view timeline's metrics and scroll offset changes. To that end, we introduce the notion of a `specifiedOffset` on `BlendingKeyframe` and make the existing `offset` be the computed value. Specified offsets are represented via the new `BlendingKeyframe::Offset` struct which encompasses the range name (including `Omitted` and `Normal` values) and the numeric value. This provides a way to determine whether a specified value was implicit or explicit. As for computed values, they are all NaN by default and resolved using the new `BlendingKeyframes::updatedComputedOffsets()` method which will let the caller provide a callback to convert each specified offset, leaving the mapping from the view timeline range to keyframe effects. * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-with-document-timeline-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/contain-alignment-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/get-keyframes-with-timeline-offset-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/timeline-offset-in-keyframe-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/view-timeline-source.tentative-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative-expected.txt: * Source/WebCore/animation/AnimationEffect.cpp: (WebCore::AnimationEffect::animationProgressBasedTimelineSourceDidChangeMetrics): * Source/WebCore/animation/AnimationEffect.h: * Source/WebCore/animation/BlendingKeyframes.cpp: (WebCore::BlendingKeyframes::insert): (WebCore::BlendingKeyframes::copyKeyframes): (WebCore::zeroPercentKeyframe): (WebCore::hundredPercentKeyframe): (WebCore::BlendingKeyframes::fillImplicitKeyframes): (WebCore::BlendingKeyframes::analyzeKeyframe): (WebCore::BlendingKeyframes::updatedComputedOffsets): (WebCore::BlendingKeyframe::BlendingKeyframe): (WebCore::BlendingKeyframe::usesRangeOffset const): * Source/WebCore/animation/BlendingKeyframes.h: (WebCore::BlendingKeyframes::hasKeyframeNotUsingRangeOffset const): * Source/WebCore/animation/KeyframeEffect.cpp: (WebCore::rangeStringToSingleTimelineRangeName): (WebCore::isTimelineRangeOffsetValid): (WebCore::rangeStringFromSingleTimelineRangeName): (WebCore::doubleOrTimelineRangeOffsetFromString): (WebCore::validateKeyframeOffset): (WebCore::computedOffset): (WebCore::computeMissingKeyframeOffsets): (WebCore::processKeyframeLikeObject): (WebCore::processIterableKeyframes): (WebCore::processPropertyIndexedKeyframes): (WebCore::timelineRangeOffsetFromSpecifiedOffset): (WebCore::KeyframeEffect::getKeyframes): (WebCore::KeyframeEffect::processKeyframes): (WebCore::specifiedOffsetForParsedKeyframe): (WebCore::KeyframeEffect::updateBlendingKeyframes): (WebCore::KeyframeEffect::setBlendingKeyframes): (WebCore::KeyframeEffect::computeCSSAnimationBlendingKeyframes): (WebCore::KeyframeEffect::animationTimelineDidChange): (WebCore::KeyframeEffect::setAnimatedPropertiesInStyle): (WebCore::KeyframeEffect::animationDidTick): (WebCore::KeyframeEffect::applyPendingAcceleratedActionsOrUpdateTimingProperties): (WebCore::KeyframeEffect::computeHasImplicitKeyframeForAcceleratedProperty): (WebCore::KeyframeEffect::activeViewTimeline): (WebCore::KeyframeEffect::animationProgressBasedTimelineSourceDidChangeMetrics): (WebCore::KeyframeEffect::updateComputedKeyframeOffsetsIfNeeded): * Source/WebCore/animation/KeyframeEffect.h: * Source/WebCore/animation/KeyframeEffect.idl: * Source/WebCore/animation/KeyframeInterpolation.cpp: (WebCore::KeyframeInterpolation::interpolationKeyframes const): * Source/WebCore/animation/KeyframeInterpolation.h: (WebCore::KeyframeInterpolation::Keyframe::hasResolvedOffset const): * Source/WebCore/animation/ScrollTimeline.cpp: (WebCore::ScrollTimeline::create): * Source/WebCore/animation/ViewTimeline.cpp: (WebCore::ViewTimeline::create): (WebCore::ViewTimeline::intervalForTimelineRangeName const): (WebCore::ViewTimeline::mapOffsetToTimelineRange const): (WebCore::ViewTimeline::offsetIntervalForTimelineRangeName const): (WebCore::ViewTimeline::offsetIntervalForAttachmentRange const): (WebCore::ViewTimeline::intervalForAttachmentRange const): * Source/WebCore/animation/ViewTimeline.h: * Source/WebCore/animation/WebAnimation.cpp: (WebCore::WebAnimation::progressBasedTimelineSourceDidChangeMetrics): * Source/WebCore/css/CSSKeyframeRule.cpp: (WebCore::StyleRuleKeyframe::Key::writeToString const): (WebCore::StyleRuleKeyframe::StyleRuleKeyframe): (WebCore::StyleRuleKeyframe::create): (WebCore::StyleRuleKeyframe::keyText const): (WebCore::StyleRuleKeyframe::setKeyText): * Source/WebCore/css/CSSKeyframeRule.h: * Source/WebCore/css/CSSKeyframesRule.cpp: (WebCore::StyleRuleKeyframes::findKeyframeIndex const): * Source/WebCore/css/parser/CSSParser.cpp: (WebCore::CSSParser::parseKeyframeKeyList): * Source/WebCore/css/parser/CSSParser.h: * Source/WebCore/css/parser/CSSParserImpl.cpp: (WebCore::CSSParserImpl::parseKeyframeKeyList): (WebCore::CSSParserImpl::consumeKeyframeStyleRule): (WebCore::CSSParserImpl::consumeKeyframeKeyList): Deleted. * Source/WebCore/css/parser/CSSParserImpl.h: * Source/WebCore/css/parser/CSSPropertyParserConsumer+Animations.cpp: (WebCore::CSSPropertyParserHelpers::consumeKeyframeKeyList): * Source/WebCore/css/parser/CSSPropertyParserConsumer+Animations.h: * Source/WebCore/css/parser/CSSPropertyParserConsumer+Timeline.cpp: (WebCore::CSSPropertyParserHelpers::isAnimationRangeKeyword): * Source/WebCore/css/parser/CSSPropertyParserConsumer+Timeline.h: * Source/WebCore/style/StyleResolver.cpp: (WTF::StyleRuleKeyframeKeyHash::hash): (WTF::StyleRuleKeyframeKeyHash::equal): (WTF::HashTraits<WebCore::StyleRuleKeyframe::Key>::emptyValue): (WTF::HashTraits<WebCore::StyleRuleKeyframe::Key>::isEmptyValue): (WTF::HashTraits<WebCore::StyleRuleKeyframe::Key>::constructDeletedValue): (WTF::HashTraits<WebCore::StyleRuleKeyframe::Key>::isDeletedValue): (WebCore::Style::Resolver::keyframeRulesForName const): (WebCore::Style::Resolver::keyframeStylesForAnimation): * Source/WebCore/style/StyleResolver.h: Canonical link: https://commits.webkit.org/289948@main To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications _______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes