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 "config.h" | 5 #include "config.h" |
6 #include "core/dom/ScriptRunner.h" | 6 #include "core/dom/ScriptRunner.h" |
7 | 7 |
8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/Element.h" | 9 #include "core/dom/Element.h" |
10 #include "core/dom/ScriptLoader.h" | 10 #include "core/dom/ScriptLoader.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 | 165 |
166 void TearDown() override | 166 void TearDown() override |
167 { | 167 { |
168 m_scriptRunner.release(); | 168 m_scriptRunner.release(); |
169 Platform::initialize(m_oldPlatform); | 169 Platform::initialize(m_oldPlatform); |
170 } | 170 } |
171 | 171 |
172 RefPtrWillBePersistent<Document> m_document; | 172 RefPtrWillBePersistent<Document> m_document; |
173 RefPtrWillBePersistent<Element> m_element; | 173 RefPtrWillBePersistent<Element> m_element; |
174 OwnPtrWillBePersistent<ScriptRunner> m_scriptRunner; | 174 OwnPtrWillBePersistent<ScriptRunner> m_scriptRunner; |
175 std::vector<int> m_order; // gmock matchers don't work nicely with WTF::Vect
or | 175 WTF::Vector<int> m_order; |
176 MockPlatform m_platform; | 176 MockPlatform m_platform; |
177 Platform* m_oldPlatform; // NOT OWNED | 177 Platform* m_oldPlatform; // NOT OWNED |
178 }; | 178 }; |
179 | 179 |
180 TEST_F(ScriptRunnerTest, QueueSingleScript_Async) | 180 TEST_F(ScriptRunnerTest, QueueSingleScript_Async) |
181 { | 181 { |
182 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader = MockScriptLoader::create
(m_element.get()); | 182 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader = MockScriptLoader::create
(m_element.get()); |
183 m_scriptRunner->queueScriptForExecution(scriptLoader.get(), ScriptRunner::AS
YNC_EXECUTION); | 183 m_scriptRunner->queueScriptForExecution(scriptLoader.get(), ScriptRunner::AS
YNC_EXECUTION); |
184 m_scriptRunner->notifyScriptReady(scriptLoader.get(), ScriptRunner::ASYNC_EX
ECUTION); | 184 m_scriptRunner->notifyScriptReady(scriptLoader.get(), ScriptRunner::ASYNC_EX
ECUTION); |
185 | 185 |
(...skipping 16 matching lines...) Expand all Loading... |
202 { | 202 { |
203 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 203 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); |
204 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 204 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); |
205 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 205 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); |
206 | 206 |
207 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 207 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
208 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 208 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
209 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 209 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
210 | 210 |
211 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 211 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
212 m_order.push_back(1); | 212 m_order.append(1); |
213 })); | 213 })); |
214 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 214 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
215 m_order.push_back(2); | 215 m_order.append(2); |
216 })); | 216 })); |
217 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 217 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
218 m_order.push_back(3); | 218 m_order.append(3); |
219 })); | 219 })); |
220 | 220 |
221 // Make the scripts become ready in reverse order. | 221 // Make the scripts become ready in reverse order. |
222 bool isReady[] = { false, false, false }; | 222 bool isReady[] = { false, false, false }; |
223 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Invoke([&isReady] { | 223 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Invoke([&isReady] { |
224 return isReady[0]; | 224 return isReady[0]; |
225 })); | 225 })); |
226 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Invoke([&isReady] { | 226 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Invoke([&isReady] { |
227 return isReady[1]; | 227 return isReady[1]; |
228 })); | 228 })); |
(...skipping 26 matching lines...) Expand all Loading... |
255 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 255 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
256 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 256 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
257 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 257 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
258 m_scriptRunner->queueScriptForExecution(scriptLoader4.get(), ScriptRunner::A
SYNC_EXECUTION); | 258 m_scriptRunner->queueScriptForExecution(scriptLoader4.get(), ScriptRunner::A
SYNC_EXECUTION); |
259 m_scriptRunner->queueScriptForExecution(scriptLoader5.get(), ScriptRunner::A
SYNC_EXECUTION); | 259 m_scriptRunner->queueScriptForExecution(scriptLoader5.get(), ScriptRunner::A
SYNC_EXECUTION); |
260 | 260 |
261 m_scriptRunner->notifyScriptReady(scriptLoader4.get(), ScriptRunner::ASYNC_E
XECUTION); | 261 m_scriptRunner->notifyScriptReady(scriptLoader4.get(), ScriptRunner::ASYNC_E
XECUTION); |
262 m_scriptRunner->notifyScriptReady(scriptLoader5.get(), ScriptRunner::ASYNC_E
XECUTION); | 262 m_scriptRunner->notifyScriptReady(scriptLoader5.get(), ScriptRunner::ASYNC_E
XECUTION); |
263 | 263 |
264 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 264 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
265 m_order.push_back(1); | 265 m_order.append(1); |
266 })); | 266 })); |
267 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 267 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
268 m_order.push_back(2); | 268 m_order.append(2); |
269 })); | 269 })); |
270 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 270 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
271 m_order.push_back(3); | 271 m_order.append(3); |
272 })); | 272 })); |
273 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] { | 273 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] { |
274 m_order.push_back(4); | 274 m_order.append(4); |
275 })); | 275 })); |
276 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] { | 276 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] { |
277 m_order.push_back(5); | 277 m_order.append(5); |
278 })); | 278 })); |
279 | 279 |
280 m_platform.runAllTasks(); | 280 m_platform.runAllTasks(); |
281 | 281 |
282 // Make sure the async scripts were run before the in-order ones. | 282 // Make sure the async scripts were run before the in-order ones. |
283 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); | 283 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); |
284 } | 284 } |
285 | 285 |
286 TEST_F(ScriptRunnerTest, QueueMixedScripts_YieldAfterEveryExecution) | 286 TEST_F(ScriptRunnerTest, QueueMixedScripts_YieldAfterEveryExecution) |
287 { | 287 { |
(...skipping 12 matching lines...) Expand all Loading... |
300 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 300 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
301 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 301 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
302 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 302 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
303 m_scriptRunner->queueScriptForExecution(scriptLoader4.get(), ScriptRunner::A
SYNC_EXECUTION); | 303 m_scriptRunner->queueScriptForExecution(scriptLoader4.get(), ScriptRunner::A
SYNC_EXECUTION); |
304 m_scriptRunner->queueScriptForExecution(scriptLoader5.get(), ScriptRunner::A
SYNC_EXECUTION); | 304 m_scriptRunner->queueScriptForExecution(scriptLoader5.get(), ScriptRunner::A
SYNC_EXECUTION); |
305 | 305 |
306 m_scriptRunner->notifyScriptReady(scriptLoader4.get(), ScriptRunner::ASYNC_E
XECUTION); | 306 m_scriptRunner->notifyScriptReady(scriptLoader4.get(), ScriptRunner::ASYNC_E
XECUTION); |
307 m_scriptRunner->notifyScriptReady(scriptLoader5.get(), ScriptRunner::ASYNC_E
XECUTION); | 307 m_scriptRunner->notifyScriptReady(scriptLoader5.get(), ScriptRunner::ASYNC_E
XECUTION); |
308 | 308 |
309 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 309 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
310 m_order.push_back(1); | 310 m_order.append(1); |
311 })); | 311 })); |
312 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 312 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
313 m_order.push_back(2); | 313 m_order.append(2); |
314 })); | 314 })); |
315 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 315 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
316 m_order.push_back(3); | 316 m_order.append(3); |
317 })); | 317 })); |
318 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] { | 318 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] { |
319 m_order.push_back(4); | 319 m_order.append(4); |
320 })); | 320 })); |
321 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] { | 321 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] { |
322 m_order.push_back(5); | 322 m_order.append(5); |
323 })); | 323 })); |
324 | 324 |
325 m_platform.runAllTasks(); | 325 m_platform.runAllTasks(); |
326 | 326 |
327 // Make sure the async scripts were run before the in-order ones. | 327 // Make sure the async scripts were run before the in-order ones. |
328 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); | 328 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); |
329 } | 329 } |
330 | 330 |
331 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async) | 331 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async) |
332 { | 332 { |
333 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 333 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); |
334 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 334 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); |
335 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 335 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); |
336 | 336 |
337 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); | 337 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); |
338 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); | 338 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); |
339 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); | 339 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); |
340 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); | 340 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); |
341 | 341 |
342 MockScriptLoader* scriptLoader = scriptLoader2.get(); | 342 MockScriptLoader* scriptLoader = scriptLoader2.get(); |
343 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this]
{ | 343 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this]
{ |
344 m_order.push_back(1); | 344 m_order.append(1); |
345 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC
UTION); | 345 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC
UTION); |
346 })); | 346 })); |
347 | 347 |
348 scriptLoader = scriptLoader3.get(); | 348 scriptLoader = scriptLoader3.get(); |
349 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this]
{ | 349 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this]
{ |
350 m_order.push_back(2); | 350 m_order.append(2); |
351 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC
UTION); | 351 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC
UTION); |
352 })); | 352 })); |
353 | 353 |
354 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 354 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
355 m_order.push_back(3); | 355 m_order.append(3); |
356 })); | 356 })); |
357 | 357 |
358 // Make sure that re-entrant calls to notifyScriptReady don't cause ScriptRu
nner::execute to do | 358 // Make sure that re-entrant calls to notifyScriptReady don't cause ScriptRu
nner::execute to do |
359 // more work than expected. | 359 // more work than expected. |
360 m_platform.runSingleTask(); | 360 m_platform.runSingleTask(); |
361 EXPECT_THAT(m_order, ElementsAre(1)); | 361 EXPECT_THAT(m_order, ElementsAre(1)); |
362 | 362 |
363 m_platform.runSingleTask(); | 363 m_platform.runSingleTask(); |
364 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 364 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
365 | 365 |
366 m_platform.runSingleTask(); | 366 m_platform.runSingleTask(); |
367 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 367 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
368 } | 368 } |
369 | 369 |
370 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder) | 370 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder) |
371 { | 371 { |
372 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 372 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); |
373 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 373 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); |
374 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 374 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); |
375 | 375 |
376 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); | 376 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); |
377 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); | 377 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); |
378 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); | 378 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); |
379 | 379 |
380 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 380 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
381 m_scriptRunner->resume(); | 381 m_scriptRunner->resume(); |
382 | 382 |
383 MockScriptLoader* scriptLoader = scriptLoader2.get(); | 383 MockScriptLoader* scriptLoader = scriptLoader2.get(); |
384 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this]
{ | 384 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this]
{ |
385 m_order.push_back(1); | 385 m_order.append(1); |
386 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::IN_O
RDER_EXECUTION); | 386 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::IN_O
RDER_EXECUTION); |
387 m_scriptRunner->resume(); | 387 m_scriptRunner->resume(); |
388 })); | 388 })); |
389 | 389 |
390 scriptLoader = scriptLoader3.get(); | 390 scriptLoader = scriptLoader3.get(); |
391 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this]
{ | 391 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this]
{ |
392 m_order.push_back(2); | 392 m_order.append(2); |
393 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::IN_O
RDER_EXECUTION); | 393 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::IN_O
RDER_EXECUTION); |
394 m_scriptRunner->resume(); | 394 m_scriptRunner->resume(); |
395 })); | 395 })); |
396 | 396 |
397 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 397 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
398 m_order.push_back(3); | 398 m_order.append(3); |
399 })); | 399 })); |
400 | 400 |
401 // Make sure that re-entrant calls to queueScriptForExecution don't cause Sc
riptRunner::execute to do | 401 // Make sure that re-entrant calls to queueScriptForExecution don't cause Sc
riptRunner::execute to do |
402 // more work than expected. | 402 // more work than expected. |
403 m_platform.runSingleTask(); | 403 m_platform.runSingleTask(); |
404 EXPECT_THAT(m_order, ElementsAre(1)); | 404 EXPECT_THAT(m_order, ElementsAre(1)); |
405 | 405 |
406 m_platform.runSingleTask(); | 406 m_platform.runSingleTask(); |
407 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 407 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
408 | 408 |
409 m_platform.runSingleTask(); | 409 m_platform.runSingleTask(); |
410 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 410 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
411 } | 411 } |
412 | 412 |
413 TEST_F(ScriptRunnerTest, ShouldYield_AsyncScripts) | 413 TEST_F(ScriptRunnerTest, ShouldYield_AsyncScripts) |
414 { | 414 { |
415 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 415 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); |
416 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 416 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); |
417 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 417 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); |
418 | 418 |
419 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); | 419 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); |
420 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); | 420 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); |
421 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); | 421 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); |
422 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); | 422 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); |
423 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::ASYNC_E
XECUTION); | 423 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::ASYNC_E
XECUTION); |
424 m_scriptRunner->notifyScriptReady(scriptLoader3.get(), ScriptRunner::ASYNC_E
XECUTION); | 424 m_scriptRunner->notifyScriptReady(scriptLoader3.get(), ScriptRunner::ASYNC_E
XECUTION); |
425 | 425 |
426 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 426 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
427 m_order.push_back(1); | 427 m_order.append(1); |
428 m_platform.setShouldYield(true); | 428 m_platform.setShouldYield(true); |
429 })); | 429 })); |
430 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 430 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
431 m_order.push_back(2); | 431 m_order.append(2); |
432 })); | 432 })); |
433 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 433 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
434 m_order.push_back(3); | 434 m_order.append(3); |
435 })); | 435 })); |
436 | 436 |
437 m_platform.runSingleTask(); | 437 m_platform.runSingleTask(); |
438 EXPECT_THAT(m_order, ElementsAre(1)); | 438 EXPECT_THAT(m_order, ElementsAre(1)); |
439 | 439 |
440 // Make sure the interrupted tasks are executed next 'tick'. | 440 // Make sure the interrupted tasks are executed next 'tick'. |
441 m_platform.setShouldYield(false); | 441 m_platform.setShouldYield(false); |
442 m_platform.runSingleTask(); | 442 m_platform.runSingleTask(); |
443 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 443 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
444 } | 444 } |
445 | 445 |
446 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts) | 446 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts) |
447 { | 447 { |
448 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoaders[20]; | 448 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoaders[20]; |
449 for (int i = 0; i < 20; i++) | 449 for (int i = 0; i < 20; i++) |
450 scriptLoaders[i] = nullptr; | 450 scriptLoaders[i] = nullptr; |
451 | 451 |
452 for (int i = 0; i < 20; i++) { | 452 for (int i = 0; i < 20; i++) { |
453 scriptLoaders[i] = MockScriptLoader::create(m_element.get()); | 453 scriptLoaders[i] = MockScriptLoader::create(m_element.get()); |
454 EXPECT_CALL(*scriptLoaders[i], isReady()).WillRepeatedly(Return(true)); | 454 EXPECT_CALL(*scriptLoaders[i], isReady()).WillRepeatedly(Return(true)); |
455 | 455 |
456 m_scriptRunner->queueScriptForExecution(scriptLoaders[i].get(), ScriptRu
nner::ASYNC_EXECUTION); | 456 m_scriptRunner->queueScriptForExecution(scriptLoaders[i].get(), ScriptRu
nner::ASYNC_EXECUTION); |
457 | 457 |
458 if (i > 0) { | 458 if (i > 0) { |
459 EXPECT_CALL(*scriptLoaders[i], execute()).WillOnce(Invoke([this, i]
{ | 459 EXPECT_CALL(*scriptLoaders[i], execute()).WillOnce(Invoke([this, i]
{ |
460 m_order.push_back(i); | 460 m_order.append(i); |
461 })); | 461 })); |
462 } | 462 } |
463 } | 463 } |
464 | 464 |
465 m_scriptRunner->notifyScriptReady(scriptLoaders[0].get(), ScriptRunner::ASYN
C_EXECUTION); | 465 m_scriptRunner->notifyScriptReady(scriptLoaders[0].get(), ScriptRunner::ASYN
C_EXECUTION); |
466 m_scriptRunner->notifyScriptReady(scriptLoaders[1].get(), ScriptRunner::ASYN
C_EXECUTION); | 466 m_scriptRunner->notifyScriptReady(scriptLoaders[1].get(), ScriptRunner::ASYN
C_EXECUTION); |
467 m_scriptRunner->resume(); | 467 m_scriptRunner->resume(); |
468 | 468 |
469 EXPECT_CALL(*scriptLoaders[0], execute()).WillOnce(Invoke([&scriptLoaders, t
his] { | 469 EXPECT_CALL(*scriptLoaders[0], execute()).WillOnce(Invoke([&scriptLoaders, t
his] { |
470 for (int i = 2; i < 20; i++) | 470 for (int i = 2; i < 20; i++) |
471 m_scriptRunner->notifyScriptReady(scriptLoaders[i].get(), ScriptRunn
er::ASYNC_EXECUTION); | 471 m_scriptRunner->notifyScriptReady(scriptLoaders[i].get(), ScriptRunn
er::ASYNC_EXECUTION); |
472 m_scriptRunner->resume(); | 472 m_scriptRunner->resume(); |
473 m_order.push_back(0); | 473 m_order.append(0); |
474 })); | 474 })); |
475 | 475 |
476 m_platform.runAllTasks(); | 476 m_platform.runAllTasks(); |
477 | 477 |
478 int expected[] = { | 478 int expected[] = { |
479 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 | 479 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 |
480 }; | 480 }; |
481 | 481 |
482 EXPECT_THAT(m_order, testing::ElementsAreArray(expected)); | 482 EXPECT_THAT(m_order, testing::ElementsAreArray(expected)); |
483 } | 483 } |
484 | 484 |
485 TEST_F(ScriptRunnerTest, ShouldYield_InOrderScripts) | 485 TEST_F(ScriptRunnerTest, ShouldYield_InOrderScripts) |
486 { | 486 { |
487 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 487 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); |
488 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 488 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); |
489 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 489 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); |
490 | 490 |
491 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); | 491 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); |
492 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); | 492 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); |
493 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); | 493 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); |
494 | 494 |
495 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 495 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
496 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 496 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
497 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 497 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
498 m_scriptRunner->resume(); | 498 m_scriptRunner->resume(); |
499 | 499 |
500 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 500 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
501 m_order.push_back(1); | 501 m_order.append(1); |
502 m_platform.setShouldYield(true); | 502 m_platform.setShouldYield(true); |
503 })); | 503 })); |
504 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 504 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
505 m_order.push_back(2); | 505 m_order.append(2); |
506 })); | 506 })); |
507 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 507 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
508 m_order.push_back(3); | 508 m_order.append(3); |
509 })); | 509 })); |
510 | 510 |
511 m_platform.runSingleTask(); | 511 m_platform.runSingleTask(); |
512 EXPECT_THAT(m_order, ElementsAre(1)); | 512 EXPECT_THAT(m_order, ElementsAre(1)); |
513 | 513 |
514 // Make sure the interrupted tasks are executed next 'tick'. | 514 // Make sure the interrupted tasks are executed next 'tick'. |
515 m_platform.setShouldYield(false); | 515 m_platform.setShouldYield(false); |
516 m_platform.runSingleTask(); | 516 m_platform.runSingleTask(); |
517 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 517 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
518 } | 518 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 testing::Mock::VerifyAndClear(scriptLoader2.get()); | 572 testing::Mock::VerifyAndClear(scriptLoader2.get()); |
573 testing::Mock::VerifyAndClear(scriptLoader3.get()); | 573 testing::Mock::VerifyAndClear(scriptLoader3.get()); |
574 EXPECT_CALL(*scriptLoader2, execute()).Times(1); | 574 EXPECT_CALL(*scriptLoader2, execute()).Times(1); |
575 EXPECT_CALL(*scriptLoader3, execute()).Times(1); | 575 EXPECT_CALL(*scriptLoader3, execute()).Times(1); |
576 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); | 576 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); |
577 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); | 577 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); |
578 m_platform.runAllTasks(); | 578 m_platform.runAllTasks(); |
579 } | 579 } |
580 | 580 |
581 } // namespace blink | 581 } // namespace blink |
OLD | NEW |