OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "core/dom/ScriptedAnimationController.h" |
| 6 |
| 7 #include "core/dom/Document.h" |
| 8 #include "core/dom/FrameRequestCallback.h" |
| 9 #include "core/events/Event.h" |
| 10 #include "core/events/EventListener.h" |
| 11 #include "core/events/EventTarget.h" |
| 12 #include "core/testing/DummyPageHolder.h" |
| 13 #include "platform/heap/Handle.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "wtf/Functional.h" |
| 17 #include <memory> |
| 18 |
| 19 namespace blink { |
| 20 |
| 21 class ScriptedAnimationControllerTest : public ::testing::Test { |
| 22 protected: |
| 23 void SetUp() override; |
| 24 |
| 25 Document& document() const { return m_dummyPageHolder->document(); } |
| 26 ScriptedAnimationController& controller() { return *m_controller; } |
| 27 |
| 28 private: |
| 29 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; |
| 30 Persistent<ScriptedAnimationController> m_controller; |
| 31 }; |
| 32 |
| 33 void ScriptedAnimationControllerTest::SetUp() { |
| 34 m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); |
| 35 |
| 36 // Note: The document doesn't know about this ScriptedAnimationController |
| 37 // instance, and will create another if |
| 38 // Document::ensureScriptedAnimationController is called. |
| 39 m_controller = |
| 40 wrapPersistent(ScriptedAnimationController::create(&document())); |
| 41 } |
| 42 |
| 43 namespace { |
| 44 |
| 45 class TaskOrderObserver { |
| 46 public: |
| 47 std::unique_ptr<WTF::Closure> createTask(int id) { |
| 48 return WTF::bind(&TaskOrderObserver::runTask, unretained(this), id); |
| 49 } |
| 50 const Vector<int>& order() const { return m_order; } |
| 51 |
| 52 private: |
| 53 void runTask(int id) { m_order.append(id); } |
| 54 Vector<int> m_order; |
| 55 }; |
| 56 |
| 57 } // anonymous namespace |
| 58 |
| 59 TEST_F(ScriptedAnimationControllerTest, EnqueueOneTask) { |
| 60 TaskOrderObserver observer; |
| 61 |
| 62 controller().enqueueTask(observer.createTask(1)); |
| 63 EXPECT_EQ(0u, observer.order().size()); |
| 64 |
| 65 controller().serviceScriptedAnimations(0); |
| 66 EXPECT_EQ(1u, observer.order().size()); |
| 67 EXPECT_EQ(1, observer.order()[0]); |
| 68 } |
| 69 |
| 70 TEST_F(ScriptedAnimationControllerTest, EnqueueTwoTasks) { |
| 71 TaskOrderObserver observer; |
| 72 |
| 73 controller().enqueueTask(observer.createTask(1)); |
| 74 controller().enqueueTask(observer.createTask(2)); |
| 75 EXPECT_EQ(0u, observer.order().size()); |
| 76 |
| 77 controller().serviceScriptedAnimations(0); |
| 78 EXPECT_EQ(2u, observer.order().size()); |
| 79 EXPECT_EQ(1, observer.order()[0]); |
| 80 EXPECT_EQ(2, observer.order()[1]); |
| 81 } |
| 82 |
| 83 namespace { |
| 84 |
| 85 void enqueueTask(ScriptedAnimationController* controller, |
| 86 TaskOrderObserver* observer, |
| 87 int id) { |
| 88 controller->enqueueTask(observer->createTask(id)); |
| 89 } |
| 90 |
| 91 } // anonymous namespace |
| 92 |
| 93 // A task enqueued while running tasks should not be run immediately after, but |
| 94 // the next time tasks are run. |
| 95 TEST_F(ScriptedAnimationControllerTest, EnqueueWithinTask) { |
| 96 TaskOrderObserver observer; |
| 97 |
| 98 controller().enqueueTask(observer.createTask(1)); |
| 99 controller().enqueueTask(WTF::bind( |
| 100 &enqueueTask, wrapPersistent(&controller()), unretained(&observer), 2)); |
| 101 controller().enqueueTask(observer.createTask(3)); |
| 102 EXPECT_EQ(0u, observer.order().size()); |
| 103 |
| 104 controller().serviceScriptedAnimations(0); |
| 105 EXPECT_EQ(2u, observer.order().size()); |
| 106 EXPECT_EQ(1, observer.order()[0]); |
| 107 EXPECT_EQ(3, observer.order()[1]); |
| 108 |
| 109 controller().serviceScriptedAnimations(0); |
| 110 EXPECT_EQ(3u, observer.order().size()); |
| 111 EXPECT_EQ(1, observer.order()[0]); |
| 112 EXPECT_EQ(3, observer.order()[1]); |
| 113 EXPECT_EQ(2, observer.order()[2]); |
| 114 } |
| 115 |
| 116 namespace { |
| 117 |
| 118 class RunTaskEventListener final : public EventListener { |
| 119 public: |
| 120 RunTaskEventListener(std::unique_ptr<WTF::Closure> task) |
| 121 : EventListener(CPPEventListenerType), m_task(std::move(task)) {} |
| 122 void handleEvent(ExecutionContext*, Event*) override { (*m_task)(); } |
| 123 bool operator==(const EventListener& other) const override { |
| 124 return this == &other; |
| 125 } |
| 126 |
| 127 private: |
| 128 std::unique_ptr<WTF::Closure> m_task; |
| 129 }; |
| 130 |
| 131 } // anonymous namespace |
| 132 |
| 133 // Tasks should be run after events are dispatched, even if they were enqueued |
| 134 // first. |
| 135 TEST_F(ScriptedAnimationControllerTest, EnqueueTaskAndEvent) { |
| 136 TaskOrderObserver observer; |
| 137 |
| 138 controller().enqueueTask(observer.createTask(1)); |
| 139 document().addEventListener("test", |
| 140 new RunTaskEventListener(observer.createTask(2))); |
| 141 Event* event = Event::create("test"); |
| 142 event->setTarget(&document()); |
| 143 controller().enqueueEvent(event); |
| 144 EXPECT_EQ(0u, observer.order().size()); |
| 145 |
| 146 controller().serviceScriptedAnimations(0); |
| 147 EXPECT_EQ(2u, observer.order().size()); |
| 148 EXPECT_EQ(2, observer.order()[0]); |
| 149 EXPECT_EQ(1, observer.order()[1]); |
| 150 } |
| 151 |
| 152 namespace { |
| 153 |
| 154 class RunTaskCallback final : public FrameRequestCallback { |
| 155 public: |
| 156 RunTaskCallback(std::unique_ptr<WTF::Closure> task) |
| 157 : m_task(std::move(task)) {} |
| 158 void handleEvent(double) override { (*m_task)(); } |
| 159 |
| 160 private: |
| 161 std::unique_ptr<WTF::Closure> m_task; |
| 162 }; |
| 163 |
| 164 } // anonymous namespace |
| 165 |
| 166 // Animation frame callbacks should be run after tasks, even if they were |
| 167 // enqueued first. |
| 168 TEST_F(ScriptedAnimationControllerTest, RegisterCallbackAndEnqueueTask) { |
| 169 TaskOrderObserver observer; |
| 170 |
| 171 Event* event = Event::create("test"); |
| 172 event->setTarget(&document()); |
| 173 |
| 174 controller().registerCallback(new RunTaskCallback(observer.createTask(1))); |
| 175 controller().enqueueTask(observer.createTask(2)); |
| 176 EXPECT_EQ(0u, observer.order().size()); |
| 177 |
| 178 controller().serviceScriptedAnimations(0); |
| 179 EXPECT_EQ(2u, observer.order().size()); |
| 180 EXPECT_EQ(2, observer.order()[0]); |
| 181 EXPECT_EQ(1, observer.order()[1]); |
| 182 } |
| 183 |
| 184 } // namespace blink |
OLD | NEW |