| 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" |
| 11 #include "platform/scheduler/CancellableTaskFactory.h" | 11 #include "platform/scheduler/CancellableTaskFactory.h" |
| 12 #include "platform/testing/TestingPlatformSupport.h" | 12 #include "platform/testing/TestingPlatformSupport.h" |
| 13 #include "public/platform/Platform.h" | 13 #include "public/platform/Platform.h" |
| 14 #include "public/platform/WebViewScheduler.h" | 14 #include "public/platform/WebViewScheduler.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 using ::testing::Invoke; | 18 using ::testing::Invoke; |
| 19 using ::testing::ElementsAre; | 19 using ::testing::ElementsAre; |
| 20 using ::testing::Return; | 20 using ::testing::Return; |
| 21 using ::testing::WhenSorted; | 21 using ::testing::WhenSorted; |
| 22 using ::testing::ElementsAreArray; | 22 using ::testing::ElementsAreArray; |
| 23 | 23 |
| 24 namespace blink { | 24 namespace blink { |
| 25 | 25 |
| 26 class MockScriptLoader final : public ScriptLoader { | 26 class MockScriptLoader final : public ScriptLoader { |
| 27 public: | 27 public: |
| 28 static PassOwnPtrWillBeRawPtr<MockScriptLoader> create(Element* element) | 28 static RawPtr<MockScriptLoader> create(Element* element) |
| 29 { | 29 { |
| 30 return adoptPtrWillBeNoop(new MockScriptLoader(element)); | 30 return new MockScriptLoader(element); |
| 31 } | 31 } |
| 32 ~MockScriptLoader() override { } | 32 ~MockScriptLoader() override { } |
| 33 | 33 |
| 34 MOCK_METHOD0(execute, void()); | 34 MOCK_METHOD0(execute, void()); |
| 35 MOCK_CONST_METHOD0(isReady, bool()); | 35 MOCK_CONST_METHOD0(isReady, bool()); |
| 36 private: | 36 private: |
| 37 explicit MockScriptLoader(Element* element) : ScriptLoader(element, false, f
alse) | 37 explicit MockScriptLoader(Element* element) : ScriptLoader(element, false, f
alse) |
| 38 { | 38 { |
| 39 } | 39 } |
| 40 }; | 40 }; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 53 // Platform::current()->currentThread()->scheduler()->loadingTaskRunner(
) | 53 // Platform::current()->currentThread()->scheduler()->loadingTaskRunner(
) |
| 54 // to be initialized before creating ScriptRunner to save it in construc
tor. | 54 // to be initialized before creating ScriptRunner to save it in construc
tor. |
| 55 m_scriptRunner = ScriptRunner::create(m_document.get()); | 55 m_scriptRunner = ScriptRunner::create(m_document.get()); |
| 56 } | 56 } |
| 57 | 57 |
| 58 void TearDown() override | 58 void TearDown() override |
| 59 { | 59 { |
| 60 m_scriptRunner.release(); | 60 m_scriptRunner.release(); |
| 61 } | 61 } |
| 62 | 62 |
| 63 RefPtrWillBePersistent<Document> m_document; | 63 Persistent<Document> m_document; |
| 64 RefPtrWillBePersistent<Element> m_element; | 64 Persistent<Element> m_element; |
| 65 TestingPlatformSupportWithMockScheduler m_platform; | 65 TestingPlatformSupportWithMockScheduler m_platform; |
| 66 OwnPtrWillBePersistent<ScriptRunner> m_scriptRunner; | 66 Persistent<ScriptRunner> m_scriptRunner; |
| 67 WTF::Vector<int> m_order; | 67 WTF::Vector<int> m_order; |
| 68 }; | 68 }; |
| 69 | 69 |
| 70 TEST_F(ScriptRunnerTest, QueueSingleScript_Async) | 70 TEST_F(ScriptRunnerTest, QueueSingleScript_Async) |
| 71 { | 71 { |
| 72 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader = MockScriptLoader::create
(m_element.get()); | 72 RawPtr<MockScriptLoader> scriptLoader = MockScriptLoader::create(m_element.g
et()); |
| 73 m_scriptRunner->queueScriptForExecution(scriptLoader.get(), ScriptRunner::AS
YNC_EXECUTION); | 73 m_scriptRunner->queueScriptForExecution(scriptLoader.get(), ScriptRunner::AS
YNC_EXECUTION); |
| 74 m_scriptRunner->notifyScriptReady(scriptLoader.get(), ScriptRunner::ASYNC_EX
ECUTION); | 74 m_scriptRunner->notifyScriptReady(scriptLoader.get(), ScriptRunner::ASYNC_EX
ECUTION); |
| 75 | 75 |
| 76 EXPECT_CALL(*scriptLoader, execute()); | 76 EXPECT_CALL(*scriptLoader, execute()); |
| 77 m_platform.mockWebScheduler()->runAllTasks(); | 77 m_platform.mockWebScheduler()->runAllTasks(); |
| 78 } | 78 } |
| 79 | 79 |
| 80 TEST_F(ScriptRunnerTest, QueueSingleScript_InOrder) | 80 TEST_F(ScriptRunnerTest, QueueSingleScript_InOrder) |
| 81 { | 81 { |
| 82 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader = MockScriptLoader::create
(m_element.get()); | 82 RawPtr<MockScriptLoader> scriptLoader = MockScriptLoader::create(m_element.g
et()); |
| 83 m_scriptRunner->queueScriptForExecution(scriptLoader.get(), ScriptRunner::IN
_ORDER_EXECUTION); | 83 m_scriptRunner->queueScriptForExecution(scriptLoader.get(), ScriptRunner::IN
_ORDER_EXECUTION); |
| 84 | 84 |
| 85 EXPECT_CALL(*scriptLoader, isReady()).WillOnce(Return(true)); | 85 EXPECT_CALL(*scriptLoader, isReady()).WillOnce(Return(true)); |
| 86 EXPECT_CALL(*scriptLoader, execute()); | 86 EXPECT_CALL(*scriptLoader, execute()); |
| 87 | 87 |
| 88 m_scriptRunner->notifyScriptReady(scriptLoader.get(), ScriptRunner::IN_ORDER
_EXECUTION); | 88 m_scriptRunner->notifyScriptReady(scriptLoader.get(), ScriptRunner::IN_ORDER
_EXECUTION); |
| 89 | 89 |
| 90 m_platform.mockWebScheduler()->runAllTasks(); | 90 m_platform.mockWebScheduler()->runAllTasks(); |
| 91 } | 91 } |
| 92 | 92 |
| 93 TEST_F(ScriptRunnerTest, QueueMultipleScripts_InOrder) | 93 TEST_F(ScriptRunnerTest, QueueMultipleScripts_InOrder) |
| 94 { | 94 { |
| 95 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 95 RawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_element.
get()); |
| 96 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 96 RawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_element.
get()); |
| 97 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 97 RawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::create(m_element.
get()); |
| 98 | 98 |
| 99 WillBeHeapVector<RawPtrWillBeMember<MockScriptLoader>> scriptLoaders; | 99 HeapVector<Member<MockScriptLoader>> scriptLoaders; |
| 100 scriptLoaders.append(scriptLoader1.get()); | 100 scriptLoaders.append(scriptLoader1.get()); |
| 101 scriptLoaders.append(scriptLoader2.get()); | 101 scriptLoaders.append(scriptLoader2.get()); |
| 102 scriptLoaders.append(scriptLoader3.get()); | 102 scriptLoaders.append(scriptLoader3.get()); |
| 103 | 103 |
| 104 for (ScriptLoader* scriptLoader : scriptLoaders) { | 104 for (ScriptLoader* scriptLoader : scriptLoaders) { |
| 105 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::IN_O
RDER_EXECUTION); | 105 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::IN_O
RDER_EXECUTION); |
| 106 } | 106 } |
| 107 | 107 |
| 108 for (size_t i = 0; i < scriptLoaders.size(); ++i) { | 108 for (size_t i = 0; i < scriptLoaders.size(); ++i) { |
| 109 EXPECT_CALL(*scriptLoaders[i], execute()) | 109 EXPECT_CALL(*scriptLoaders[i], execute()) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 127 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::IN_ORD
ER_EXECUTION); | 127 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::IN_ORD
ER_EXECUTION); |
| 128 m_platform.mockWebScheduler()->runAllTasks(); | 128 m_platform.mockWebScheduler()->runAllTasks(); |
| 129 } | 129 } |
| 130 | 130 |
| 131 // But ensure the scripts were run in the expected order. | 131 // But ensure the scripts were run in the expected order. |
| 132 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 132 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
| 133 } | 133 } |
| 134 | 134 |
| 135 TEST_F(ScriptRunnerTest, QueueMixedScripts) | 135 TEST_F(ScriptRunnerTest, QueueMixedScripts) |
| 136 { | 136 { |
| 137 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 137 RawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_element.
get()); |
| 138 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 138 RawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_element.
get()); |
| 139 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 139 RawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::create(m_element.
get()); |
| 140 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader4 = MockScriptLoader::creat
e(m_element.get()); | 140 RawPtr<MockScriptLoader> scriptLoader4 = MockScriptLoader::create(m_element.
get()); |
| 141 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader5 = MockScriptLoader::creat
e(m_element.get()); | 141 RawPtr<MockScriptLoader> scriptLoader5 = MockScriptLoader::create(m_element.
get()); |
| 142 | 142 |
| 143 | 143 |
| 144 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 144 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 145 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 145 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 146 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 146 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 147 m_scriptRunner->queueScriptForExecution(scriptLoader4.get(), ScriptRunner::A
SYNC_EXECUTION); | 147 m_scriptRunner->queueScriptForExecution(scriptLoader4.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 148 m_scriptRunner->queueScriptForExecution(scriptLoader5.get(), ScriptRunner::A
SYNC_EXECUTION); | 148 m_scriptRunner->queueScriptForExecution(scriptLoader5.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 149 | 149 |
| 150 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); | 150 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); |
| 151 EXPECT_CALL(*scriptLoader2, isReady()) | 151 EXPECT_CALL(*scriptLoader2, isReady()) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 181 })); | 181 })); |
| 182 | 182 |
| 183 m_platform.mockWebScheduler()->runAllTasks(); | 183 m_platform.mockWebScheduler()->runAllTasks(); |
| 184 | 184 |
| 185 // Async tasks are expected to run first. | 185 // Async tasks are expected to run first. |
| 186 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); | 186 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); |
| 187 } | 187 } |
| 188 | 188 |
| 189 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async) | 189 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async) |
| 190 { | 190 { |
| 191 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 191 RawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_element.
get()); |
| 192 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 192 RawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_element.
get()); |
| 193 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 193 RawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::create(m_element.
get()); |
| 194 | 194 |
| 195 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); | 195 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 196 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); | 196 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 197 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); | 197 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 198 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); | 198 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); |
| 199 | 199 |
| 200 MockScriptLoader* scriptLoader = scriptLoader2.get(); | 200 MockScriptLoader* scriptLoader = scriptLoader2.get(); |
| 201 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this]
{ | 201 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this]
{ |
| 202 m_order.append(1); | 202 m_order.append(1); |
| 203 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC
UTION); | 203 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC
UTION); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 220 | 220 |
| 221 m_platform.mockWebScheduler()->runSingleTask(); | 221 m_platform.mockWebScheduler()->runSingleTask(); |
| 222 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 222 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
| 223 | 223 |
| 224 m_platform.mockWebScheduler()->runSingleTask(); | 224 m_platform.mockWebScheduler()->runSingleTask(); |
| 225 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 225 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
| 226 } | 226 } |
| 227 | 227 |
| 228 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder) | 228 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder) |
| 229 { | 229 { |
| 230 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 230 RawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_element.
get()); |
| 231 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 231 RawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_element.
get()); |
| 232 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 232 RawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::create(m_element.
get()); |
| 233 | 233 |
| 234 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); | 234 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); |
| 235 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); | 235 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); |
| 236 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); | 236 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); |
| 237 | 237 |
| 238 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 238 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 239 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::IN_ORDE
R_EXECUTION); | 239 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::IN_ORDE
R_EXECUTION); |
| 240 | 240 |
| 241 MockScriptLoader* scriptLoader = scriptLoader2.get(); | 241 MockScriptLoader* scriptLoader = scriptLoader2.get(); |
| 242 EXPECT_CALL(*scriptLoader1, execute()) | 242 EXPECT_CALL(*scriptLoader1, execute()) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 265 | 265 |
| 266 m_platform.mockWebScheduler()->runSingleTask(); | 266 m_platform.mockWebScheduler()->runSingleTask(); |
| 267 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 267 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
| 268 | 268 |
| 269 m_platform.mockWebScheduler()->runSingleTask(); | 269 m_platform.mockWebScheduler()->runSingleTask(); |
| 270 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 270 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
| 271 } | 271 } |
| 272 | 272 |
| 273 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts) | 273 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts) |
| 274 { | 274 { |
| 275 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoaders[20]; | 275 RawPtr<MockScriptLoader> scriptLoaders[20]; |
| 276 for (int i = 0; i < 20; i++) | 276 for (int i = 0; i < 20; i++) |
| 277 scriptLoaders[i] = nullptr; | 277 scriptLoaders[i] = nullptr; |
| 278 | 278 |
| 279 for (int i = 0; i < 20; i++) { | 279 for (int i = 0; i < 20; i++) { |
| 280 scriptLoaders[i] = MockScriptLoader::create(m_element.get()); | 280 scriptLoaders[i] = MockScriptLoader::create(m_element.get()); |
| 281 EXPECT_CALL(*scriptLoaders[i], isReady()).WillRepeatedly(Return(true)); | 281 EXPECT_CALL(*scriptLoaders[i], isReady()).WillRepeatedly(Return(true)); |
| 282 | 282 |
| 283 m_scriptRunner->queueScriptForExecution(scriptLoaders[i].get(), ScriptRu
nner::ASYNC_EXECUTION); | 283 m_scriptRunner->queueScriptForExecution(scriptLoaders[i].get(), ScriptRu
nner::ASYNC_EXECUTION); |
| 284 | 284 |
| 285 if (i > 0) { | 285 if (i > 0) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 302 | 302 |
| 303 int expected[] = { | 303 int expected[] = { |
| 304 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 | 304 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 |
| 305 }; | 305 }; |
| 306 | 306 |
| 307 EXPECT_THAT(m_order, testing::ElementsAreArray(expected)); | 307 EXPECT_THAT(m_order, testing::ElementsAreArray(expected)); |
| 308 } | 308 } |
| 309 | 309 |
| 310 TEST_F(ScriptRunnerTest, ResumeAndSuspend_InOrder) | 310 TEST_F(ScriptRunnerTest, ResumeAndSuspend_InOrder) |
| 311 { | 311 { |
| 312 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 312 RawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_element.
get()); |
| 313 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 313 RawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_element.
get()); |
| 314 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 314 RawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::create(m_element.
get()); |
| 315 | 315 |
| 316 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 316 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 317 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 317 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 318 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 318 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 319 | 319 |
| 320 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 320 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
| 321 m_order.append(1); | 321 m_order.append(1); |
| 322 })); | 322 })); |
| 323 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 323 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
| 324 m_order.append(2); | 324 m_order.append(2); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 352 m_scriptRunner->suspend(); | 352 m_scriptRunner->suspend(); |
| 353 m_scriptRunner->resume(); | 353 m_scriptRunner->resume(); |
| 354 m_platform.mockWebScheduler()->runAllTasks(); | 354 m_platform.mockWebScheduler()->runAllTasks(); |
| 355 | 355 |
| 356 // Make sure elements are correct and in right order. | 356 // Make sure elements are correct and in right order. |
| 357 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); | 357 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); |
| 358 } | 358 } |
| 359 | 359 |
| 360 TEST_F(ScriptRunnerTest, ResumeAndSuspend_Async) | 360 TEST_F(ScriptRunnerTest, ResumeAndSuspend_Async) |
| 361 { | 361 { |
| 362 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 362 RawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_element.
get()); |
| 363 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 363 RawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_element.
get()); |
| 364 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::creat
e(m_element.get()); | 364 RawPtr<MockScriptLoader> scriptLoader3 = MockScriptLoader::create(m_element.
get()); |
| 365 | 365 |
| 366 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); | 366 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 367 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); | 367 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 368 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); | 368 m_scriptRunner->queueScriptForExecution(scriptLoader3.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 369 | 369 |
| 370 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); | 370 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); |
| 371 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::ASYNC_E
XECUTION); | 371 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::ASYNC_E
XECUTION); |
| 372 m_scriptRunner->notifyScriptReady(scriptLoader3.get(), ScriptRunner::ASYNC_E
XECUTION); | 372 m_scriptRunner->notifyScriptReady(scriptLoader3.get(), ScriptRunner::ASYNC_E
XECUTION); |
| 373 | 373 |
| 374 EXPECT_CALL(*scriptLoader1, execute()) | 374 EXPECT_CALL(*scriptLoader1, execute()) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 388 m_scriptRunner->suspend(); | 388 m_scriptRunner->suspend(); |
| 389 m_scriptRunner->resume(); | 389 m_scriptRunner->resume(); |
| 390 m_platform.mockWebScheduler()->runAllTasks(); | 390 m_platform.mockWebScheduler()->runAllTasks(); |
| 391 | 391 |
| 392 // Make sure elements are correct. | 392 // Make sure elements are correct. |
| 393 EXPECT_THAT(m_order, WhenSorted(ElementsAre(1, 2, 3))); | 393 EXPECT_THAT(m_order, WhenSorted(ElementsAre(1, 2, 3))); |
| 394 } | 394 } |
| 395 | 395 |
| 396 TEST_F(ScriptRunnerTest, LateNotifications) | 396 TEST_F(ScriptRunnerTest, LateNotifications) |
| 397 { | 397 { |
| 398 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::creat
e(m_element.get()); | 398 RawPtr<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_element.
get()); |
| 399 OwnPtrWillBeRawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::creat
e(m_element.get()); | 399 RawPtr<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_element.
get()); |
| 400 | 400 |
| 401 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); | 401 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); |
| 402 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); | 402 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); |
| 403 | 403 |
| 404 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 404 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 405 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); | 405 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::I
N_ORDER_EXECUTION); |
| 406 | 406 |
| 407 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { | 407 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { |
| 408 m_order.append(1); | 408 m_order.append(1); |
| 409 })); | 409 })); |
| 410 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { | 410 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { |
| 411 m_order.append(2); | 411 m_order.append(2); |
| 412 })); | 412 })); |
| 413 | 413 |
| 414 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::IN_ORDE
R_EXECUTION); | 414 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::IN_ORDE
R_EXECUTION); |
| 415 m_platform.mockWebScheduler()->runAllTasks(); | 415 m_platform.mockWebScheduler()->runAllTasks(); |
| 416 | 416 |
| 417 // At this moment all tasks can be already executed. Make sure that we do no
t crash here. | 417 // At this moment all tasks can be already executed. Make sure that we do no
t crash here. |
| 418 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::IN_ORDE
R_EXECUTION); | 418 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::IN_ORDE
R_EXECUTION); |
| 419 m_platform.mockWebScheduler()->runAllTasks(); | 419 m_platform.mockWebScheduler()->runAllTasks(); |
| 420 | 420 |
| 421 EXPECT_THAT(m_order, ElementsAre(1, 2)); | 421 EXPECT_THAT(m_order, ElementsAre(1, 2)); |
| 422 } | 422 } |
| 423 | 423 |
| 424 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner) | 424 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner) |
| 425 { | 425 { |
| 426 OwnPtrWillBePersistent<MockScriptLoader> scriptLoader1 = MockScriptLoader::c
reate(m_element.get()); | 426 Persistent<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_elem
ent.get()); |
| 427 OwnPtrWillBePersistent<MockScriptLoader> scriptLoader2 = MockScriptLoader::c
reate(m_element.get()); | 427 Persistent<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_elem
ent.get()); |
| 428 | 428 |
| 429 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); | 429 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); |
| 430 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); | 430 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); |
| 431 | 431 |
| 432 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); | 432 m_scriptRunner->queueScriptForExecution(scriptLoader1.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 433 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); | 433 m_scriptRunner->queueScriptForExecution(scriptLoader2.get(), ScriptRunner::A
SYNC_EXECUTION); |
| 434 | 434 |
| 435 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); | 435 m_scriptRunner->notifyScriptReady(scriptLoader1.get(), ScriptRunner::ASYNC_E
XECUTION); |
| 436 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::ASYNC_E
XECUTION); | 436 m_scriptRunner->notifyScriptReady(scriptLoader2.get(), ScriptRunner::ASYNC_E
XECUTION); |
| 437 | 437 |
| 438 m_scriptRunner.release(); | 438 m_scriptRunner.release(); |
| 439 | 439 |
| 440 #if ENABLE(OILPAN) | 440 #if ENABLE(OILPAN) |
| 441 Heap::collectAllGarbage(); | 441 Heap::collectAllGarbage(); |
| 442 #endif | 442 #endif |
| 443 | 443 |
| 444 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do n
ot access dead object. | 444 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do n
ot access dead object. |
| 445 EXPECT_CALL(*scriptLoader1, execute()).Times(0); | 445 EXPECT_CALL(*scriptLoader1, execute()).Times(0); |
| 446 EXPECT_CALL(*scriptLoader2, execute()).Times(0); | 446 EXPECT_CALL(*scriptLoader2, execute()).Times(0); |
| 447 | 447 |
| 448 m_platform.mockWebScheduler()->runAllTasks(); | 448 m_platform.mockWebScheduler()->runAllTasks(); |
| 449 } | 449 } |
| 450 | 450 |
| 451 } // namespace blink | 451 } // namespace blink |
| OLD | NEW |