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

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

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

Powered by Google App Engine
This is Rietveld 408576698