15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_delegate.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/test/test_layer_animation_delegate.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/test/test_utils.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the transformation element progresses the delegate as expected and 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, TransformElement) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate delegate; 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform start_transform, target_transform; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_transform.Rotate(-30.0); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_transform.Rotate(30.0); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks effective_start_time; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::CreateTransformElement(target_transform, delta)); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_animation_group_id(1); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time = effective_start_time + delta; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.SetTransformFromAnimation(start_transform); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time, &delegate); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(start_transform, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.GetTransformForAnimation()); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_start_time = start_time + delta; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_effective_start_time(effective_start_time); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time, &delegate); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(0.0, element->last_progressed_fraction()); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time + delta/2, &delegate); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(0.5, element->last_progressed_fraction()); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(element->IsFinished(effective_start_time + delta, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &element_duration)); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2 * delta, element_duration); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time + delta, &delegate); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(1.0, element->last_progressed_fraction()); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(target_transform, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.GetTransformForAnimation()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue target_value(&delegate); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->GetTargetValue(&target_value); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(target_transform, target_value.transform); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Ensures that duration is copied correctly. 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(LayerAnimationElementTest, InverseElementDurationNoScale) { 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform transform; 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta delta; 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<LayerAnimationElement> base_element( 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerAnimationElement::CreateTransformElement(transform, delta)); 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<LayerAnimationElement> inverse_element( 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerAnimationElement::CreateInverseTransformElement(transform, 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_element.get())); 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(base_element->duration(), inverse_element->duration()); 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Ensures that duration is copied correctly and not double scaled. 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(LayerAnimationElementTest, InverseElementDurationScaled) { 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform transform; 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta delta; 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedAnimationDurationScaleMode faster_duration( 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedAnimationDurationScaleMode::FAST_DURATION); 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<LayerAnimationElement> base_element( 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerAnimationElement::CreateTransformElement(transform, delta)); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<LayerAnimationElement> inverse_element( 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerAnimationElement::CreateInverseTransformElement(transform, 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_element.get())); 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(base_element->duration(), inverse_element->duration()); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Ensures that the GetTargetTransform() method works as intended. 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST(LayerAnimationElementTest, InverseElementTargetCalculation) { 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::TimeTicks start_time; 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) start_time += delta; 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Transform identity, transform; 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transform.Scale3d(2.0, 2.0, 2.0); 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<LayerAnimationElement> base_element( 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerAnimationElement::CreateTransformElement(transform, delta)); 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<LayerAnimationElement> inverse_element( 112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerAnimationElement::CreateInverseTransformElement(identity, 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base_element.get())); 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base_element->set_requested_start_time(start_time); 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inverse_element->set_requested_start_time(start_time); 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TestLayerAnimationDelegate delegate; 119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate.SetTransformFromAnimation(transform); 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base_element->Start(&delegate, 1); 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inverse_element->Start(&delegate, 1); 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerAnimationElement::TargetValue target; 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inverse_element->GetTargetValue(&target); 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(target.transform.IsIdentity()) 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << "Target should be identity such that the initial 2x scale from the start" 128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << " carries over at end when parent is doubled."; 129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the bounds element progresses the delegate as expected and 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, BoundsElement) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate delegate; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect start, target, middle; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = target = middle = gfx::Rect(0, 0, 50, 50); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start.set_x(-90); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.set_x(90); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::CreateBoundsElement(target, delta)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time += delta; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.SetBoundsFromAnimation(start); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time, &delegate); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(start, delegate.GetBoundsForAnimation()); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta/2, &delegate); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(middle, delegate.GetBoundsForAnimation()); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration)); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(delta, element_duration); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta, &delegate); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(target, delegate.GetBoundsForAnimation()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue target_value(&delegate); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->GetTargetValue(&target_value); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(target, target_value.bounds); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the opacity element progresses the delegate as expected and 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, OpacityElement) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate delegate; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start = 0.0; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float middle = 0.5; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float target = 1.0; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks effective_start_time; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::CreateOpacityElement(target, delta)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time = effective_start_time + delta; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.SetOpacityFromAnimation(start); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time, &delegate); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(start, element->last_progressed_fraction()); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_start_time = start_time + delta; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_effective_start_time(effective_start_time); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time, &delegate); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(start, element->last_progressed_fraction()); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time + delta/2, &delegate); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(middle, element->last_progressed_fraction()); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(element->IsFinished(effective_start_time + delta, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &element_duration)); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2 * delta, element_duration); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time + delta, &delegate); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FLOAT_EQ(target, element->last_progressed_fraction()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(target, delegate.GetOpacityForAnimation()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue target_value(&delegate); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->GetTargetValue(&target_value); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(target, target_value.opacity); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the visibility element progresses the delegate as expected and 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, VisibilityElement) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate delegate; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool start = true; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool target = false; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::CreateVisibilityElement(target, delta)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time += delta; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.SetVisibilityFromAnimation(start); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time, &delegate); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate.GetVisibilityForAnimation()); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta/2, &delegate); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate.GetVisibilityForAnimation()); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration)); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(delta, element_duration); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta, &delegate); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(delegate.GetVisibilityForAnimation()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue target_value(&delegate); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->GetTargetValue(&target_value); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(target_value.visibility); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the Brightness element progresses the delegate as expected and 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, BrightnessElement) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate delegate; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start = 0.0; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float middle = 0.5; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float target = 1.0; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::CreateBrightnessElement(target, delta)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time += delta; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.SetBrightnessFromAnimation(start); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time, &delegate); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(start, delegate.GetBrightnessForAnimation()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta/2, &delegate); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(middle, delegate.GetBrightnessForAnimation()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration)); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(delta, element_duration); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta, &delegate); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(target, delegate.GetBrightnessForAnimation()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue target_value(&delegate); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->GetTargetValue(&target_value); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(target, target_value.brightness); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the Grayscale element progresses the delegate as expected and 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, GrayscaleElement) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate delegate; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start = 0.0; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float middle = 0.5; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float target = 1.0; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::CreateGrayscaleElement(target, delta)); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time += delta; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.SetGrayscaleFromAnimation(start); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time, &delegate); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(start, delegate.GetGrayscaleForAnimation()); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta/2, &delegate); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(middle, delegate.GetGrayscaleForAnimation()); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration)); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(delta, element_duration); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta, &delegate); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(target, delegate.GetGrayscaleForAnimation()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue target_value(&delegate); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->GetTargetValue(&target_value); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(target, target_value.grayscale); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the pause element progresses the delegate as expected and 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, PauseElement) { 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerAnimationElement::AnimatableProperties properties = 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerAnimationElement::TRANSFORM | LayerAnimationElement::BOUNDS | 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerAnimationElement::OPACITY | LayerAnimationElement::BRIGHTNESS | 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerAnimationElement::GRAYSCALE; 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::CreatePauseElement(properties, delta)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate delegate; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimationDelegate copy = delegate; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time += delta; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pause should last for |delta|. 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration)); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(delta, element_duration); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time + delta, &delegate); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing should have changed. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(delegate.GetBoundsForAnimation(), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy.GetBoundsForAnimation()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(delegate.GetTransformForAnimation(), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy.GetTransformForAnimation()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(), 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy.GetOpacityForAnimation()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy.GetBrightnessForAnimation()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(), 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy.GetGrayscaleForAnimation()); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Check that a threaded opacity element updates the delegate as expected when 3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// aborted. 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerAnimationElementTest, AbortOpacityElement) { 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLayerAnimationDelegate delegate; 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start = 0.0; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float target = 1.0; 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time; 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks effective_start_time; 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<LayerAnimationElement> element( 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationElement::CreateOpacityElement(target, delta)); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Choose a non-linear Tween type. 368d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::Type tween_type = gfx::Tween::EASE_IN; 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_tween_type(tween_type); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delegate.SetOpacityFromAnimation(start); 3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Aborting the element before it has started should not update the delegate. 3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->Abort(&delegate); 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FLOAT_EQ(start, delegate.GetOpacityForAnimation()); 3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_time += delta; 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_requested_start_time(start_time); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Start(&delegate, 1); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(start_time, &delegate); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_start_time = start_time + delta; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->set_effective_start_time(effective_start_time); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time, &delegate); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Progress(effective_start_time + delta/2, &delegate); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Since the element has started, it should update the delegate when 3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // aborted. 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element->Abort(&delegate); 389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FLOAT_EQ(gfx::Tween::CalculateValue(tween_type, 0.5), 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate.GetOpacityForAnimation()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Check that a threaded transform element updates the delegate as expected when 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// aborted. 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(LayerAnimationElementTest, AbortTransformElement) { 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TestLayerAnimationDelegate delegate; 3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::Transform start_transform, target_transform; 3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch start_transform.Rotate(-30.0); 3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch target_transform.Rotate(30.0); 4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeTicks start_time; 4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeTicks effective_start_time; 4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta delta = base::TimeDelta::FromSeconds(1); 4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<LayerAnimationElement> element( 4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerAnimationElement::CreateTransformElement(target_transform, delta)); 4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Choose a non-linear Tween type. 407d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::Type tween_type = gfx::Tween::EASE_IN; 4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->set_tween_type(tween_type); 4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delegate.SetTransformFromAnimation(start_transform); 4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Aborting the element before it has started should not update the delegate. 4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->Abort(&delegate); 4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckApproximatelyEqual(start_transform, delegate.GetTransformForAnimation()); 4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch start_time += delta; 4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->set_requested_start_time(start_time); 4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->Start(&delegate, 1); 4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->Progress(start_time, &delegate); 4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch effective_start_time = start_time + delta; 4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->set_effective_start_time(effective_start_time); 4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->Progress(effective_start_time, &delegate); 4237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->Progress(effective_start_time + delta/2, &delegate); 4247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Since the element has started, it should update the delegate when 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // aborted. 4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch element->Abort(&delegate); 4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch target_transform.Blend(start_transform, 429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type, 0.5)); 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckApproximatelyEqual(target_transform, 4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delegate.GetTransformForAnimation()); 4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 437