OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "modules/compositorworker/AnimationWorkletThread.h" | 5 #include "modules/compositorworker/AnimationWorkletThread.h" |
6 | 6 |
7 #include "bindings/core/v8/ScriptSourceCode.h" | 7 #include "bindings/core/v8/ScriptSourceCode.h" |
8 #include "bindings/core/v8/SourceLocation.h" | 8 #include "bindings/core/v8/SourceLocation.h" |
9 #include "bindings/core/v8/V8GCController.h" | 9 #include "bindings/core/v8/V8GCController.h" |
10 #include "bindings/core/v8/WorkerOrWorkletScriptController.h" | 10 #include "bindings/core/v8/WorkerOrWorkletScriptController.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 private: | 121 private: |
122 void executeScriptInWorklet(WorkerThread* thread, WaitableEvent* waitEvent) { | 122 void executeScriptInWorklet(WorkerThread* thread, WaitableEvent* waitEvent) { |
123 WorkerOrWorkletScriptController* scriptController = | 123 WorkerOrWorkletScriptController* scriptController = |
124 thread->globalScope()->scriptController(); | 124 thread->globalScope()->scriptController(); |
125 scriptController->evaluate(ScriptSourceCode("var counter = 0; ++counter;")); | 125 scriptController->evaluate(ScriptSourceCode("var counter = 0; ++counter;")); |
126 waitEvent->signal(); | 126 waitEvent->signal(); |
127 } | 127 } |
128 | 128 |
129 RefPtr<SecurityOrigin> m_securityOrigin; | 129 RefPtr<SecurityOrigin> m_securityOrigin; |
130 std::unique_ptr<WorkerReportingProxy> m_reportingProxy; | 130 std::unique_ptr<WorkerReportingProxy> m_reportingProxy; |
131 AnimationWorkletTestPlatform m_testPlatform; | |
132 }; | 131 }; |
133 | 132 |
134 TEST_F(AnimationWorkletThreadTest, Basic) { | 133 TEST_F(AnimationWorkletThreadTest, Basic) { |
| 134 ScopedTestingPlatformSupport<AnimationWorkletTestPlatform> platform; |
| 135 |
135 std::unique_ptr<AnimationWorkletThread> worklet = | 136 std::unique_ptr<AnimationWorkletThread> worklet = |
136 createAnimationWorkletThread(); | 137 createAnimationWorkletThread(); |
137 checkWorkletCanExecuteScript(worklet.get()); | 138 checkWorkletCanExecuteScript(worklet.get()); |
138 worklet->terminateAndWait(); | 139 worklet->terminateAndWait(); |
139 } | 140 } |
140 | 141 |
141 // Tests that the same WebThread is used for new worklets if the WebThread is | 142 // Tests that the same WebThread is used for new worklets if the WebThread is |
142 // still alive. | 143 // still alive. |
143 TEST_F(AnimationWorkletThreadTest, CreateSecondAndTerminateFirst) { | 144 TEST_F(AnimationWorkletThreadTest, CreateSecondAndTerminateFirst) { |
| 145 ScopedTestingPlatformSupport<AnimationWorkletTestPlatform> platform; |
| 146 |
144 // Create the first worklet and wait until it is initialized. | 147 // Create the first worklet and wait until it is initialized. |
145 std::unique_ptr<AnimationWorkletThread> firstWorklet = | 148 std::unique_ptr<AnimationWorkletThread> firstWorklet = |
146 createAnimationWorkletThread(); | 149 createAnimationWorkletThread(); |
147 WebThreadSupportingGC* firstThread = | 150 WebThreadSupportingGC* firstThread = |
148 &firstWorklet->workerBackingThread().backingThread(); | 151 &firstWorklet->workerBackingThread().backingThread(); |
149 checkWorkletCanExecuteScript(firstWorklet.get()); | 152 checkWorkletCanExecuteScript(firstWorklet.get()); |
150 v8::Isolate* firstIsolate = firstWorklet->isolate(); | 153 v8::Isolate* firstIsolate = firstWorklet->isolate(); |
151 ASSERT_TRUE(firstIsolate); | 154 ASSERT_TRUE(firstIsolate); |
152 | 155 |
153 // Create the second worklet and immediately destroy the first worklet. | 156 // Create the second worklet and immediately destroy the first worklet. |
(...skipping 15 matching lines...) Expand all Loading... |
169 | 172 |
170 // Verify that the worklet can still successfully execute script. | 173 // Verify that the worklet can still successfully execute script. |
171 checkWorkletCanExecuteScript(secondWorklet.get()); | 174 checkWorkletCanExecuteScript(secondWorklet.get()); |
172 | 175 |
173 secondWorklet->terminateAndWait(); | 176 secondWorklet->terminateAndWait(); |
174 } | 177 } |
175 | 178 |
176 // Tests that a new WebThread is created if all existing worklets are | 179 // Tests that a new WebThread is created if all existing worklets are |
177 // terminated before a new worklet is created. | 180 // terminated before a new worklet is created. |
178 TEST_F(AnimationWorkletThreadTest, TerminateFirstAndCreateSecond) { | 181 TEST_F(AnimationWorkletThreadTest, TerminateFirstAndCreateSecond) { |
| 182 ScopedTestingPlatformSupport<AnimationWorkletTestPlatform> platform; |
| 183 |
179 // Create the first worklet, wait until it is initialized, and terminate it. | 184 // Create the first worklet, wait until it is initialized, and terminate it. |
180 std::unique_ptr<AnimationWorkletThread> worklet = | 185 std::unique_ptr<AnimationWorkletThread> worklet = |
181 createAnimationWorkletThread(); | 186 createAnimationWorkletThread(); |
182 WebThreadSupportingGC* firstThread = | 187 WebThreadSupportingGC* firstThread = |
183 &worklet->workerBackingThread().backingThread(); | 188 &worklet->workerBackingThread().backingThread(); |
184 checkWorkletCanExecuteScript(worklet.get()); | 189 checkWorkletCanExecuteScript(worklet.get()); |
185 | 190 |
186 // We don't use terminateAndWait here to avoid forcible termination. | 191 // We don't use terminateAndWait here to avoid forcible termination. |
187 worklet->terminate(); | 192 worklet->terminate(); |
188 worklet->waitForShutdownForTesting(); | 193 worklet->waitForShutdownForTesting(); |
189 | 194 |
190 // Create the second worklet. The backing thread is same. | 195 // Create the second worklet. The backing thread is same. |
191 worklet = createAnimationWorkletThread(); | 196 worklet = createAnimationWorkletThread(); |
192 WebThreadSupportingGC* secondThread = | 197 WebThreadSupportingGC* secondThread = |
193 &worklet->workerBackingThread().backingThread(); | 198 &worklet->workerBackingThread().backingThread(); |
194 EXPECT_EQ(firstThread, secondThread); | 199 EXPECT_EQ(firstThread, secondThread); |
195 checkWorkletCanExecuteScript(worklet.get()); | 200 checkWorkletCanExecuteScript(worklet.get()); |
196 | 201 |
197 worklet->terminateAndWait(); | 202 worklet->terminateAndWait(); |
198 } | 203 } |
199 | 204 |
200 // Tests that v8::Isolate and WebThread are correctly set-up if a worklet is | 205 // Tests that v8::Isolate and WebThread are correctly set-up if a worklet is |
201 // created while another is terminating. | 206 // created while another is terminating. |
202 TEST_F(AnimationWorkletThreadTest, CreatingSecondDuringTerminationOfFirst) { | 207 TEST_F(AnimationWorkletThreadTest, CreatingSecondDuringTerminationOfFirst) { |
| 208 ScopedTestingPlatformSupport<AnimationWorkletTestPlatform> platform; |
| 209 |
203 std::unique_ptr<AnimationWorkletThread> firstWorklet = | 210 std::unique_ptr<AnimationWorkletThread> firstWorklet = |
204 createAnimationWorkletThread(); | 211 createAnimationWorkletThread(); |
205 checkWorkletCanExecuteScript(firstWorklet.get()); | 212 checkWorkletCanExecuteScript(firstWorklet.get()); |
206 v8::Isolate* firstIsolate = firstWorklet->isolate(); | 213 v8::Isolate* firstIsolate = firstWorklet->isolate(); |
207 ASSERT_TRUE(firstIsolate); | 214 ASSERT_TRUE(firstIsolate); |
208 | 215 |
209 // Request termination of the first worklet and create the second worklet | 216 // Request termination of the first worklet and create the second worklet |
210 // as soon as possible. | 217 // as soon as possible. |
211 firstWorklet->terminate(); | 218 firstWorklet->terminate(); |
212 // We don't wait for its termination. | 219 // We don't wait for its termination. |
213 // Note: We rely on the assumption that the termination steps don't run | 220 // Note: We rely on the assumption that the termination steps don't run |
214 // on the worklet thread so quickly. This could be a source of flakiness. | 221 // on the worklet thread so quickly. This could be a source of flakiness. |
215 | 222 |
216 std::unique_ptr<AnimationWorkletThread> secondWorklet = | 223 std::unique_ptr<AnimationWorkletThread> secondWorklet = |
217 createAnimationWorkletThread(); | 224 createAnimationWorkletThread(); |
218 | 225 |
219 v8::Isolate* secondIsolate = secondWorklet->isolate(); | 226 v8::Isolate* secondIsolate = secondWorklet->isolate(); |
220 ASSERT_TRUE(secondIsolate); | 227 ASSERT_TRUE(secondIsolate); |
221 EXPECT_EQ(firstIsolate, secondIsolate); | 228 EXPECT_EQ(firstIsolate, secondIsolate); |
222 | 229 |
223 // Verify that the isolate can run some scripts correctly in the second | 230 // Verify that the isolate can run some scripts correctly in the second |
224 // worklet. | 231 // worklet. |
225 checkWorkletCanExecuteScript(secondWorklet.get()); | 232 checkWorkletCanExecuteScript(secondWorklet.get()); |
226 secondWorklet->terminateAndWait(); | 233 secondWorklet->terminateAndWait(); |
227 } | 234 } |
228 | 235 |
229 } // namespace blink | 236 } // namespace blink |
OLD | NEW |