Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Unified Diff: third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp

Issue 2730683002: Add CSS Transition support to registered custom properties (Closed)
Patch Set: Rebased Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
diff --git a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
index e2e9d25d658720769c4dae7281cd1a32930e06c5..81af391596abb2b08e3f7f46a18d0e41814ed5ec 100644
--- a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
+++ b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
@@ -50,6 +50,8 @@
#include "core/css/CSSPropertyEquality.h"
#include "core/css/CSSPropertyMetadata.h"
#include "core/css/CSSValueList.h"
+#include "core/css/PropertyRegistry.h"
+#include "core/css/parser/CSSVariableParser.h"
#include "core/css/resolver/CSSToStyleMap.h"
#include "core/css/resolver/StyleResolver.h"
#include "core/dom/Element.h"
@@ -616,7 +618,7 @@ void CSSAnimations::calculateTransitionUpdateForProperty(
TransitionUpdateState& state,
const PropertyHandle& property,
size_t transitionIndex) {
- state.listedProperties.set(property.cssProperty() - firstCSSProperty);
+ state.listedProperties.insert(property);
// FIXME: We should transition if an !important property changes even when an
// animation is running, but this is a bit hard to do with the current
@@ -651,8 +653,17 @@ void CSSAnimations::calculateTransitionUpdateForProperty(
}
}
- if (CSSPropertyEquality::propertiesEqual(property.cssProperty(),
- state.oldStyle, state.style)) {
+ const PropertyRegistry* registry =
+ state.animatingElement->document().propertyRegistry();
+
+ if (property.isCSSCustomProperty()) {
+ if (!registry || !registry->registration(property.customPropertyName()) ||
+ CSSPropertyEquality::registeredCustomPropertiesEqual(
+ property.customPropertyName(), state.oldStyle, state.style)) {
+ return;
+ }
+ } else if (CSSPropertyEquality::propertiesEqual(
+ property.cssProperty(), state.oldStyle, state.style)) {
return;
}
@@ -663,7 +674,7 @@ void CSSAnimations::calculateTransitionUpdateForProperty(
// TODO(alancutter): Support transitions on registered custom properties and
// give the map a PropertyRegistry.
- CSSInterpolationTypesMap map(nullptr);
+ CSSInterpolationTypesMap map(registry);
InterpolationEnvironment oldEnvironment(map, state.oldStyle);
InterpolationEnvironment newEnvironment(map, state.style);
InterpolationValue start = nullptr;
@@ -774,6 +785,23 @@ void CSSAnimations::calculateTransitionUpdateForProperty(
!state.animatingElement->elementAnimations()->isAnimationStyleChange());
}
+void CSSAnimations::calculateTransitionUpdateForCustomProperty(
+ TransitionUpdateState& state,
+ const CSSTransitionData::TransitionProperty& transitionProperty,
+ size_t transitionIndex) {
+ if (transitionProperty.propertyType !=
+ CSSTransitionData::TransitionUnknownProperty) {
+ return;
+ }
+ if (!CSSVariableParser::isValidVariableName(
+ transitionProperty.propertyString)) {
+ return;
+ }
+ calculateTransitionUpdateForProperty(
+ state, PropertyHandle(transitionProperty.propertyString),
+ transitionIndex);
+}
+
void CSSAnimations::calculateTransitionUpdateForStandardProperty(
TransitionUpdateState& state,
const CSSTransitionData::TransitionProperty& transitionProperty,
@@ -807,6 +835,7 @@ void CSSAnimations::calculateTransitionUpdateForStandardProperty(
}
void CSSAnimations::calculateTransitionUpdate(CSSAnimationUpdate& update,
+ PropertyPass propertyPass,
const Element* animatingElement,
const ComputedStyle& style) {
if (!animatingElement)
@@ -824,7 +853,7 @@ void CSSAnimations::calculateTransitionUpdate(CSSAnimationUpdate& update,
const bool animationStyleRecalc =
elementAnimations && elementAnimations->isAnimationStyleChange();
- std::bitset<numCSSProperties> listedProperties;
+ HashSet<PropertyHandle> listedProperties;
bool anyTransitionHadTransitionAll = false;
const LayoutObject* layoutObject = animatingElement->layoutObject();
if (!animationStyleRecalc && style.display() != EDisplay::None &&
@@ -842,26 +871,31 @@ void CSSAnimations::calculateTransitionUpdate(CSSAnimationUpdate& update,
if (transitionProperty.unresolvedProperty == CSSPropertyAll) {
anyTransitionHadTransitionAll = true;
}
- calculateTransitionUpdateForStandardProperty(state, transitionProperty,
+ if (propertyPass == PropertyPass::Custom) {
+ calculateTransitionUpdateForCustomProperty(state, transitionProperty,
transitionIndex);
+ } else {
+ DCHECK_EQ(propertyPass, PropertyPass::Standard);
+ calculateTransitionUpdateForStandardProperty(state, transitionProperty,
+ transitionIndex);
+ }
}
}
if (activeTransitions) {
for (const auto& entry : *activeTransitions) {
const PropertyHandle& property = entry.key;
- // TODO(alancutter): Handle transitions on custom properties.
- DCHECK(!property.isCSSCustomProperty());
- CSSPropertyID id = property.cssProperty();
if (!anyTransitionHadTransitionAll && !animationStyleRecalc &&
- !listedProperties.test(id - firstCSSProperty)) {
+ !listedProperties.contains(property)) {
update.cancelTransition(property);
} else if (entry.value.animation->finishedInternal()) {
update.finishTransition(property);
}
}
}
- calculateTransitionActiveInterpolations(update, animatingElement);
+
+ calculateTransitionActiveInterpolations(update, propertyPass,
+ animatingElement);
}
void CSSAnimations::cancel() {
@@ -927,8 +961,26 @@ void CSSAnimations::calculateAnimationActiveInterpolations(
activeInterpolationsForAnimations);
}
+static bool isCustomStylePropertyHandle(const PropertyHandle& property) {
+ return property.isCSSCustomProperty();
+}
+
+static bool isStandardStylePropertyHandle(const PropertyHandle& property) {
+ return isStylePropertyHandle(property) && !property.isCSSCustomProperty();
+}
+
+static EffectStack::PropertyHandleFilter stylePropertyFilter(
+ CSSAnimations::PropertyPass propertyPass) {
+ if (propertyPass == CSSAnimations::PropertyPass::Custom) {
+ return isCustomStylePropertyHandle;
+ }
+ DCHECK_EQ(propertyPass, CSSAnimations::PropertyPass::Standard);
+ return isStandardStylePropertyHandle;
+}
+
void CSSAnimations::calculateTransitionActiveInterpolations(
CSSAnimationUpdate& update,
+ PropertyPass propertyPass,
const Element* animatingElement) {
ElementAnimations* elementAnimations =
animatingElement ? animatingElement->elementAnimations() : nullptr;
@@ -940,7 +992,8 @@ void CSSAnimations::calculateTransitionActiveInterpolations(
update.cancelledTransitions().isEmpty()) {
activeInterpolationsForTransitions = EffectStack::activeInterpolations(
effectStack, nullptr, nullptr,
- KeyframeEffectReadOnly::TransitionPriority, isStylePropertyHandle);
+ KeyframeEffectReadOnly::TransitionPriority,
+ stylePropertyFilter(propertyPass));
} else {
HeapVector<Member<const InertEffect>> newTransitions;
for (const auto& entry : update.newTransitions())
@@ -959,7 +1012,8 @@ void CSSAnimations::calculateTransitionActiveInterpolations(
activeInterpolationsForTransitions = EffectStack::activeInterpolations(
effectStack, &newTransitions, &cancelledAnimations,
- KeyframeEffectReadOnly::TransitionPriority, isStylePropertyHandle);
+ KeyframeEffectReadOnly::TransitionPriority,
+ stylePropertyFilter(propertyPass));
}
// Properties being animated by animations don't get values from transitions
@@ -969,8 +1023,15 @@ void CSSAnimations::calculateTransitionActiveInterpolations(
for (const auto& entry : update.activeInterpolationsForAnimations())
activeInterpolationsForTransitions.erase(entry.key);
}
- update.adoptActiveInterpolationsForStandardTransitions(
- activeInterpolationsForTransitions);
+
+ if (propertyPass == PropertyPass::Custom) {
+ update.adoptActiveInterpolationsForCustomTransitions(
+ activeInterpolationsForTransitions);
+ } else {
+ DCHECK_EQ(propertyPass, PropertyPass::Standard);
+ update.adoptActiveInterpolationsForStandardTransitions(
+ activeInterpolationsForTransitions);
+ }
}
EventTarget* CSSAnimations::AnimationEventDelegate::eventTarget() const {

Powered by Google App Engine
This is Rietveld 408576698