| 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 |