| 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 75d8f29d3b6dbb1e5457ebc18654887571c8f331..205ac1c3e0fd6e3946974291f6b204b18844fcb3 100644
|
| --- a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
|
| +++ b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
|
| @@ -433,12 +433,15 @@ void CSSAnimations::SnapshotCompositorKeyframes(
|
| }
|
|
|
| void CSSAnimations::MaybeApplyPendingUpdate(Element* element) {
|
| - previous_active_interpolations_for_animations_.clear();
|
| + previous_active_interpolations_for_custom_animations_.clear();
|
| + previous_active_interpolations_for_standard_animations_.clear();
|
| if (pending_update_.IsEmpty())
|
| return;
|
|
|
| - previous_active_interpolations_for_animations_.swap(
|
| - pending_update_.ActiveInterpolationsForAnimations());
|
| + previous_active_interpolations_for_custom_animations_.swap(
|
| + pending_update_.ActiveInterpolationsForCustomAnimations());
|
| + previous_active_interpolations_for_standard_animations_.swap(
|
| + pending_update_.ActiveInterpolationsForStandardAnimations());
|
|
|
| // FIXME: cancelling, pausing, unpausing animations all query
|
| // compositingState, which is not necessarily up to date here
|
| @@ -636,12 +639,23 @@ void CSSAnimations::CalculateTransitionUpdateForProperty(
|
| // 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
|
| // applyMatchedProperties system.
|
| - if (state.update.ActiveInterpolationsForAnimations().Contains(property) ||
|
| - (state.animating_element->GetElementAnimations() &&
|
| - state.animating_element->GetElementAnimations()
|
| - ->CssAnimations()
|
| - .previous_active_interpolations_for_animations_.Contains(
|
| - property))) {
|
| + if (property.IsCSSCustomProperty()) {
|
| + if (state.update.ActiveInterpolationsForCustomAnimations().Contains(
|
| + property) ||
|
| + (state.animating_element->GetElementAnimations() &&
|
| + state.animating_element->GetElementAnimations()
|
| + ->CssAnimations()
|
| + .previous_active_interpolations_for_custom_animations_.Contains(
|
| + property))) {
|
| + return;
|
| + }
|
| + } else if (state.update.ActiveInterpolationsForStandardAnimations().Contains(
|
| + property) ||
|
| + (state.animating_element->GetElementAnimations() &&
|
| + state.animating_element->GetElementAnimations()
|
| + ->CssAnimations()
|
| + .previous_active_interpolations_for_standard_animations_
|
| + .Contains(property))) {
|
| return;
|
| }
|
|
|
| @@ -935,6 +949,10 @@ void CSSAnimations::Cancel() {
|
| ClearPendingUpdate();
|
| }
|
|
|
| +static bool IsCustomPropertyHandle(const PropertyHandle& property) {
|
| + return property.IsCSSCustomProperty();
|
| +}
|
| +
|
| // TODO(alancutter): CSS properties and presentation attributes may have
|
| // identical effects. By grouping them in the same set we introduce a bug where
|
| // arbitrary hash iteration will determine the order the apply in and thus which
|
| @@ -942,9 +960,28 @@ void CSSAnimations::Cancel() {
|
| // the case of effect collisions.
|
| // Example: Both 'color' and 'svg-color' set the color on ComputedStyle but are
|
| // considered distinct properties in the ActiveInterpolationsMap.
|
| -static bool IsStylePropertyHandle(const PropertyHandle& property_handle) {
|
| - return property_handle.IsCSSProperty() ||
|
| - property_handle.IsPresentationAttribute();
|
| +static bool IsStandardPropertyHandle(const PropertyHandle& property) {
|
| + return (property.IsCSSProperty() && !property.IsCSSCustomProperty()) ||
|
| + property.IsPresentationAttribute();
|
| +}
|
| +
|
| +static void AdoptActiveAnimationInterpolations(
|
| + EffectStack* effect_stack,
|
| + CSSAnimationUpdate& update,
|
| + const HeapVector<Member<const InertEffect>>* new_animations,
|
| + const HeapHashSet<Member<const Animation>>* suppressed_animations) {
|
| + ActiveInterpolationsMap custom_interpolations(
|
| + EffectStack::ActiveInterpolations(
|
| + effect_stack, new_animations, suppressed_animations,
|
| + KeyframeEffectReadOnly::kDefaultPriority, IsCustomPropertyHandle));
|
| + update.AdoptActiveInterpolationsForCustomAnimations(custom_interpolations);
|
| +
|
| + ActiveInterpolationsMap standard_interpolations(
|
| + EffectStack::ActiveInterpolations(
|
| + effect_stack, new_animations, suppressed_animations,
|
| + KeyframeEffectReadOnly::kDefaultPriority, IsStandardPropertyHandle));
|
| + update.AdoptActiveInterpolationsForStandardAnimations(
|
| + standard_interpolations);
|
| }
|
|
|
| void CSSAnimations::CalculateAnimationActiveInterpolations(
|
| @@ -957,12 +994,7 @@ void CSSAnimations::CalculateAnimationActiveInterpolations(
|
|
|
| if (update.NewAnimations().IsEmpty() &&
|
| update.SuppressedAnimations().IsEmpty()) {
|
| - ActiveInterpolationsMap active_interpolations_for_animations(
|
| - EffectStack::ActiveInterpolations(
|
| - effect_stack, nullptr, nullptr,
|
| - KeyframeEffectReadOnly::kDefaultPriority, IsStylePropertyHandle));
|
| - update.AdoptActiveInterpolationsForAnimations(
|
| - active_interpolations_for_animations);
|
| + AdoptActiveAnimationInterpolations(effect_stack, update, nullptr, nullptr);
|
| return;
|
| }
|
|
|
| @@ -974,29 +1006,17 @@ void CSSAnimations::CalculateAnimationActiveInterpolations(
|
| for (const auto& updated_animation : update.AnimationsWithUpdates())
|
| new_effects.push_back(updated_animation.effect);
|
|
|
| - ActiveInterpolationsMap active_interpolations_for_animations(
|
| - EffectStack::ActiveInterpolations(
|
| - effect_stack, &new_effects, &update.SuppressedAnimations(),
|
| - KeyframeEffectReadOnly::kDefaultPriority, IsStylePropertyHandle));
|
| - update.AdoptActiveInterpolationsForAnimations(
|
| - active_interpolations_for_animations);
|
| -}
|
| -
|
| -static bool IsCustomStylePropertyHandle(const PropertyHandle& property) {
|
| - return property.IsCSSCustomProperty();
|
| -}
|
| -
|
| -static bool IsStandardStylePropertyHandle(const PropertyHandle& property) {
|
| - return IsStylePropertyHandle(property) && !property.IsCSSCustomProperty();
|
| + AdoptActiveAnimationInterpolations(effect_stack, update, &new_effects,
|
| + &update.SuppressedAnimations());
|
| }
|
|
|
| -static EffectStack::PropertyHandleFilter StylePropertyFilter(
|
| +static EffectStack::PropertyHandleFilter PropertyFilter(
|
| CSSAnimations::PropertyPass property_pass) {
|
| if (property_pass == CSSAnimations::PropertyPass::kCustom) {
|
| - return IsCustomStylePropertyHandle;
|
| + return IsCustomPropertyHandle;
|
| }
|
| DCHECK_EQ(property_pass, CSSAnimations::PropertyPass::kStandard);
|
| - return IsStandardStylePropertyHandle;
|
| + return IsStandardPropertyHandle;
|
| }
|
|
|
| void CSSAnimations::CalculateTransitionActiveInterpolations(
|
| @@ -1014,7 +1034,7 @@ void CSSAnimations::CalculateTransitionActiveInterpolations(
|
| active_interpolations_for_transitions = EffectStack::ActiveInterpolations(
|
| effect_stack, nullptr, nullptr,
|
| KeyframeEffectReadOnly::kTransitionPriority,
|
| - StylePropertyFilter(property_pass));
|
| + PropertyFilter(property_pass));
|
| } else {
|
| HeapVector<Member<const InertEffect>> new_transitions;
|
| for (const auto& entry : update.NewTransitions())
|
| @@ -1035,14 +1055,18 @@ void CSSAnimations::CalculateTransitionActiveInterpolations(
|
| active_interpolations_for_transitions = EffectStack::ActiveInterpolations(
|
| effect_stack, &new_transitions, &cancelled_animations,
|
| KeyframeEffectReadOnly::kTransitionPriority,
|
| - StylePropertyFilter(property_pass));
|
| + PropertyFilter(property_pass));
|
| }
|
|
|
| + const ActiveInterpolationsMap& animations =
|
| + property_pass == PropertyPass::kCustom
|
| + ? update.ActiveInterpolationsForCustomAnimations()
|
| + : update.ActiveInterpolationsForStandardAnimations();
|
| // Properties being animated by animations don't get values from transitions
|
| // applied.
|
| - if (!update.ActiveInterpolationsForAnimations().IsEmpty() &&
|
| + if (!animations.IsEmpty() &&
|
| !active_interpolations_for_transitions.IsEmpty()) {
|
| - for (const auto& entry : update.ActiveInterpolationsForAnimations())
|
| + for (const auto& entry : animations)
|
| active_interpolations_for_transitions.erase(entry.key);
|
| }
|
|
|
| @@ -1218,11 +1242,6 @@ bool CSSAnimations::IsAffectedByKeyframesFromScope(
|
| return ToShadowRoot(tree_scope.RootNode()).host() == element;
|
| }
|
|
|
| -bool CSSAnimations::IsCustomPropertyHandle(const PropertyHandle& property) {
|
| - return property.IsCSSProperty() &&
|
| - property.CssProperty() == CSSPropertyVariable;
|
| -}
|
| -
|
| bool CSSAnimations::IsAnimatingCustomProperties(
|
| const ElementAnimations* element_animations) {
|
| return element_animations &&
|
|
|