diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/animation/compositor_animations_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/animation/compositor_animations_test.cc | 402 |
1 files changed, 254 insertions, 148 deletions
diff --git a/chromium/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/chromium/third_party/blink/renderer/core/animation/compositor_animations_test.cc index 88255ce836c..b3f0f03d056 100644 --- a/chromium/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/chromium/third_party/blink/renderer/core/animation/compositor_animations_test.cc @@ -38,6 +38,7 @@ #include "base/memory/scoped_refptr.h" #include "cc/animation/animation_host.h" #include "cc/layers/picture_layer.h" +#include "cc/trees/transform_node.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/web/web_settings.h" #include "third_party/blink/renderer/core/animation/animatable/animatable_double.h" @@ -67,7 +68,7 @@ #include "third_party/blink/renderer/platform/geometry/float_box.h" #include "third_party/blink/renderer/platform/geometry/int_size.h" #include "third_party/blink/renderer/platform/testing/histogram_tester.h" -#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" +#include "third_party/blink/renderer/platform/testing/paint_test_configurations.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" #include "third_party/blink/renderer/platform/testing/url_test_helpers.h" #include "third_party/blink/renderer/platform/transforms/transform_operations.h" @@ -78,7 +79,8 @@ namespace blink { using namespace css_test_helpers; -class AnimationCompositorAnimationsTest : public RenderingTest { +class AnimationCompositorAnimationsTest : public PaintTestConfigurations, + public RenderingTest { protected: scoped_refptr<TimingFunction> linear_timing_function_; scoped_refptr<TimingFunction> cubic_ease_timing_function_; @@ -169,6 +171,10 @@ class AnimationCompositorAnimationsTest : public RenderingTest { .Ok(); } + bool CheckCanStartElementOnCompositor(const Element& element) { + return CompositorAnimations::CheckCanStartElementOnCompositor(element).Ok(); + } + void GetAnimationOnCompositor( Timing& timing, StringKeyframeEffectModel& effect, @@ -241,9 +247,9 @@ class AnimationCompositorAnimationsTest : public RenderingTest { EffectModel::CompositeOperation op, double offset = 0) { String value = "0.1"; - if (id == CSSPropertyTransform) + if (id == CSSPropertyID::kTransform) value = "none"; // AnimatableTransform::Create(TransformOperations(), 1); - else if (id == CSSPropertyColor) + else if (id == CSSPropertyID::kColor) value = "red"; StringKeyframe* keyframe = CreateReplaceOpKeyframe(id, value, offset); @@ -268,7 +274,7 @@ class AnimationCompositorAnimationsTest : public RenderingTest { double offset = 1.0 / (values.size() - 1) * i; String value = String::Number(values[i]); frames->push_back( - CreateReplaceOpKeyframe(CSSPropertyOpacity, value, offset)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, value, offset)); } return frames; } @@ -452,8 +458,8 @@ class AnimationCompositorAnimationsTest : public RenderingTest { } void LoadTestData(const std::string& file_name) { - String testing_path = test::BlinkRootDir(); - testing_path.append("/renderer/core/animation/test_data/"); + String testing_path = + test::BlinkRootDir() + "/renderer/core/animation/test_data/"; WebURL url = url_test_helpers::RegisterMockedURLLoadFromBase( WebString::FromUTF8(base_url_), testing_path, WebString::FromUTF8(file_name)); @@ -506,77 +512,80 @@ class LayoutObjectProxy : public LayoutObject { // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- -TEST_F(AnimationCompositorAnimationsTest, +INSTANTIATE_PAINT_TEST_SUITE_P(AnimationCompositorAnimationsTest); + +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorKeyframeMultipleCSSProperties) { - StringKeyframe* keyframe_good_multiple = - CreateDefaultKeyframe(CSSPropertyOpacity, EffectModel::kCompositeReplace); + StringKeyframe* keyframe_good_multiple = CreateDefaultKeyframe( + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace); keyframe_good_multiple->SetCSSPropertyValue( - CSSPropertyTransform, "none", SecureContextMode::kInsecureContext, + CSSPropertyID::kTransform, "none", SecureContextMode::kInsecureContext, nullptr); EXPECT_TRUE(DuplicateSingleKeyframeAndTestIsCandidateOnResult( keyframe_good_multiple)); - StringKeyframe* keyframe_bad_multiple_id = - CreateDefaultKeyframe(CSSPropertyColor, EffectModel::kCompositeReplace); + StringKeyframe* keyframe_bad_multiple_id = CreateDefaultKeyframe( + CSSPropertyID::kColor, EffectModel::kCompositeReplace); keyframe_bad_multiple_id->SetCSSPropertyValue( - CSSPropertyOpacity, "0.1", SecureContextMode::kInsecureContext, nullptr); + CSSPropertyID::kOpacity, "0.1", SecureContextMode::kInsecureContext, + nullptr); EXPECT_FALSE(DuplicateSingleKeyframeAndTestIsCandidateOnResult( keyframe_bad_multiple_id)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, IsNotCandidateForCompositorAnimationTransformDependsOnBoxSize) { // Absolute transforms can be animated on the compositor. String transform = "translateX(2px) translateY(2px)"; StringKeyframe* good_keyframe = - CreateReplaceOpKeyframe(CSSPropertyTransform, transform); + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, transform); EXPECT_TRUE(DuplicateSingleKeyframeAndTestIsCandidateOnResult(good_keyframe)); // Transforms that rely on the box size, such as percent calculations, cannot // be animated on the compositor (as the box size may change). String transform2 = "translateX(50%) translateY(2px)"; StringKeyframe* bad_keyframe = - CreateReplaceOpKeyframe(CSSPropertyTransform, transform2); + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, transform2); EXPECT_FALSE(DuplicateSingleKeyframeAndTestIsCandidateOnResult(bad_keyframe)); // Similarly, calc transforms cannot be animated on the compositor. String transform3 = "translateX(calc(100% + (0.5 * 100px)))"; StringKeyframe* bad_keyframe2 = - CreateReplaceOpKeyframe(CSSPropertyTransform, transform3); + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, transform3); EXPECT_FALSE( DuplicateSingleKeyframeAndTestIsCandidateOnResult(bad_keyframe2)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorKeyframeEffectModel) { StringKeyframeVector frames_same; frames_same.push_back(CreateDefaultKeyframe( - CSSPropertyColor, EffectModel::kCompositeReplace, 0.0)); + CSSPropertyID::kColor, EffectModel::kCompositeReplace, 0.0)); frames_same.push_back(CreateDefaultKeyframe( - CSSPropertyColor, EffectModel::kCompositeReplace, 1.0)); + CSSPropertyID::kColor, EffectModel::kCompositeReplace, 1.0)); EXPECT_FALSE(CanStartEffectOnCompositor( timing_, *StringKeyframeEffectModel::Create(frames_same))); StringKeyframeVector frames_mixed_properties; StringKeyframe* keyframe = StringKeyframe::Create(); keyframe->SetOffset(0); - keyframe->SetCSSPropertyValue(CSSPropertyColor, "red", + keyframe->SetCSSPropertyValue(CSSPropertyID::kColor, "red", SecureContextMode::kInsecureContext, nullptr); - keyframe->SetCSSPropertyValue(CSSPropertyOpacity, "0", + keyframe->SetCSSPropertyValue(CSSPropertyID::kOpacity, "0", SecureContextMode::kInsecureContext, nullptr); frames_mixed_properties.push_back(keyframe); keyframe = StringKeyframe::Create(); keyframe->SetOffset(1); - keyframe->SetCSSPropertyValue(CSSPropertyColor, "green", + keyframe->SetCSSPropertyValue(CSSPropertyID::kColor, "green", SecureContextMode::kInsecureContext, nullptr); - keyframe->SetCSSPropertyValue(CSSPropertyOpacity, "1", + keyframe->SetCSSPropertyValue(CSSPropertyID::kOpacity, "1", SecureContextMode::kInsecureContext, nullptr); frames_mixed_properties.push_back(keyframe); EXPECT_FALSE(CanStartEffectOnCompositor( timing_, *StringKeyframeEffectModel::Create(frames_mixed_properties))); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorCustomCssProperty) { ScopedOffMainThreadCSSPaintForTest off_main_thread_css_paint(true); RegisterProperty(GetDocument(), "--foo", "<number>", "0", false); @@ -605,7 +614,7 @@ TEST_F(AnimationCompositorAnimationsTest, EXPECT_FALSE(DuplicateSingleKeyframeAndTestIsCandidateOnResult(keyframe)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, ConvertTimingForCompositorStartDelay) { timing_.iteration_duration = AnimationTimeDelta::FromSecondsD(20); @@ -618,13 +627,13 @@ TEST_F(AnimationCompositorAnimationsTest, EXPECT_DOUBLE_EQ(2.0, compositor_timing_.scaled_time_offset); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationStart) { timing_.iteration_start = 2.2; EXPECT_TRUE(ConvertTimingForCompositor(timing_, compositor_timing_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationCount) { timing_.iteration_count = 5.0; EXPECT_TRUE(ConvertTimingForCompositor(timing_, compositor_timing_)); @@ -646,7 +655,7 @@ TEST_F(AnimationCompositorAnimationsTest, EXPECT_EQ(-1, compositor_timing_.adjusted_iteration_count); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationsAndStartDelay) { timing_.iteration_count = 4.0; timing_.iteration_duration = AnimationTimeDelta::FromSecondsD(5); @@ -665,7 +674,7 @@ TEST_F(AnimationCompositorAnimationsTest, EXPECT_TRUE(ConvertTimingForCompositor(timing_, compositor_timing_)); } -TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirection) { +TEST_P(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirection) { timing_.direction = Timing::PlaybackDirection::NORMAL; EXPECT_TRUE(ConvertTimingForCompositor(timing_, compositor_timing_)); EXPECT_EQ(compositor_timing_.direction, Timing::PlaybackDirection::NORMAL); @@ -685,7 +694,7 @@ TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirection) { EXPECT_EQ(compositor_timing_.direction, Timing::PlaybackDirection::REVERSE); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirectionIterationsAndStartDelay) { timing_.direction = Timing::PlaybackDirection::ALTERNATE_NORMAL; timing_.iteration_count = 4.0; @@ -728,7 +737,7 @@ TEST_F(AnimationCompositorAnimationsTest, Timing::PlaybackDirection::ALTERNATE_REVERSE); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionLinear) { timing_.timing_function = linear_timing_function_; EXPECT_TRUE( @@ -737,7 +746,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionCubic) { timing_.timing_function = cubic_ease_timing_function_; EXPECT_TRUE( @@ -752,7 +761,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionSteps) { timing_.timing_function = step_timing_function_; EXPECT_TRUE( @@ -761,7 +770,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionFrames) { timing_.timing_function = frames_timing_function_; EXPECT_TRUE( @@ -770,7 +779,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionChainedLinear) { EXPECT_TRUE( CanStartEffectOnCompositor(timing_, *keyframe_animation_effect2_)); @@ -778,7 +787,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorNonLinearTimingFunctionOnFirstOrLastFrame) { keyframe_vector2_->at(0)->SetEasing(cubic_ease_timing_function_.get()); keyframe_animation_effect2_ = @@ -801,7 +810,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorFailuresProperties) { // An effect with no keyframes has no Properties, so can not be composited. StringKeyframeVector empty_keyframe_vector; @@ -809,9 +818,14 @@ TEST_F(AnimationCompositorAnimationsTest, timing_, *StringKeyframeEffectModel::Create(empty_keyframe_vector))); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartElementOnCompositorEffectOpacity) { - ScopedBlinkGenPropertyTreesForTest blink_gen_property_trees(true); + // This test doesn't apply for pre-BlinkGenPropertyTrees due to the element id + // namespaces. + if (!RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled() && + !RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; + Persistent<Element> element = GetDocument().CreateElementForBinding("shared"); LayoutObjectProxy* layout_object = LayoutObjectProxy::Create(element.Get()); @@ -832,9 +846,9 @@ TEST_F(AnimationCompositorAnimationsTest, StringKeyframeVector key_frames; key_frames.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 0.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 0.0)); key_frames.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 1.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 1.0)); KeyframeEffectModelBase* animation_effect = StringKeyframeEffectModel::Create(key_frames); @@ -898,7 +912,7 @@ TEST_F(AnimationCompositorAnimationsTest, LayoutObjectProxy::Dispose(new_layout_object); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartElementOnCompositorEffectInvalid) { base::Optional<CompositorElementIdSet> none; auto style = ComputedStyle::Create(); @@ -987,7 +1001,7 @@ TEST_F(AnimationCompositorAnimationsTest, LayoutObjectProxy::Dispose(layout_object); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartElementOnCompositorEffectFilter) { base::Optional<CompositorElementIdSet> none; @@ -1010,8 +1024,8 @@ TEST_F(AnimationCompositorAnimationsTest, // Filter Properties use a different ID namespace StringKeyframeEffectModel* effect1 = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyFilter, "none", 0), - CreateReplaceOpKeyframe(CSSPropertyFilter, "sepia(50%)", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kFilter, "none", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kFilter, "sepia(50%)", 1.0)); KeyframeEffect* keyframe_effect1 = KeyframeEffect::Create(element.Get(), effect1, timing_); @@ -1033,8 +1047,8 @@ TEST_F(AnimationCompositorAnimationsTest, // Filters that affect neighboring pixels can't be composited. StringKeyframeEffectModel* effect2 = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyFilter, "none", 0), - CreateReplaceOpKeyframe(CSSPropertyFilter, "blur(10px)", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kFilter, "none", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kFilter, "blur(10px)", 1.0)); KeyframeEffect* keyframe_effect2 = KeyframeEffect::Create(element.Get(), effect2, timing_); @@ -1052,9 +1066,14 @@ TEST_F(AnimationCompositorAnimationsTest, LayoutObjectProxy::Dispose(layout_object); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartElementOnCompositorEffectTransform) { - ScopedBlinkGenPropertyTreesForTest blink_gen_property_trees(true); + // This test doesn't apply for pre-BlinkGenPropertyTrees due to the element id + // namespaces. + if (!RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled() && + !RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; + Persistent<Element> element = GetDocument().CreateElementForBinding("shared"); LayoutObjectProxy* layout_object = LayoutObjectProxy::Create(element.Get()); @@ -1079,8 +1098,8 @@ TEST_F(AnimationCompositorAnimationsTest, auto style = ComputedStyle::Create(); StringKeyframeEffectModel* effect1 = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyTransform, "none", 0), - CreateReplaceOpKeyframe(CSSPropertyTransform, "rotate(45deg)", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, "none", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, "rotate(45deg)", 1.0)); KeyframeEffect* keyframe_effect1 = KeyframeEffect::Create(element.Get(), effect1, timing_); @@ -1105,10 +1124,12 @@ TEST_F(AnimationCompositorAnimationsTest, timing_, *element.Get(), animation1, *effect1, disjoint_ids)); StringKeyframeEffectModel* effect2 = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyTransform, "translateX(-45px)", 0), - CreateReplaceOpKeyframe(CSSPropertyRotate, "none", 0), - CreateReplaceOpKeyframe(CSSPropertyTransform, "translateX(45px)", 1.0), - CreateReplaceOpKeyframe(CSSPropertyRotate, "45deg", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, "translateX(-45px)", + 0), + CreateReplaceOpKeyframe(CSSPropertyID::kRotate, "none", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, "translateX(45px)", + 1.0), + CreateReplaceOpKeyframe(CSSPropertyID::kRotate, "45deg", 1.0)); KeyframeEffect* keyframe_effect2 = KeyframeEffect::Create(element.Get(), effect2, timing_); @@ -1128,7 +1149,7 @@ TEST_F(AnimationCompositorAnimationsTest, LayoutObjectProxy::Dispose(layout_object); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionChainedCubicMatchingOffsets) { keyframe_vector2_->at(0)->SetEasing(cubic_ease_timing_function_.get()); keyframe_animation_effect2_ = @@ -1152,7 +1173,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionMixedGood) { keyframe_vector5_->at(0)->SetEasing(linear_timing_function_.get()); keyframe_vector5_->at(1)->SetEasing(cubic_ease_timing_function_.get()); @@ -1164,7 +1185,7 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorTimingFunctionWithStepOrFrameOkay) { keyframe_vector2_->at(0)->SetEasing(step_timing_function_.get()); keyframe_animation_effect2_ = @@ -1206,20 +1227,20 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositor(timing_, *keyframe_animation_effect5_)); } -TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorBasic) { +TEST_P(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorBasic) { StringKeyframeVector basic_frames_vector; basic_frames_vector.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 0.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 0.0)); basic_frames_vector.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 1.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 1.0)); StringKeyframeVector non_basic_frames_vector; non_basic_frames_vector.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 0.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 0.0)); non_basic_frames_vector.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 0.5)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 0.5)); non_basic_frames_vector.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 1.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 1.0)); basic_frames_vector[0]->SetEasing(linear_timing_function_.get()); StringKeyframeEffectModel* basic_frames = @@ -1240,9 +1261,9 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorBasic) { StringKeyframeVector non_allowed_frames_vector; non_allowed_frames_vector.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeAdd, 0.1)); + CSSPropertyID::kOpacity, EffectModel::kCompositeAdd, 0.1)); non_allowed_frames_vector.push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeAdd, 0.25)); + CSSPropertyID::kOpacity, EffectModel::kCompositeAdd, 0.25)); StringKeyframeEffectModel* non_allowed_frames = StringKeyframeEffectModel::Create(non_allowed_frames_vector); EXPECT_FALSE(CanStartEffectOnCompositor(timing_, *non_allowed_frames)); @@ -1269,11 +1290,11 @@ TEST_F(AnimationCompositorAnimationsTest, CanStartEffectOnCompositorBasic) { // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- -TEST_F(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimation) { +TEST_P(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimation) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); std::unique_ptr<CompositorKeyframeModel> keyframe_model = ConvertToCompositorAnimation(*effect); @@ -1303,12 +1324,12 @@ TEST_F(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimation) { keyframes[1]->GetTimingFunctionForTesting()->GetType()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimationDuration) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); const AnimationTimeDelta kDuration = AnimationTimeDelta::FromSecondsD(10); timing_.iteration_duration = kDuration; @@ -1325,14 +1346,14 @@ TEST_F(AnimationCompositorAnimationsTest, EXPECT_EQ(kDuration, keyframes[1]->Time() * kDuration); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateMultipleKeyframeOpacityAnimationLinear) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.0", 0.25), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.25", 0.5), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.0", 0.25), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.25", 0.5), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); timing_.iteration_count = 5; timing_.direction = Timing::PlaybackDirection::ALTERNATE_NORMAL; @@ -1375,12 +1396,12 @@ TEST_F(AnimationCompositorAnimationsTest, keyframes[3]->GetTimingFunctionForTesting()->GetType()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimationStartDelay) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); const double kStartDelay = 3.25; @@ -1408,14 +1429,17 @@ TEST_F(AnimationCompositorAnimationsTest, EXPECT_EQ(0.5f, keyframes[1]->Value()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateMultipleKeyframeOpacityAnimationChained) { // KeyframeEffect to convert StringKeyframeVector frames; - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0)); - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.0", 0.25)); - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.35", 0.5)); - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + frames.push_back(CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0)); + frames.push_back( + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.0", 0.25)); + frames.push_back( + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.35", 0.5)); + frames.push_back( + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); frames[0]->SetEasing(cubic_ease_timing_function_.get()); frames[1]->SetEasing(linear_timing_function_.get()); frames[2]->SetEasing(cubic_custom_timing_function_.get()); @@ -1467,16 +1491,19 @@ TEST_F(AnimationCompositorAnimationsTest, keyframes[3]->GetTimingFunctionForTesting()->GetType()); } -TEST_F(AnimationCompositorAnimationsTest, CreateReversedOpacityAnimation) { +TEST_P(AnimationCompositorAnimationsTest, CreateReversedOpacityAnimation) { scoped_refptr<TimingFunction> cubic_easy_flip_timing_function = CubicBezierTimingFunction::Create(0.0, 0.0, 0.0, 1.0); // KeyframeEffect to convert StringKeyframeVector frames; - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0)); - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.0", 0.25)); - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.25", 0.5)); - frames.push_back(CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + frames.push_back(CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0)); + frames.push_back( + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.0", 0.25)); + frames.push_back( + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.25", 0.5)); + frames.push_back( + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); frames[0]->SetEasing(CubicBezierTimingFunction::Preset( CubicBezierTimingFunction::EaseType::EASE_IN)); frames[1]->SetEasing(linear_timing_function_.get()); @@ -1528,12 +1555,12 @@ TEST_F(AnimationCompositorAnimationsTest, CreateReversedOpacityAnimation) { keyframes[3]->GetTimingFunctionForTesting()->GetType()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateReversedOpacityAnimationNegativeStartDelay) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); const double kNegativeStartDelay = -3; @@ -1560,12 +1587,12 @@ TEST_F(AnimationCompositorAnimationsTest, ASSERT_EQ(2UL, keyframes.size()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimationFillModeNone) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); timing_.fill_mode = Timing::FillMode::NONE; @@ -1575,12 +1602,12 @@ TEST_F(AnimationCompositorAnimationsTest, keyframe_model->GetFillMode()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimationFillModeAuto) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); timing_.fill_mode = Timing::FillMode::AUTO; @@ -1597,12 +1624,12 @@ TEST_F(AnimationCompositorAnimationsTest, keyframe_model->GetFillMode()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateSimpleOpacityAnimationWithTimingFunction) { // KeyframeEffect to convert StringKeyframeEffectModel* effect = CreateKeyframeEffectModel( - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.2", 0), - CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0)); + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.2", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kOpacity, "0.5", 1.0)); timing_.timing_function = cubic_custom_timing_function_; @@ -1640,7 +1667,7 @@ TEST_F(AnimationCompositorAnimationsTest, keyframes[1]->GetTimingFunctionForTesting()->GetType()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CreateSimpleCustomFloatPropertyAnimation) { ScopedOffMainThreadCSSPaintForTest off_main_thread_css_paint(true); @@ -1674,7 +1701,7 @@ TEST_F(AnimationCompositorAnimationsTest, keyframes[1]->GetTimingFunctionForTesting()->GetType()); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CancelIncompatibleCompositorAnimations) { Persistent<Element> element = GetDocument().CreateElementForBinding("shared"); base::Optional<CompositorElementIdSet> none; @@ -1686,9 +1713,9 @@ TEST_F(AnimationCompositorAnimationsTest, Persistent<HeapVector<Member<StringKeyframe>>> key_frames = MakeGarbageCollected<HeapVector<Member<StringKeyframe>>>(); key_frames->push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 0.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 0.0)); key_frames->push_back(CreateDefaultKeyframe( - CSSPropertyOpacity, EffectModel::kCompositeReplace, 1.0)); + CSSPropertyID::kOpacity, EffectModel::kCompositeReplace, 1.0)); KeyframeEffectModelBase* animation_effect1 = StringKeyframeEffectModel::Create(*key_frames); KeyframeEffectModelBase* animation_effect2 = @@ -1738,7 +1765,7 @@ TEST_F(AnimationCompositorAnimationsTest, element->SetLayoutObject(nullptr); LayoutObjectProxy::Dispose(layout_object); - ThreadState::Current()->CollectAllGarbage(); + ThreadState::Current()->CollectAllGarbageForTesting(); EXPECT_TRUE(element->GetElementAnimations()->Animations().IsEmpty()); } @@ -1760,15 +1787,16 @@ void UpdateDummyEffectNode(ObjectPaintProperties& properties, } } // namespace +TEST_P(AnimationCompositorAnimationsTest, + CanStartElementOnCompositorTransformBasedOnPaintProperties) { + if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; -TEST_F(AnimationCompositorAnimationsTest, - CanStartElementOnCompositorTransformCAP) { Persistent<Element> element = GetDocument().CreateElementForBinding("shared"); LayoutObjectProxy* layout_object = LayoutObjectProxy::Create(element.Get()); layout_object->EnsureIdForTestingProxy(); element->SetLayoutObject(layout_object); - ScopedCompositeAfterPaintForTest enable_cap(true); auto& properties = layout_object->GetMutableForPainting() .FirstFragment() .EnsurePaintProperties(); @@ -1777,31 +1805,30 @@ TEST_F(AnimationCompositorAnimationsTest, // animation. UpdateDummyTransformNode(properties, CompositingReason::kActiveTransformAnimation); - EXPECT_TRUE( - CompositorAnimations::CheckCanStartElementOnCompositor(*element).Ok()); + EXPECT_TRUE(CheckCanStartElementOnCompositor(*element)); // Setting to CompositingReasonNone should produce false. UpdateDummyTransformNode(properties, CompositingReason::kNone); - EXPECT_FALSE( - CompositorAnimations::CheckCanStartElementOnCompositor(*element).Ok()); + EXPECT_FALSE(CheckCanStartElementOnCompositor(*element)); // Clearing the transform node entirely should also produce false. properties.ClearTransform(); - EXPECT_FALSE( - CompositorAnimations::CheckCanStartElementOnCompositor(*element).Ok()); + EXPECT_FALSE(CheckCanStartElementOnCompositor(*element)); element->SetLayoutObject(nullptr); LayoutObjectProxy::Dispose(layout_object); } -TEST_F(AnimationCompositorAnimationsTest, - CanStartElementOnCompositorEffectCAP) { +TEST_P(AnimationCompositorAnimationsTest, + CanStartElementOnCompositorEffectBasedOnPaintProperties) { + if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; + Persistent<Element> element = GetDocument().CreateElementForBinding("shared"); LayoutObjectProxy* layout_object = LayoutObjectProxy::Create(element.Get()); layout_object->EnsureIdForTestingProxy(); element->SetLayoutObject(layout_object); - ScopedCompositeAfterPaintForTest enable_cap(true); auto& properties = layout_object->GetMutableForPainting() .FirstFragment() .EnsurePaintProperties(); @@ -1810,24 +1837,21 @@ TEST_F(AnimationCompositorAnimationsTest, // animation. UpdateDummyEffectNode(properties, CompositingReason::kActiveTransformAnimation); - EXPECT_TRUE( - CompositorAnimations::CheckCanStartElementOnCompositor(*element).Ok()); + EXPECT_TRUE(CheckCanStartElementOnCompositor(*element)); // Setting to CompositingReasonNone should produce false. UpdateDummyEffectNode(properties, CompositingReason::kNone); - EXPECT_FALSE( - CompositorAnimations::CheckCanStartElementOnCompositor(*element).Ok()); + EXPECT_FALSE(CheckCanStartElementOnCompositor(*element)); // Clearing the effect node entirely should also produce false. properties.ClearEffect(); - EXPECT_FALSE( - CompositorAnimations::CheckCanStartElementOnCompositor(*element).Ok()); + EXPECT_FALSE(CheckCanStartElementOnCompositor(*element)); element->SetLayoutObject(nullptr); LayoutObjectProxy::Dispose(layout_object); } -TEST_F(AnimationCompositorAnimationsTest, TrackRafAnimation) { +TEST_P(AnimationCompositorAnimationsTest, TrackRafAnimation) { LoadTestData("raf-countdown.html"); cc::AnimationHost* host = @@ -1856,7 +1880,7 @@ TEST_F(AnimationCompositorAnimationsTest, TrackRafAnimation) { EXPECT_FALSE(host->NextFrameHasPendingRAF()); } -TEST_F(AnimationCompositorAnimationsTest, TrackRafAnimationTimeout) { +TEST_P(AnimationCompositorAnimationsTest, TrackRafAnimationTimeout) { LoadTestData("raf-timeout.html"); cc::AnimationHost* host = @@ -1870,7 +1894,7 @@ TEST_F(AnimationCompositorAnimationsTest, TrackRafAnimationTimeout) { EXPECT_FALSE(host->NextFrameHasPendingRAF()); } -TEST_F(AnimationCompositorAnimationsTest, TrackRafAnimationNoneRegistered) { +TEST_P(AnimationCompositorAnimationsTest, TrackRafAnimationNoneRegistered) { SetBodyInnerHTML("<div id='box'></div>"); // Run a full frame after loading the test data so that scripted animations @@ -1891,25 +1915,91 @@ TEST_F(AnimationCompositorAnimationsTest, TrackRafAnimationNoneRegistered) { EXPECT_FALSE(host->NextFrameHasPendingRAF()); } -TEST_F(AnimationCompositorAnimationsTest, CanStartElementOnCompositorEffect) { +TEST_P(AnimationCompositorAnimationsTest, CompositedTransformAnimation) { + // TODO(wangxianzhu): Fix this test for CompositeAfterPaint. + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; + LoadTestData("transform-animation.html"); Document* document = GetFrame()->GetDocument(); Element* target = document->getElementById("target"); const ObjectPaintProperties* properties = target->GetLayoutObject()->FirstFragment().PaintProperties(); + ASSERT_NE(nullptr, properties); + const auto* transform = properties->Transform(); + ASSERT_NE(nullptr, transform); + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled() || + RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled()) { + EXPECT_TRUE(transform->HasDirectCompositingReasons()); + EXPECT_TRUE(transform->HasActiveTransformAnimation()); + // Make sure the animation state is initialized in paint properties. + auto* property_trees = + document->View()->RootCcLayer()->layer_tree_host()->property_trees(); + auto* cc_transform = property_trees->transform_tree.Node( + property_trees->element_id_to_transform_node_index + [transform->GetCompositorElementId()]); + ASSERT_NE(nullptr, cc_transform); + EXPECT_TRUE(cc_transform->has_potential_animation); + EXPECT_TRUE(cc_transform->is_currently_animating); + EXPECT_EQ(cc::kNotScaled, cc_transform->starting_animation_scale); + EXPECT_EQ(cc::kNotScaled, cc_transform->maximum_animation_scale); + } + + // Make sure the animation is started on the compositor. + EXPECT_TRUE(CheckCanStartElementOnCompositor(*target)); + EXPECT_EQ(document->Timeline().PendingAnimationsCount(), 1u); + cc::AnimationHost* host = document->View()->GetCompositorAnimationHost(); + EXPECT_EQ(host->MainThreadAnimationsCount(), 0u); + EXPECT_EQ(host->CompositedAnimationsCount(), 1u); +} + +TEST_P(AnimationCompositorAnimationsTest, CompositedScaleAnimation) { + // TODO(wangxianzhu): Fix this test for CompositeAfterPaint. if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_TRUE(properties->Transform()->HasDirectCompositingReasons()); - CompositorAnimations::FailureCode code = - CompositorAnimations::CheckCanStartElementOnCompositor(*target); - EXPECT_EQ(code, CompositorAnimations::FailureCode::None()); + return; + + LoadTestData("scale-animation.html"); + Document* document = GetFrame()->GetDocument(); + Element* target = document->getElementById("target"); + const ObjectPaintProperties* properties = + target->GetLayoutObject()->FirstFragment().PaintProperties(); + ASSERT_NE(nullptr, properties); + const auto* transform = properties->Transform(); + ASSERT_NE(nullptr, transform); + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled() || + RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled()) { + EXPECT_TRUE(transform->HasDirectCompositingReasons()); + EXPECT_TRUE(transform->HasActiveTransformAnimation()); + // Make sure the animation state is initialized in paint properties. + auto* property_trees = + document->View()->RootCcLayer()->layer_tree_host()->property_trees(); + auto* cc_transform = property_trees->transform_tree.Node( + property_trees->element_id_to_transform_node_index + [transform->GetCompositorElementId()]); + ASSERT_NE(nullptr, cc_transform); + EXPECT_TRUE(cc_transform->has_potential_animation); + EXPECT_TRUE(cc_transform->is_currently_animating); + EXPECT_EQ(2.f, cc_transform->starting_animation_scale); + EXPECT_EQ(5.f, cc_transform->maximum_animation_scale); + } + + // Make sure the animation is started on the compositor. + EXPECT_TRUE(CheckCanStartElementOnCompositor(*target)); EXPECT_EQ(document->Timeline().PendingAnimationsCount(), 1u); cc::AnimationHost* host = document->View()->GetCompositorAnimationHost(); EXPECT_EQ(host->MainThreadAnimationsCount(), 0u); EXPECT_EQ(host->CompositedAnimationsCount(), 1u); } -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, NonAnimatedTransformPropertyChangeGetsUpdated) { + // This test doesn't apply for pre-BlinkGenPropertyTrees due to the element id + // namespaces. + if (!RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled() || + // TODO(wangxianzhu): Fix this test for CompositeAfterPaint. + RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; + LoadTestData("transform-animation-update.html"); Document* document = GetFrame()->GetDocument(); Element* target = document->getElementById("target"); @@ -1919,11 +2009,19 @@ TEST_F(AnimationCompositorAnimationsTest, const auto* transform = properties->Transform(); ASSERT_NE(nullptr, transform); // Make sure composited animation is running on #target. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_TRUE(transform->HasDirectCompositingReasons()); - CompositorAnimations::FailureCode code = - CompositorAnimations::CheckCanStartElementOnCompositor(*target); - EXPECT_EQ(code, CompositorAnimations::FailureCode::None()); + EXPECT_TRUE(transform->HasDirectCompositingReasons()); + EXPECT_TRUE(transform->HasActiveTransformAnimation()); + EXPECT_TRUE(CheckCanStartElementOnCompositor(*target)); + // Make sure the animation state is initialized in paint properties. + auto* property_trees = + document->View()->RootCcLayer()->layer_tree_host()->property_trees(); + auto* cc_transform = property_trees->transform_tree.Node( + property_trees->element_id_to_transform_node_index + [transform->GetCompositorElementId()]); + ASSERT_NE(nullptr, cc_transform); + EXPECT_TRUE(cc_transform->has_potential_animation); + EXPECT_TRUE(cc_transform->is_currently_animating); + // Make sure the animation is started on the compositor. EXPECT_EQ(document->Timeline().PendingAnimationsCount(), 1u); cc::AnimationHost* host = document->View()->GetCompositorAnimationHost(); EXPECT_EQ(host->MainThreadAnimationsCount(), 0u); @@ -1931,7 +2029,7 @@ TEST_F(AnimationCompositorAnimationsTest, // Make sure the backface-visibility is correctly set, both in blink and on // the cc::Layer. EXPECT_FALSE(transform->Matrix().IsIdentity()); // Rotated - EXPECT_EQ(transform->GetBackfaceVisibility(), + EXPECT_EQ(transform->GetBackfaceVisibilityForTesting(), TransformPaintPropertyNode::BackfaceVisibility::kVisible); const CompositedLayerMapping* composited_layer_mapping = ToLayoutBoxModelObject(target->GetLayoutObject()) @@ -1942,29 +2040,37 @@ TEST_F(AnimationCompositorAnimationsTest, composited_layer_mapping->MainGraphicsLayer()->CcLayer(); ASSERT_NE(nullptr, layer); EXPECT_TRUE(layer->double_sided()); + // Change the backface visibility, while the compositor animation is // happening. target->setAttribute(html_names::kClassAttr, "backface-hidden"); ForceFullCompositingUpdate(); // Make sure the setting made it to both blink and all the way to CC. - EXPECT_EQ(transform->GetBackfaceVisibility(), + EXPECT_EQ(transform->GetBackfaceVisibilityForTesting(), TransformPaintPropertyNode::BackfaceVisibility::kHidden); EXPECT_FALSE(layer->double_sided()) << "Change to hidden did not get propagated to CC"; + // Make sure the animation state is initialized in paint properties after + // blink pushing new paint properties without animation state change. + property_trees = + document->View()->RootCcLayer()->layer_tree_host()->property_trees(); + cc_transform = property_trees->transform_tree.Node( + property_trees->element_id_to_transform_node_index + [transform->GetCompositorElementId()]); + ASSERT_NE(nullptr, cc_transform); + EXPECT_TRUE(cc_transform->has_potential_animation); + EXPECT_TRUE(cc_transform->is_currently_animating); } // Regression test for https://crbug.com/781305. When we have a transform // animation on a SVG element, the effect can be started on compositor but the // element itself cannot. -TEST_F(AnimationCompositorAnimationsTest, +TEST_P(AnimationCompositorAnimationsTest, CannotStartElementOnCompositorEffectSVG) { LoadTestData("transform-animation-on-svg.html"); Document* document = GetFrame()->GetDocument(); Element* target = document->getElementById("dots"); - CompositorAnimations::FailureCode code = - CompositorAnimations::CheckCanStartElementOnCompositor(*target); - EXPECT_EQ(code, CompositorAnimations::FailureCode::NonActionable( - "Element does not paint into own backing")); + EXPECT_FALSE(CheckCanStartElementOnCompositor(*target)); EXPECT_EQ(document->Timeline().PendingAnimationsCount(), 4u); cc::AnimationHost* host = document->View()->GetCompositorAnimationHost(); EXPECT_EQ(host->MainThreadAnimationsCount(), 4u); |