Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(116)

Side by Side Diff: third_party/WebKit/Source/core/dom/ScriptRunnerTest.cpp

Issue 2588403002: TestingPlatformSupport: register Platform instance correctly (Closed)
Patch Set: review #16 and merge master Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/testing/TestingPlatformSupport.h" 11 #include "platform/testing/TestingPlatformSupport.h"
12 #include "public/platform/Platform.h" 12 #include "public/platform/Platform.h"
13 #include "public/platform/WebViewScheduler.h" 13 #include "public/platform/WebViewScheduler.h"
14 #include "testing/gmock/include/gmock/gmock.h" 14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "wtf/PtrUtil.h"
16 17
17 using ::testing::Invoke; 18 using ::testing::Invoke;
18 using ::testing::ElementsAre; 19 using ::testing::ElementsAre;
19 using ::testing::Return; 20 using ::testing::Return;
20 using ::testing::WhenSorted; 21 using ::testing::WhenSorted;
21 using ::testing::ElementsAreArray; 22 using ::testing::ElementsAreArray;
22 23
23 namespace blink { 24 namespace blink {
24 25
25 class MockScriptLoader final : public ScriptLoader { 26 class MockScriptLoader final : public ScriptLoader {
(...skipping 11 matching lines...) Expand all
37 : ScriptLoader(element, false, false, false) {} 38 : ScriptLoader(element, false, false, false) {}
38 }; 39 };
39 40
40 class ScriptRunnerTest : public testing::Test { 41 class ScriptRunnerTest : public testing::Test {
41 public: 42 public:
42 ScriptRunnerTest() 43 ScriptRunnerTest()
43 : m_document(Document::create()), 44 : m_document(Document::create()),
44 m_element(m_document->createElement("foo")) {} 45 m_element(m_document->createElement("foo")) {}
45 46
46 void SetUp() override { 47 void SetUp() override {
48 m_platform.reset(
49 WTF::makeUnique<TestingPlatformSupportWithMockScheduler>());
47 // We have to create ScriptRunner after initializing platform, because we 50 // We have to create ScriptRunner after initializing platform, because we
48 // need Platform::current()->currentThread()->scheduler()-> 51 // need Platform::current()->currentThread()->scheduler()->
49 // loadingTaskRunner() to be initialized before creating ScriptRunner to 52 // loadingTaskRunner() to be initialized before creating ScriptRunner to
50 // save it in constructor. 53 // save it in constructor.
51 m_scriptRunner = ScriptRunner::create(m_document.get()); 54 m_scriptRunner = ScriptRunner::create(m_document.get());
52 } 55 }
53 56
54 void TearDown() override { m_scriptRunner.release(); } 57 void TearDown() override { m_scriptRunner.release(); }
55 58
56 Persistent<Document> m_document; 59 Persistent<Document> m_document;
57 Persistent<Element> m_element; 60 Persistent<Element> m_element;
58 TestingPlatformSupportWithMockScheduler m_platform; 61 ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
haraken 2017/01/11 13:03:38 Hmm. It looks a bit nasty to allocate a "Scoped" o
Takashi Toyoshima 2017/01/12 08:56:13 I do not feel it's nasty to use ScopedFoo in membe
62 m_platform;
59 Persistent<ScriptRunner> m_scriptRunner; 63 Persistent<ScriptRunner> m_scriptRunner;
60 WTF::Vector<int> m_order; 64 WTF::Vector<int> m_order;
61 }; 65 };
62 66
63 TEST_F(ScriptRunnerTest, QueueSingleScript_Async) { 67 TEST_F(ScriptRunnerTest, QueueSingleScript_Async) {
64 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get()); 68 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get());
65 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::Async); 69 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::Async);
66 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async); 70 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async);
67 71
68 EXPECT_CALL(*scriptLoader, execute()); 72 EXPECT_CALL(*scriptLoader, execute());
69 m_platform.runUntilIdle(); 73 m_platform->runUntilIdle();
70 } 74 }
71 75
72 TEST_F(ScriptRunnerTest, QueueSingleScript_InOrder) { 76 TEST_F(ScriptRunnerTest, QueueSingleScript_InOrder) {
73 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get()); 77 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get());
74 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::InOrder); 78 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::InOrder);
75 79
76 EXPECT_CALL(*scriptLoader, isReady()).WillOnce(Return(true)); 80 EXPECT_CALL(*scriptLoader, isReady()).WillOnce(Return(true));
77 EXPECT_CALL(*scriptLoader, execute()); 81 EXPECT_CALL(*scriptLoader, execute());
78 82
79 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::InOrder); 83 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::InOrder);
80 84
81 m_platform.runUntilIdle(); 85 m_platform->runUntilIdle();
82 } 86 }
83 87
84 TEST_F(ScriptRunnerTest, QueueMultipleScripts_InOrder) { 88 TEST_F(ScriptRunnerTest, QueueMultipleScripts_InOrder) {
85 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 89 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
86 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 90 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
87 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 91 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
88 92
89 HeapVector<Member<MockScriptLoader>> scriptLoaders; 93 HeapVector<Member<MockScriptLoader>> scriptLoaders;
90 scriptLoaders.push_back(scriptLoader1); 94 scriptLoaders.push_back(scriptLoader1);
91 scriptLoaders.push_back(scriptLoader2); 95 scriptLoaders.push_back(scriptLoader2);
(...skipping 14 matching lines...) Expand all
106 bool isReady[] = {false, false, false}; 110 bool isReady[] = {false, false, false};
107 111
108 for (size_t i = 0; i < scriptLoaders.size(); ++i) { 112 for (size_t i = 0; i < scriptLoaders.size(); ++i) {
109 EXPECT_CALL(*scriptLoaders[i], isReady()) 113 EXPECT_CALL(*scriptLoaders[i], isReady())
110 .WillRepeatedly(Invoke([&isReady, i] { return isReady[i]; })); 114 .WillRepeatedly(Invoke([&isReady, i] { return isReady[i]; }));
111 } 115 }
112 116
113 for (int i = 2; i >= 0; i--) { 117 for (int i = 2; i >= 0; i--) {
114 isReady[i] = true; 118 isReady[i] = true;
115 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::InOrder); 119 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::InOrder);
116 m_platform.runUntilIdle(); 120 m_platform->runUntilIdle();
117 } 121 }
118 122
119 // But ensure the scripts were run in the expected order. 123 // But ensure the scripts were run in the expected order.
120 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); 124 EXPECT_THAT(m_order, ElementsAre(1, 2, 3));
121 } 125 }
122 126
123 TEST_F(ScriptRunnerTest, QueueMixedScripts) { 127 TEST_F(ScriptRunnerTest, QueueMixedScripts) {
124 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 128 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
125 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 129 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
126 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 130 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
(...skipping 29 matching lines...) Expand all
156 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 160 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
157 m_order.push_back(3); 161 m_order.push_back(3);
158 })); 162 }));
159 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] { 163 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] {
160 m_order.push_back(4); 164 m_order.push_back(4);
161 })); 165 }));
162 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] { 166 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] {
163 m_order.push_back(5); 167 m_order.push_back(5);
164 })); 168 }));
165 169
166 m_platform.runUntilIdle(); 170 m_platform->runUntilIdle();
167 171
168 // Async tasks are expected to run first. 172 // Async tasks are expected to run first.
169 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); 173 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3));
170 } 174 }
171 175
172 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async) { 176 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async) {
173 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 177 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
174 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 178 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
175 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 179 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
176 180
(...skipping 13 matching lines...) Expand all
190 m_order.push_back(2); 194 m_order.push_back(2);
191 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async); 195 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async);
192 })); 196 }));
193 197
194 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 198 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
195 m_order.push_back(3); 199 m_order.push_back(3);
196 })); 200 }));
197 201
198 // Make sure that re-entrant calls to notifyScriptReady don't cause 202 // Make sure that re-entrant calls to notifyScriptReady don't cause
199 // ScriptRunner::execute to do more work than expected. 203 // ScriptRunner::execute to do more work than expected.
200 m_platform.runSingleTask(); 204 m_platform->runSingleTask();
201 EXPECT_THAT(m_order, ElementsAre(1)); 205 EXPECT_THAT(m_order, ElementsAre(1));
202 206
203 m_platform.runSingleTask(); 207 m_platform->runSingleTask();
204 EXPECT_THAT(m_order, ElementsAre(1, 2)); 208 EXPECT_THAT(m_order, ElementsAre(1, 2));
205 209
206 m_platform.runSingleTask(); 210 m_platform->runSingleTask();
207 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); 211 EXPECT_THAT(m_order, ElementsAre(1, 2, 3));
208 } 212 }
209 213
210 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder) { 214 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder) {
211 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 215 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
212 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 216 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
213 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 217 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
214 218
215 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); 219 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true));
216 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 220 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
(...skipping 19 matching lines...) Expand all
236 ScriptRunner::InOrder); 240 ScriptRunner::InOrder);
237 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder); 241 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder);
238 })); 242 }));
239 243
240 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 244 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
241 m_order.push_back(3); 245 m_order.push_back(3);
242 })); 246 }));
243 247
244 // Make sure that re-entrant calls to queueScriptForExecution don't cause 248 // Make sure that re-entrant calls to queueScriptForExecution don't cause
245 // ScriptRunner::execute to do more work than expected. 249 // ScriptRunner::execute to do more work than expected.
246 m_platform.runSingleTask(); 250 m_platform->runSingleTask();
247 EXPECT_THAT(m_order, ElementsAre(1)); 251 EXPECT_THAT(m_order, ElementsAre(1));
248 252
249 m_platform.runSingleTask(); 253 m_platform->runSingleTask();
250 EXPECT_THAT(m_order, ElementsAre(1, 2)); 254 EXPECT_THAT(m_order, ElementsAre(1, 2));
251 255
252 m_platform.runSingleTask(); 256 m_platform->runSingleTask();
253 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); 257 EXPECT_THAT(m_order, ElementsAre(1, 2, 3));
254 } 258 }
255 259
256 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts) { 260 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts) {
257 MockScriptLoader* scriptLoaders[20]; 261 MockScriptLoader* scriptLoaders[20];
258 for (int i = 0; i < 20; i++) 262 for (int i = 0; i < 20; i++)
259 scriptLoaders[i] = nullptr; 263 scriptLoaders[i] = nullptr;
260 264
261 for (int i = 0; i < 20; i++) { 265 for (int i = 0; i < 20; i++) {
262 scriptLoaders[i] = MockScriptLoader::create(m_element.get()); 266 scriptLoaders[i] = MockScriptLoader::create(m_element.get());
(...skipping 13 matching lines...) Expand all
276 m_scriptRunner->notifyScriptReady(scriptLoaders[1], ScriptRunner::Async); 280 m_scriptRunner->notifyScriptReady(scriptLoaders[1], ScriptRunner::Async);
277 281
278 EXPECT_CALL(*scriptLoaders[0], execute()) 282 EXPECT_CALL(*scriptLoaders[0], execute())
279 .WillOnce(Invoke([&scriptLoaders, this] { 283 .WillOnce(Invoke([&scriptLoaders, this] {
280 for (int i = 2; i < 20; i++) 284 for (int i = 2; i < 20; i++)
281 m_scriptRunner->notifyScriptReady(scriptLoaders[i], 285 m_scriptRunner->notifyScriptReady(scriptLoaders[i],
282 ScriptRunner::Async); 286 ScriptRunner::Async);
283 m_order.push_back(0); 287 m_order.push_back(0);
284 })); 288 }));
285 289
286 m_platform.runUntilIdle(); 290 m_platform->runUntilIdle();
287 291
288 int expected[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 292 int expected[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
289 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; 293 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
290 294
291 EXPECT_THAT(m_order, testing::ElementsAreArray(expected)); 295 EXPECT_THAT(m_order, testing::ElementsAreArray(expected));
292 } 296 }
293 297
294 TEST_F(ScriptRunnerTest, ResumeAndSuspend_InOrder) { 298 TEST_F(ScriptRunnerTest, ResumeAndSuspend_InOrder) {
295 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 299 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
296 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 300 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
(...skipping 20 matching lines...) Expand all
317 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(false)); 321 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(false));
318 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder); 322 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder);
319 323
320 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 324 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
321 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(false)); 325 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(false));
322 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder); 326 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder);
323 327
324 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); 328 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true));
325 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder); 329 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder);
326 330
327 m_platform.runSingleTask(); 331 m_platform->runSingleTask();
328 m_scriptRunner->suspend(); 332 m_scriptRunner->suspend();
329 m_scriptRunner->resume(); 333 m_scriptRunner->resume();
330 m_platform.runUntilIdle(); 334 m_platform->runUntilIdle();
331 335
332 // Make sure elements are correct and in right order. 336 // Make sure elements are correct and in right order.
333 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); 337 EXPECT_THAT(m_order, ElementsAre(1, 2, 3));
334 } 338 }
335 339
336 TEST_F(ScriptRunnerTest, ResumeAndSuspend_Async) { 340 TEST_F(ScriptRunnerTest, ResumeAndSuspend_Async) {
337 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 341 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
338 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 342 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
339 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 343 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
340 344
341 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async); 345 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async);
342 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async); 346 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async);
343 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::Async); 347 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::Async);
344 348
345 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async); 349 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async);
346 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async); 350 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async);
347 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::Async); 351 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::Async);
348 352
349 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { 353 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] {
350 m_order.push_back(1); 354 m_order.push_back(1);
351 })); 355 }));
352 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { 356 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] {
353 m_order.push_back(2); 357 m_order.push_back(2);
354 })); 358 }));
355 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 359 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
356 m_order.push_back(3); 360 m_order.push_back(3);
357 })); 361 }));
358 362
359 m_platform.runSingleTask(); 363 m_platform->runSingleTask();
360 m_scriptRunner->suspend(); 364 m_scriptRunner->suspend();
361 m_scriptRunner->resume(); 365 m_scriptRunner->resume();
362 m_platform.runUntilIdle(); 366 m_platform->runUntilIdle();
363 367
364 // Make sure elements are correct. 368 // Make sure elements are correct.
365 EXPECT_THAT(m_order, WhenSorted(ElementsAre(1, 2, 3))); 369 EXPECT_THAT(m_order, WhenSorted(ElementsAre(1, 2, 3)));
366 } 370 }
367 371
368 TEST_F(ScriptRunnerTest, LateNotifications) { 372 TEST_F(ScriptRunnerTest, LateNotifications) {
369 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 373 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
370 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 374 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
371 375
372 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); 376 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true));
373 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 377 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
374 378
375 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder); 379 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder);
376 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder); 380 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder);
377 381
378 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { 382 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] {
379 m_order.push_back(1); 383 m_order.push_back(1);
380 })); 384 }));
381 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { 385 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] {
382 m_order.push_back(2); 386 m_order.push_back(2);
383 })); 387 }));
384 388
385 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder); 389 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder);
386 m_platform.runUntilIdle(); 390 m_platform->runUntilIdle();
387 391
388 // At this moment all tasks can be already executed. Make sure that we do not 392 // At this moment all tasks can be already executed. Make sure that we do not
389 // crash here. 393 // crash here.
390 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder); 394 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder);
391 m_platform.runUntilIdle(); 395 m_platform->runUntilIdle();
392 396
393 EXPECT_THAT(m_order, ElementsAre(1, 2)); 397 EXPECT_THAT(m_order, ElementsAre(1, 2));
394 } 398 }
395 399
396 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner) { 400 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner) {
397 Persistent<MockScriptLoader> scriptLoader1 = 401 Persistent<MockScriptLoader> scriptLoader1 =
398 MockScriptLoader::create(m_element.get()); 402 MockScriptLoader::create(m_element.get());
399 Persistent<MockScriptLoader> scriptLoader2 = 403 Persistent<MockScriptLoader> scriptLoader2 =
400 MockScriptLoader::create(m_element.get()); 404 MockScriptLoader::create(m_element.get());
401 405
402 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); 406 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true));
403 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 407 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
404 408
405 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async); 409 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async);
406 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async); 410 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async);
407 411
408 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async); 412 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async);
409 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async); 413 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async);
410 414
411 m_scriptRunner.release(); 415 m_scriptRunner.release();
412 416
413 ThreadState::current()->collectAllGarbage(); 417 ThreadState::current()->collectAllGarbage();
414 418
415 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do not 419 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do not
416 // access dead object. 420 // access dead object.
417 EXPECT_CALL(*scriptLoader1, execute()).Times(0); 421 EXPECT_CALL(*scriptLoader1, execute()).Times(0);
418 EXPECT_CALL(*scriptLoader2, execute()).Times(0); 422 EXPECT_CALL(*scriptLoader2, execute()).Times(0);
419 423
420 m_platform.runUntilIdle(); 424 m_platform->runUntilIdle();
421 } 425 }
422 426
423 } // namespace blink 427 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698