| Index: Source/core/animation/TimedItemTest.cpp
 | 
| diff --git a/Source/core/animation/TimedItemTest.cpp b/Source/core/animation/TimedItemTest.cpp
 | 
| index 2fccfff95ce046ee70a000b4748bff803dea3cf3..22c10a49b81c30e63fe4b4185ccb8e049485c350 100644
 | 
| --- a/Source/core/animation/TimedItemTest.cpp
 | 
| +++ b/Source/core/animation/TimedItemTest.cpp
 | 
| @@ -37,15 +37,43 @@ using namespace WebCore;
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| +class TestTimedItemEventDelegate : public TimedItemEventDelegate {
 | 
| +public:
 | 
| +    void onEventCondition(bool wasInPlay, bool isInPlay, double previousIteration, double currentIteration) OVERRIDE
 | 
| +    {
 | 
| +        m_eventTriggered = true;
 | 
| +        m_playStateChanged = wasInPlay != isInPlay;
 | 
| +        m_iterationChanged = isInPlay && previousIteration != currentIteration;
 | 
| +        if (isInPlay)
 | 
| +            ASSERT(!isNull(currentIteration));
 | 
| +
 | 
| +    }
 | 
| +    void reset()
 | 
| +    {
 | 
| +        m_eventTriggered = false;
 | 
| +        m_playStateChanged = false;
 | 
| +        m_iterationChanged = false;
 | 
| +    }
 | 
| +    bool eventTriggered() { return m_eventTriggered; }
 | 
| +    bool playStateChanged() { return m_playStateChanged; }
 | 
| +    bool iterationChanged() { return m_iterationChanged; }
 | 
| +
 | 
| +private:
 | 
| +    bool m_eventTriggered;
 | 
| +    bool m_playStateChanged;
 | 
| +    bool m_iterationChanged;
 | 
| +};
 | 
| +
 | 
|  class TestTimedItem : public TimedItem {
 | 
|  public:
 | 
|      static PassRefPtr<TestTimedItem> create(const Timing& specified)
 | 
|      {
 | 
| -        return adoptRef(new TestTimedItem(specified));
 | 
| +        return adoptRef(new TestTimedItem(specified, new TestTimedItemEventDelegate()));
 | 
|      }
 | 
|  
 | 
|      void updateInheritedTime(double time)
 | 
|      {
 | 
| +        m_eventDelegate->reset();
 | 
|          TimedItem::updateInheritedTime(time);
 | 
|      }
 | 
|  
 | 
| @@ -54,11 +82,16 @@ public:
 | 
|  
 | 
|      void willDetach() { }
 | 
|  
 | 
| +    TestTimedItemEventDelegate* eventDelegate() { return m_eventDelegate; }
 | 
| +
 | 
|  private:
 | 
| -    TestTimedItem(const Timing& specified)
 | 
| -        : TimedItem(specified)
 | 
| +    TestTimedItem(const Timing& specified, TestTimedItemEventDelegate* eventDelegate)
 | 
| +        : TimedItem(specified, adoptPtr(eventDelegate))
 | 
| +        , m_eventDelegate(eventDelegate)
 | 
|      {
 | 
|      }
 | 
| +
 | 
| +    TestTimedItemEventDelegate* m_eventDelegate;
 | 
|  };
 | 
|  
 | 
|  TEST(TimedItem, Sanity)
 | 
| @@ -506,4 +539,39 @@ TEST(TimedItem, ZeroDurationIterationAlternateReverse)
 | 
|      ASSERT_EQ(1, timedItem->currentIteration());
 | 
|      ASSERT_EQ(1, timedItem->timeFraction());
 | 
|  }
 | 
| +
 | 
| +TEST(TimedItem, Events)
 | 
| +{
 | 
| +    Timing timing;
 | 
| +    timing.hasIterationDuration = true;
 | 
| +    timing.iterationDuration = 1;
 | 
| +    timing.iterationCount = 2;
 | 
| +    RefPtr<TestTimedItem> timedItem = TestTimedItem::create(timing);
 | 
| +
 | 
| +    timedItem->updateInheritedTime(0.3);
 | 
| +    ASSERT_TRUE(timedItem->eventDelegate()->eventTriggered());
 | 
| +    EXPECT_TRUE(timedItem->eventDelegate()->playStateChanged());
 | 
| +    EXPECT_TRUE(timedItem->eventDelegate()->iterationChanged());
 | 
| +
 | 
| +    timedItem->updateInheritedTime(0.6);
 | 
| +    ASSERT_FALSE(timedItem->eventDelegate()->eventTriggered());
 | 
| +
 | 
| +    timedItem->updateInheritedTime(1.5);
 | 
| +    ASSERT_TRUE(timedItem->eventDelegate()->eventTriggered());
 | 
| +    EXPECT_TRUE(timedItem->eventDelegate()->iterationChanged());
 | 
| +    EXPECT_FALSE(timedItem->eventDelegate()->playStateChanged());
 | 
| +
 | 
| +    timedItem->updateInheritedTime(2.5);
 | 
| +    ASSERT_TRUE(timedItem->eventDelegate()->eventTriggered());
 | 
| +    EXPECT_FALSE(timedItem->eventDelegate()->iterationChanged());
 | 
| +    EXPECT_TRUE(timedItem->eventDelegate()->playStateChanged());
 | 
| +
 | 
| +    timedItem->updateInheritedTime(3);
 | 
| +    ASSERT_FALSE(timedItem->eventDelegate()->eventTriggered());
 | 
| +
 | 
| +    timedItem->updateInheritedTime(1.5);
 | 
| +    ASSERT_TRUE(timedItem->eventDelegate()->eventTriggered());
 | 
| +    EXPECT_FALSE(timedItem->eventDelegate()->iterationChanged());
 | 
| +    EXPECT_TRUE(timedItem->eventDelegate()->playStateChanged());
 | 
| +}
 | 
|  }
 | 
| 
 |