| 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 "core/dom/ScriptRunner.h" | 5 #include "core/dom/ScriptRunner.h" |
| 6 | 6 |
| 7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
| 8 #include "core/dom/Element.h" | 8 #include "core/dom/Element.h" |
| 9 #include "core/dom/ScriptLoader.h" | 9 #include "core/dom/ScriptLoader.h" |
| 10 #include "platform/heap/Handle.h" | 10 #include "platform/heap/Handle.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 : ScriptLoader(element, false, false, false) {} | 38 : ScriptLoader(element, false, false, false) {} |
| 39 }; | 39 }; |
| 40 | 40 |
| 41 class ScriptRunnerTest : public testing::Test { | 41 class ScriptRunnerTest : public testing::Test { |
| 42 public: | 42 public: |
| 43 ScriptRunnerTest() | 43 ScriptRunnerTest() |
| 44 : m_document(Document::create()), | 44 : m_document(Document::create()), |
| 45 m_element(m_document->createElement("foo", ASSERT_NO_EXCEPTION)) {} | 45 m_element(m_document->createElement("foo", ASSERT_NO_EXCEPTION)) {} |
| 46 | 46 |
| 47 void SetUp() override { | 47 void SetUp() override { |
| 48 // We have to create ScriptRunner after initializing platform, because we ne
ed | 48 // We have to create ScriptRunner after initializing platform, because we |
| 49 // Platform::current()->currentThread()->scheduler()->loadingTaskRunner() | 49 // need Platform::current()->currentThread()->scheduler()-> |
| 50 // to be initialized before creating ScriptRunner to save it in constructor. | 50 // loadingTaskRunner() to be initialized before creating ScriptRunner to |
| 51 // save it in constructor. |
| 51 m_scriptRunner = ScriptRunner::create(m_document.get()); | 52 m_scriptRunner = ScriptRunner::create(m_document.get()); |
| 52 } | 53 } |
| 53 | 54 |
| 54 void TearDown() override { m_scriptRunner.release(); } | 55 void TearDown() override { m_scriptRunner.release(); } |
| 55 | 56 |
| 56 Persistent<Document> m_document; | 57 Persistent<Document> m_document; |
| 57 Persistent<Element> m_element; | 58 Persistent<Element> m_element; |
| 58 TestingPlatformSupportWithMockScheduler m_platform; | 59 TestingPlatformSupportWithMockScheduler m_platform; |
| 59 Persistent<ScriptRunner> m_scriptRunner; | 60 Persistent<ScriptRunner> m_scriptRunner; |
| 60 WTF::Vector<int> m_order; | 61 WTF::Vector<int> m_order; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 scriptLoader = scriptLoader3; | 189 scriptLoader = scriptLoader3; |
| 189 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this] { | 190 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this] { |
| 190 m_order.append(2); | 191 m_order.append(2); |
| 191 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async); | 192 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async); |
| 192 })); | 193 })); |
| 193 | 194 |
| 194 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 195 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
| 195 m_order.append(3); | 196 m_order.append(3); |
| 196 })); | 197 })); |
| 197 | 198 |
| 198 // Make sure that re-entrant calls to notifyScriptReady don't cause ScriptRunn
er::execute to do | 199 // Make sure that re-entrant calls to notifyScriptReady don't cause |
| 199 // more work than expected. | 200 // ScriptRunner::execute to do more work than expected. |
| 200 m_platform.runSingleTask(); | 201 m_platform.runSingleTask(); |
| 201 EXPECT_THAT(m_order, ElementsAre(1)); | 202 EXPECT_THAT(m_order, ElementsAre(1)); |
| 202 | 203 |
| 203 m_platform.runSingleTask(); | 204 m_platform.runSingleTask(); |
| 204 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 205 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
| 205 | 206 |
| 206 m_platform.runSingleTask(); | 207 m_platform.runSingleTask(); |
| 207 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 208 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
| 208 } | 209 } |
| 209 | 210 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 234 m_order.append(2); | 235 m_order.append(2); |
| 235 m_scriptRunner->queueScriptForExecution(scriptLoader, | 236 m_scriptRunner->queueScriptForExecution(scriptLoader, |
| 236 ScriptRunner::InOrder); | 237 ScriptRunner::InOrder); |
| 237 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder); | 238 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder); |
| 238 })); | 239 })); |
| 239 | 240 |
| 240 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { | 241 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { |
| 241 m_order.append(3); | 242 m_order.append(3); |
| 242 })); | 243 })); |
| 243 | 244 |
| 244 // Make sure that re-entrant calls to queueScriptForExecution don't cause Scri
ptRunner::execute to do | 245 // Make sure that re-entrant calls to queueScriptForExecution don't cause |
| 245 // more work than expected. | 246 // ScriptRunner::execute to do more work than expected. |
| 246 m_platform.runSingleTask(); | 247 m_platform.runSingleTask(); |
| 247 EXPECT_THAT(m_order, ElementsAre(1)); | 248 EXPECT_THAT(m_order, ElementsAre(1)); |
| 248 | 249 |
| 249 m_platform.runSingleTask(); | 250 m_platform.runSingleTask(); |
| 250 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 251 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
| 251 | 252 |
| 252 m_platform.runSingleTask(); | 253 m_platform.runSingleTask(); |
| 253 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 254 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
| 254 } | 255 } |
| 255 | 256 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 379 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
| 379 m_order.append(1); | 380 m_order.append(1); |
| 380 })); | 381 })); |
| 381 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 382 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
| 382 m_order.append(2); | 383 m_order.append(2); |
| 383 })); | 384 })); |
| 384 | 385 |
| 385 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder); | 386 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder); |
| 386 m_platform.runUntilIdle(); | 387 m_platform.runUntilIdle(); |
| 387 | 388 |
| 388 // At this moment all tasks can be already executed. Make sure that we do not
crash here. | 389 // At this moment all tasks can be already executed. Make sure that we do not |
| 390 // crash here. |
| 389 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder); | 391 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder); |
| 390 m_platform.runUntilIdle(); | 392 m_platform.runUntilIdle(); |
| 391 | 393 |
| 392 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 394 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
| 393 } | 395 } |
| 394 | 396 |
| 395 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner) { | 397 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner) { |
| 396 Persistent<MockScriptLoader> scriptLoader1 = | 398 Persistent<MockScriptLoader> scriptLoader1 = |
| 397 MockScriptLoader::create(m_element.get()); | 399 MockScriptLoader::create(m_element.get()); |
| 398 Persistent<MockScriptLoader> scriptLoader2 = | 400 Persistent<MockScriptLoader> scriptLoader2 = |
| 399 MockScriptLoader::create(m_element.get()); | 401 MockScriptLoader::create(m_element.get()); |
| 400 | 402 |
| 401 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); | 403 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); |
| 402 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); | 404 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); |
| 403 | 405 |
| 404 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async); | 406 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async); |
| 405 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async); | 407 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async); |
| 406 | 408 |
| 407 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async); | 409 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async); |
| 408 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async); | 410 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async); |
| 409 | 411 |
| 410 m_scriptRunner.release(); | 412 m_scriptRunner.release(); |
| 411 | 413 |
| 412 ThreadState::current()->collectAllGarbage(); | 414 ThreadState::current()->collectAllGarbage(); |
| 413 | 415 |
| 414 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do not
access dead object. | 416 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do not |
| 417 // access dead object. |
| 415 EXPECT_CALL(*scriptLoader1, execute()).Times(0); | 418 EXPECT_CALL(*scriptLoader1, execute()).Times(0); |
| 416 EXPECT_CALL(*scriptLoader2, execute()).Times(0); | 419 EXPECT_CALL(*scriptLoader2, execute()).Times(0); |
| 417 | 420 |
| 418 m_platform.runUntilIdle(); | 421 m_platform.runUntilIdle(); |
| 419 } | 422 } |
| 420 | 423 |
| 421 } // namespace blink | 424 } // namespace blink |
| OLD | NEW |