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

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

Issue 2831273002: Split active animation interpolation storage between standard and custom properties (Closed)
Patch Set: Review Review changes Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 snapshot(new_animation.effect.Get()); 426 snapshot(new_animation.effect.Get());
427 427
428 for (const auto& updated_animation : update.AnimationsWithUpdates()) 428 for (const auto& updated_animation : update.AnimationsWithUpdates())
429 snapshot(updated_animation.effect.Get()); 429 snapshot(updated_animation.effect.Get());
430 430
431 for (const auto& new_transition : update.NewTransitions()) 431 for (const auto& new_transition : update.NewTransitions())
432 snapshot(new_transition.value.effect.Get()); 432 snapshot(new_transition.value.effect.Get());
433 } 433 }
434 434
435 void CSSAnimations::MaybeApplyPendingUpdate(Element* element) { 435 void CSSAnimations::MaybeApplyPendingUpdate(Element* element) {
436 previous_active_interpolations_for_animations_.clear(); 436 previous_active_interpolations_for_custom_animations_.clear();
437 previous_active_interpolations_for_standard_animations_.clear();
437 if (pending_update_.IsEmpty()) 438 if (pending_update_.IsEmpty())
438 return; 439 return;
439 440
440 previous_active_interpolations_for_animations_.swap( 441 previous_active_interpolations_for_custom_animations_.swap(
441 pending_update_.ActiveInterpolationsForAnimations()); 442 pending_update_.ActiveInterpolationsForCustomAnimations());
443 previous_active_interpolations_for_standard_animations_.swap(
444 pending_update_.ActiveInterpolationsForStandardAnimations());
442 445
443 // FIXME: cancelling, pausing, unpausing animations all query 446 // FIXME: cancelling, pausing, unpausing animations all query
444 // compositingState, which is not necessarily up to date here 447 // compositingState, which is not necessarily up to date here
445 // since we call this from recalc style. 448 // since we call this from recalc style.
446 // https://code.google.com/p/chromium/issues/detail?id=339847 449 // https://code.google.com/p/chromium/issues/detail?id=339847
447 DisableCompositingQueryAsserts disabler; 450 DisableCompositingQueryAsserts disabler;
448 451
449 for (size_t paused_index : 452 for (size_t paused_index :
450 pending_update_.AnimationIndicesWithPauseToggled()) { 453 pending_update_.AnimationIndicesWithPauseToggled()) {
451 Animation& animation = *running_animations_[paused_index]->animation; 454 Animation& animation = *running_animations_[paused_index]->animation;
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 632
630 void CSSAnimations::CalculateTransitionUpdateForProperty( 633 void CSSAnimations::CalculateTransitionUpdateForProperty(
631 TransitionUpdateState& state, 634 TransitionUpdateState& state,
632 const PropertyHandle& property, 635 const PropertyHandle& property,
633 size_t transition_index) { 636 size_t transition_index) {
634 state.listed_properties.insert(property); 637 state.listed_properties.insert(property);
635 638
636 // FIXME: We should transition if an !important property changes even when an 639 // FIXME: We should transition if an !important property changes even when an
637 // animation is running, but this is a bit hard to do with the current 640 // animation is running, but this is a bit hard to do with the current
638 // applyMatchedProperties system. 641 // applyMatchedProperties system.
639 if (state.update.ActiveInterpolationsForAnimations().Contains(property) || 642 if (property.IsCSSCustomProperty()) {
640 (state.animating_element->GetElementAnimations() && 643 if (state.update.ActiveInterpolationsForCustomAnimations().Contains(
641 state.animating_element->GetElementAnimations() 644 property) ||
642 ->CssAnimations() 645 (state.animating_element->GetElementAnimations() &&
643 .previous_active_interpolations_for_animations_.Contains( 646 state.animating_element->GetElementAnimations()
644 property))) { 647 ->CssAnimations()
648 .previous_active_interpolations_for_custom_animations_.Contains(
649 property))) {
650 return;
651 }
652 } else if (state.update.ActiveInterpolationsForStandardAnimations().Contains(
653 property) ||
654 (state.animating_element->GetElementAnimations() &&
655 state.animating_element->GetElementAnimations()
656 ->CssAnimations()
657 .previous_active_interpolations_for_standard_animations_
658 .Contains(property))) {
645 return; 659 return;
646 } 660 }
647 661
648 RefPtr<AnimatableValue> to = nullptr; 662 RefPtr<AnimatableValue> to = nullptr;
649 const RunningTransition* interrupted_transition = nullptr; 663 const RunningTransition* interrupted_transition = nullptr;
650 if (state.active_transitions) { 664 if (state.active_transitions) {
651 TransitionMap::const_iterator active_transition_iter = 665 TransitionMap::const_iterator active_transition_iter =
652 state.active_transitions->find(property); 666 state.active_transitions->find(property);
653 if (active_transition_iter != state.active_transitions->end()) { 667 if (active_transition_iter != state.active_transitions->end()) {
654 const RunningTransition* running_transition = 668 const RunningTransition* running_transition =
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 for (const auto& entry : transitions_) { 942 for (const auto& entry : transitions_) {
929 entry.value.animation->cancel(); 943 entry.value.animation->cancel();
930 entry.value.animation->Update(kTimingUpdateOnDemand); 944 entry.value.animation->Update(kTimingUpdateOnDemand);
931 } 945 }
932 946
933 running_animations_.clear(); 947 running_animations_.clear();
934 transitions_.clear(); 948 transitions_.clear();
935 ClearPendingUpdate(); 949 ClearPendingUpdate();
936 } 950 }
937 951
952 static bool IsCustomPropertyHandle(const PropertyHandle& property) {
953 return property.IsCSSCustomProperty();
954 }
955
938 // TODO(alancutter): CSS properties and presentation attributes may have 956 // TODO(alancutter): CSS properties and presentation attributes may have
939 // identical effects. By grouping them in the same set we introduce a bug where 957 // identical effects. By grouping them in the same set we introduce a bug where
940 // arbitrary hash iteration will determine the order the apply in and thus which 958 // arbitrary hash iteration will determine the order the apply in and thus which
941 // one "wins". We should be more deliberate about the order of application in 959 // one "wins". We should be more deliberate about the order of application in
942 // the case of effect collisions. 960 // the case of effect collisions.
943 // Example: Both 'color' and 'svg-color' set the color on ComputedStyle but are 961 // Example: Both 'color' and 'svg-color' set the color on ComputedStyle but are
944 // considered distinct properties in the ActiveInterpolationsMap. 962 // considered distinct properties in the ActiveInterpolationsMap.
945 static bool IsStylePropertyHandle(const PropertyHandle& property_handle) { 963 static bool IsStandardPropertyHandle(const PropertyHandle& property) {
946 return property_handle.IsCSSProperty() || 964 return (property.IsCSSProperty() && !property.IsCSSCustomProperty()) ||
947 property_handle.IsPresentationAttribute(); 965 property.IsPresentationAttribute();
966 }
967
968 static void AdoptActiveAnimationInterpolations(
969 EffectStack* effect_stack,
970 CSSAnimationUpdate& update,
971 const HeapVector<Member<const InertEffect>>* new_animations,
972 const HeapHashSet<Member<const Animation>>* suppressed_animations) {
973 ActiveInterpolationsMap custom_interpolations(
974 EffectStack::ActiveInterpolations(
975 effect_stack, new_animations, suppressed_animations,
976 KeyframeEffectReadOnly::kDefaultPriority, IsCustomPropertyHandle));
977 update.AdoptActiveInterpolationsForCustomAnimations(custom_interpolations);
978
979 ActiveInterpolationsMap standard_interpolations(
980 EffectStack::ActiveInterpolations(
981 effect_stack, new_animations, suppressed_animations,
982 KeyframeEffectReadOnly::kDefaultPriority, IsStandardPropertyHandle));
983 update.AdoptActiveInterpolationsForStandardAnimations(
984 standard_interpolations);
948 } 985 }
949 986
950 void CSSAnimations::CalculateAnimationActiveInterpolations( 987 void CSSAnimations::CalculateAnimationActiveInterpolations(
951 CSSAnimationUpdate& update, 988 CSSAnimationUpdate& update,
952 const Element* animating_element) { 989 const Element* animating_element) {
953 ElementAnimations* element_animations = 990 ElementAnimations* element_animations =
954 animating_element ? animating_element->GetElementAnimations() : nullptr; 991 animating_element ? animating_element->GetElementAnimations() : nullptr;
955 EffectStack* effect_stack = 992 EffectStack* effect_stack =
956 element_animations ? &element_animations->GetEffectStack() : nullptr; 993 element_animations ? &element_animations->GetEffectStack() : nullptr;
957 994
958 if (update.NewAnimations().IsEmpty() && 995 if (update.NewAnimations().IsEmpty() &&
959 update.SuppressedAnimations().IsEmpty()) { 996 update.SuppressedAnimations().IsEmpty()) {
960 ActiveInterpolationsMap active_interpolations_for_animations( 997 AdoptActiveAnimationInterpolations(effect_stack, update, nullptr, nullptr);
961 EffectStack::ActiveInterpolations(
962 effect_stack, nullptr, nullptr,
963 KeyframeEffectReadOnly::kDefaultPriority, IsStylePropertyHandle));
964 update.AdoptActiveInterpolationsForAnimations(
965 active_interpolations_for_animations);
966 return; 998 return;
967 } 999 }
968 1000
969 HeapVector<Member<const InertEffect>> new_effects; 1001 HeapVector<Member<const InertEffect>> new_effects;
970 for (const auto& new_animation : update.NewAnimations()) 1002 for (const auto& new_animation : update.NewAnimations())
971 new_effects.push_back(new_animation.effect); 1003 new_effects.push_back(new_animation.effect);
972 1004
973 // Animations with updates use a temporary InertEffect for the current frame. 1005 // Animations with updates use a temporary InertEffect for the current frame.
974 for (const auto& updated_animation : update.AnimationsWithUpdates()) 1006 for (const auto& updated_animation : update.AnimationsWithUpdates())
975 new_effects.push_back(updated_animation.effect); 1007 new_effects.push_back(updated_animation.effect);
976 1008
977 ActiveInterpolationsMap active_interpolations_for_animations( 1009 AdoptActiveAnimationInterpolations(effect_stack, update, &new_effects,
978 EffectStack::ActiveInterpolations( 1010 &update.SuppressedAnimations());
979 effect_stack, &new_effects, &update.SuppressedAnimations(),
980 KeyframeEffectReadOnly::kDefaultPriority, IsStylePropertyHandle));
981 update.AdoptActiveInterpolationsForAnimations(
982 active_interpolations_for_animations);
983 } 1011 }
984 1012
985 static bool IsCustomStylePropertyHandle(const PropertyHandle& property) { 1013 static EffectStack::PropertyHandleFilter PropertyFilter(
986 return property.IsCSSCustomProperty();
987 }
988
989 static bool IsStandardStylePropertyHandle(const PropertyHandle& property) {
990 return IsStylePropertyHandle(property) && !property.IsCSSCustomProperty();
991 }
992
993 static EffectStack::PropertyHandleFilter StylePropertyFilter(
994 CSSAnimations::PropertyPass property_pass) { 1014 CSSAnimations::PropertyPass property_pass) {
995 if (property_pass == CSSAnimations::PropertyPass::kCustom) { 1015 if (property_pass == CSSAnimations::PropertyPass::kCustom) {
996 return IsCustomStylePropertyHandle; 1016 return IsCustomPropertyHandle;
997 } 1017 }
998 DCHECK_EQ(property_pass, CSSAnimations::PropertyPass::kStandard); 1018 DCHECK_EQ(property_pass, CSSAnimations::PropertyPass::kStandard);
999 return IsStandardStylePropertyHandle; 1019 return IsStandardPropertyHandle;
1000 } 1020 }
1001 1021
1002 void CSSAnimations::CalculateTransitionActiveInterpolations( 1022 void CSSAnimations::CalculateTransitionActiveInterpolations(
1003 CSSAnimationUpdate& update, 1023 CSSAnimationUpdate& update,
1004 PropertyPass property_pass, 1024 PropertyPass property_pass,
1005 const Element* animating_element) { 1025 const Element* animating_element) {
1006 ElementAnimations* element_animations = 1026 ElementAnimations* element_animations =
1007 animating_element ? animating_element->GetElementAnimations() : nullptr; 1027 animating_element ? animating_element->GetElementAnimations() : nullptr;
1008 EffectStack* effect_stack = 1028 EffectStack* effect_stack =
1009 element_animations ? &element_animations->GetEffectStack() : nullptr; 1029 element_animations ? &element_animations->GetEffectStack() : nullptr;
1010 1030
1011 ActiveInterpolationsMap active_interpolations_for_transitions; 1031 ActiveInterpolationsMap active_interpolations_for_transitions;
1012 if (update.NewTransitions().IsEmpty() && 1032 if (update.NewTransitions().IsEmpty() &&
1013 update.CancelledTransitions().IsEmpty()) { 1033 update.CancelledTransitions().IsEmpty()) {
1014 active_interpolations_for_transitions = EffectStack::ActiveInterpolations( 1034 active_interpolations_for_transitions = EffectStack::ActiveInterpolations(
1015 effect_stack, nullptr, nullptr, 1035 effect_stack, nullptr, nullptr,
1016 KeyframeEffectReadOnly::kTransitionPriority, 1036 KeyframeEffectReadOnly::kTransitionPriority,
1017 StylePropertyFilter(property_pass)); 1037 PropertyFilter(property_pass));
1018 } else { 1038 } else {
1019 HeapVector<Member<const InertEffect>> new_transitions; 1039 HeapVector<Member<const InertEffect>> new_transitions;
1020 for (const auto& entry : update.NewTransitions()) 1040 for (const auto& entry : update.NewTransitions())
1021 new_transitions.push_back(entry.value.effect.Get()); 1041 new_transitions.push_back(entry.value.effect.Get());
1022 1042
1023 HeapHashSet<Member<const Animation>> cancelled_animations; 1043 HeapHashSet<Member<const Animation>> cancelled_animations;
1024 if (!update.CancelledTransitions().IsEmpty()) { 1044 if (!update.CancelledTransitions().IsEmpty()) {
1025 DCHECK(element_animations); 1045 DCHECK(element_animations);
1026 const TransitionMap& transition_map = 1046 const TransitionMap& transition_map =
1027 element_animations->CssAnimations().transitions_; 1047 element_animations->CssAnimations().transitions_;
1028 for (const PropertyHandle& property : update.CancelledTransitions()) { 1048 for (const PropertyHandle& property : update.CancelledTransitions()) {
1029 DCHECK(transition_map.Contains(property)); 1049 DCHECK(transition_map.Contains(property));
1030 cancelled_animations.insert( 1050 cancelled_animations.insert(
1031 transition_map.at(property).animation.Get()); 1051 transition_map.at(property).animation.Get());
1032 } 1052 }
1033 } 1053 }
1034 1054
1035 active_interpolations_for_transitions = EffectStack::ActiveInterpolations( 1055 active_interpolations_for_transitions = EffectStack::ActiveInterpolations(
1036 effect_stack, &new_transitions, &cancelled_animations, 1056 effect_stack, &new_transitions, &cancelled_animations,
1037 KeyframeEffectReadOnly::kTransitionPriority, 1057 KeyframeEffectReadOnly::kTransitionPriority,
1038 StylePropertyFilter(property_pass)); 1058 PropertyFilter(property_pass));
1039 } 1059 }
1040 1060
1061 const ActiveInterpolationsMap& animations =
1062 property_pass == PropertyPass::kCustom
1063 ? update.ActiveInterpolationsForCustomAnimations()
1064 : update.ActiveInterpolationsForStandardAnimations();
1041 // Properties being animated by animations don't get values from transitions 1065 // Properties being animated by animations don't get values from transitions
1042 // applied. 1066 // applied.
1043 if (!update.ActiveInterpolationsForAnimations().IsEmpty() && 1067 if (!animations.IsEmpty() &&
1044 !active_interpolations_for_transitions.IsEmpty()) { 1068 !active_interpolations_for_transitions.IsEmpty()) {
1045 for (const auto& entry : update.ActiveInterpolationsForAnimations()) 1069 for (const auto& entry : animations)
1046 active_interpolations_for_transitions.erase(entry.key); 1070 active_interpolations_for_transitions.erase(entry.key);
1047 } 1071 }
1048 1072
1049 if (property_pass == PropertyPass::kCustom) { 1073 if (property_pass == PropertyPass::kCustom) {
1050 update.AdoptActiveInterpolationsForCustomTransitions( 1074 update.AdoptActiveInterpolationsForCustomTransitions(
1051 active_interpolations_for_transitions); 1075 active_interpolations_for_transitions);
1052 } else { 1076 } else {
1053 DCHECK_EQ(property_pass, PropertyPass::kStandard); 1077 DCHECK_EQ(property_pass, PropertyPass::kStandard);
1054 update.AdoptActiveInterpolationsForStandardTransitions( 1078 update.AdoptActiveInterpolationsForStandardTransitions(
1055 active_interpolations_for_transitions); 1079 active_interpolations_for_transitions);
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 // and from their shadow sub-trees if they are shadow hosts. 1235 // and from their shadow sub-trees if they are shadow hosts.
1212 if (element.GetTreeScope() == tree_scope) 1236 if (element.GetTreeScope() == tree_scope)
1213 return true; 1237 return true;
1214 if (!IsShadowHost(element)) 1238 if (!IsShadowHost(element))
1215 return false; 1239 return false;
1216 if (tree_scope.RootNode() == tree_scope.GetDocument()) 1240 if (tree_scope.RootNode() == tree_scope.GetDocument())
1217 return false; 1241 return false;
1218 return ToShadowRoot(tree_scope.RootNode()).host() == element; 1242 return ToShadowRoot(tree_scope.RootNode()).host() == element;
1219 } 1243 }
1220 1244
1221 bool CSSAnimations::IsCustomPropertyHandle(const PropertyHandle& property) {
1222 return property.IsCSSProperty() &&
1223 property.CssProperty() == CSSPropertyVariable;
1224 }
1225
1226 bool CSSAnimations::IsAnimatingCustomProperties( 1245 bool CSSAnimations::IsAnimatingCustomProperties(
1227 const ElementAnimations* element_animations) { 1246 const ElementAnimations* element_animations) {
1228 return element_animations && 1247 return element_animations &&
1229 element_animations->GetEffectStack().AffectsProperties( 1248 element_animations->GetEffectStack().AffectsProperties(
1230 IsCustomPropertyHandle); 1249 IsCustomPropertyHandle);
1231 } 1250 }
1232 1251
1233 DEFINE_TRACE(CSSAnimations) { 1252 DEFINE_TRACE(CSSAnimations) {
1234 visitor->Trace(transitions_); 1253 visitor->Trace(transitions_);
1235 visitor->Trace(pending_update_); 1254 visitor->Trace(pending_update_);
1236 visitor->Trace(running_animations_); 1255 visitor->Trace(running_animations_);
1237 } 1256 }
1238 1257
1239 } // namespace blink 1258 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698