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

Side by Side Diff: third_party/WebKit/Source/core/dom/ScriptedAnimationControllerTest.cpp

Issue 2536643002: Introduce animation frame tasks (Closed)
Patch Set: drop 'the' Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/dom/ScriptedAnimationController.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/ScriptedAnimationController.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698