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 |