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

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

Issue 2238543002: Instrument parser blocking script execution time. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix test Created 4 years, 3 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"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 Persistent<Document> m_document; 63 Persistent<Document> m_document;
64 Persistent<Element> m_element; 64 Persistent<Element> m_element;
65 TestingPlatformSupportWithMockScheduler m_platform; 65 TestingPlatformSupportWithMockScheduler m_platform;
66 Persistent<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 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get()); 72 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get());
73 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::ASYNC_EX ECUTION); 73 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::AsyncExe cution);
74 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXECUTIO N); 74 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::AsyncExecution );
75 75
76 EXPECT_CALL(*scriptLoader, execute()); 76 EXPECT_CALL(*scriptLoader, execute());
77 m_platform.runUntilIdle(); 77 m_platform.runUntilIdle();
78 } 78 }
79 79
80 TEST_F(ScriptRunnerTest, QueueSingleScript_InOrder) 80 TEST_F(ScriptRunnerTest, QueueSingleScript_InOrder)
81 { 81 {
82 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get()); 82 MockScriptLoader* scriptLoader = MockScriptLoader::create(m_element.get());
83 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::IN_ORDER _EXECUTION); 83 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner::InOrderE xecution);
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, ScriptRunner::IN_ORDER_EXECU TION); 88 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::InOrderExecuti on);
89 89
90 m_platform.runUntilIdle(); 90 m_platform.runUntilIdle();
91 } 91 }
92 92
93 TEST_F(ScriptRunnerTest, QueueMultipleScripts_InOrder) 93 TEST_F(ScriptRunnerTest, QueueMultipleScripts_InOrder)
94 { 94 {
95 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 95 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
96 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 96 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
97 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 97 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
98 98
99 HeapVector<Member<MockScriptLoader>> scriptLoaders; 99 HeapVector<Member<MockScriptLoader>> scriptLoaders;
100 scriptLoaders.append(scriptLoader1); 100 scriptLoaders.append(scriptLoader1);
101 scriptLoaders.append(scriptLoader2); 101 scriptLoaders.append(scriptLoader2);
102 scriptLoaders.append(scriptLoader3); 102 scriptLoaders.append(scriptLoader3);
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::InOr derExecution);
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())
110 .WillOnce(Invoke([this, i] { 110 .WillOnce(Invoke([this, i] {
111 m_order.append(i + 1); 111 m_order.append(i + 1);
112 })); 112 }));
113 } 113 }
114 114
115 // Make the scripts become ready in reverse order. 115 // Make the scripts become ready in reverse order.
116 bool isReady[] = { false, false, false }; 116 bool isReady[] = { false, false, false };
117 117
118 for (size_t i = 0; i < scriptLoaders.size(); ++i) { 118 for (size_t i = 0; i < scriptLoaders.size(); ++i) {
119 EXPECT_CALL(*scriptLoaders[i], isReady()) 119 EXPECT_CALL(*scriptLoaders[i], isReady())
120 .WillRepeatedly(Invoke([&isReady, i] { 120 .WillRepeatedly(Invoke([&isReady, i] {
121 return isReady[i]; 121 return isReady[i];
122 })); 122 }));
123 } 123 }
124 124
125 for (int i = 2; i >= 0; i--) { 125 for (int i = 2; i >= 0; i--) {
126 isReady[i] = true; 126 isReady[i] = true;
127 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::IN_ORD ER_EXECUTION); 127 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::InOrde rExecution);
128 m_platform.runUntilIdle(); 128 m_platform.runUntilIdle();
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 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 137 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
138 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 138 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
139 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 139 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
140 MockScriptLoader* scriptLoader4 = MockScriptLoader::create(m_element.get()); 140 MockScriptLoader* scriptLoader4 = MockScriptLoader::create(m_element.get());
141 MockScriptLoader* scriptLoader5 = MockScriptLoader::create(m_element.get()); 141 MockScriptLoader* scriptLoader5 = MockScriptLoader::create(m_element.get());
142 142
143 143
144 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::IN_ORDE R_EXECUTION); 144 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder Execution);
145 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::IN_ORDE R_EXECUTION); 145 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder Execution);
146 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::IN_ORDE R_EXECUTION); 146 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::InOrder Execution);
147 m_scriptRunner->queueScriptForExecution(scriptLoader4, ScriptRunner::ASYNC_E XECUTION); 147 m_scriptRunner->queueScriptForExecution(scriptLoader4, ScriptRunner::AsyncEx ecution);
148 m_scriptRunner->queueScriptForExecution(scriptLoader5, ScriptRunner::ASYNC_E XECUTION); 148 m_scriptRunner->queueScriptForExecution(scriptLoader5, ScriptRunner::AsyncEx ecution);
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())
152 .WillRepeatedly(Return(false)); 152 .WillRepeatedly(Return(false));
153 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::IN_ORDER_EXEC UTION); 153 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrderExecut ion);
154 154
155 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 155 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
156 EXPECT_CALL(*scriptLoader3, isReady()) 156 EXPECT_CALL(*scriptLoader3, isReady())
157 .WillRepeatedly(Return(false)); 157 .WillRepeatedly(Return(false));
158 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::IN_ORDER_EXEC UTION); 158 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrderExecut ion);
159 159
160 EXPECT_CALL(*scriptLoader3, isReady()) 160 EXPECT_CALL(*scriptLoader3, isReady())
161 .WillRepeatedly(Return(true)); 161 .WillRepeatedly(Return(true));
162 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::IN_ORDER_EXEC UTION); 162 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrderExecut ion);
163 163
164 m_scriptRunner->notifyScriptReady(scriptLoader4, ScriptRunner::ASYNC_EXECUTI ON); 164 m_scriptRunner->notifyScriptReady(scriptLoader4, ScriptRunner::AsyncExecutio n);
165 m_scriptRunner->notifyScriptReady(scriptLoader5, ScriptRunner::ASYNC_EXECUTI ON); 165 m_scriptRunner->notifyScriptReady(scriptLoader5, ScriptRunner::AsyncExecutio n);
166 166
167 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { 167 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] {
168 m_order.append(1); 168 m_order.append(1);
169 })); 169 }));
170 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { 170 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] {
171 m_order.append(2); 171 m_order.append(2);
172 })); 172 }));
173 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 173 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
174 m_order.append(3); 174 m_order.append(3);
175 })); 175 }));
176 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] { 176 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] {
177 m_order.append(4); 177 m_order.append(4);
178 })); 178 }));
179 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] { 179 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] {
180 m_order.append(5); 180 m_order.append(5);
181 })); 181 }));
182 182
183 m_platform.runUntilIdle(); 183 m_platform.runUntilIdle();
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 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 191 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
192 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 192 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
193 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 193 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
194 194
195 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::ASYNC_E XECUTION); 195 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::AsyncEx ecution);
196 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::ASYNC_E XECUTION); 196 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::AsyncEx ecution);
197 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::ASYNC_E XECUTION); 197 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::AsyncEx ecution);
198 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::ASYNC_EXECUTI ON); 198 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::AsyncExecutio n);
199 199
200 MockScriptLoader* scriptLoader = scriptLoader2; 200 MockScriptLoader* scriptLoader = scriptLoader2;
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::AsyncExecu tion);
204 })); 204 }));
205 205
206 scriptLoader = scriptLoader3; 206 scriptLoader = scriptLoader3;
207 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this] { 207 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this] {
208 m_order.append(2); 208 m_order.append(2);
209 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC UTION); 209 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::AsyncExecu tion);
210 })); 210 }));
211 211
212 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 212 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
213 m_order.append(3); 213 m_order.append(3);
214 })); 214 }));
215 215
216 // Make sure that re-entrant calls to notifyScriptReady don't cause ScriptRu nner::execute to do 216 // Make sure that re-entrant calls to notifyScriptReady don't cause ScriptRu nner::execute to do
217 // more work than expected. 217 // more work than expected.
218 m_platform.runSingleTask(); 218 m_platform.runSingleTask();
219 EXPECT_THAT(m_order, ElementsAre(1)); 219 EXPECT_THAT(m_order, ElementsAre(1));
220 220
221 m_platform.runSingleTask(); 221 m_platform.runSingleTask();
222 EXPECT_THAT(m_order, ElementsAre(1, 2)); 222 EXPECT_THAT(m_order, ElementsAre(1, 2));
223 223
224 m_platform.runSingleTask(); 224 m_platform.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 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 230 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
231 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 231 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
232 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 232 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, ScriptRunner::IN_ORDE R_EXECUTION); 238 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder Execution);
239 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::IN_ORDER_EXEC UTION); 239 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrderExecut ion);
240 240
241 MockScriptLoader* scriptLoader = scriptLoader2; 241 MockScriptLoader* scriptLoader = scriptLoader2;
242 EXPECT_CALL(*scriptLoader1, execute()) 242 EXPECT_CALL(*scriptLoader1, execute())
243 .WillOnce(Invoke([scriptLoader, &scriptLoader2, this] { 243 .WillOnce(Invoke([scriptLoader, &scriptLoader2, this] {
244 m_order.append(1); 244 m_order.append(1);
245 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: IN_ORDER_EXECUTION); 245 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: InOrderExecution);
246 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::IN_OR DER_EXECUTION); 246 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrd erExecution);
247 })); 247 }));
248 248
249 scriptLoader = scriptLoader3; 249 scriptLoader = scriptLoader3;
250 EXPECT_CALL(*scriptLoader2, execute()) 250 EXPECT_CALL(*scriptLoader2, execute())
251 .WillOnce(Invoke([scriptLoader, &scriptLoader3, this] { 251 .WillOnce(Invoke([scriptLoader, &scriptLoader3, this] {
252 m_order.append(2); 252 m_order.append(2);
253 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: IN_ORDER_EXECUTION); 253 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: InOrderExecution);
254 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::IN_OR DER_EXECUTION); 254 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrd erExecution);
255 })); 255 }));
256 256
257 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 257 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
258 m_order.append(3); 258 m_order.append(3);
259 })); 259 }));
260 260
261 // Make sure that re-entrant calls to queueScriptForExecution don't cause Sc riptRunner::execute to do 261 // Make sure that re-entrant calls to queueScriptForExecution don't cause Sc riptRunner::execute to do
262 // more work than expected. 262 // more work than expected.
263 m_platform.runSingleTask(); 263 m_platform.runSingleTask();
264 EXPECT_THAT(m_order, ElementsAre(1)); 264 EXPECT_THAT(m_order, ElementsAre(1));
265 265
266 m_platform.runSingleTask(); 266 m_platform.runSingleTask();
267 EXPECT_THAT(m_order, ElementsAre(1, 2)); 267 EXPECT_THAT(m_order, ElementsAre(1, 2));
268 268
269 m_platform.runSingleTask(); 269 m_platform.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 MockScriptLoader* scriptLoaders[20]; 275 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], ScriptRunner:: ASYNC_EXECUTION); 283 m_scriptRunner->queueScriptForExecution(scriptLoaders[i], ScriptRunner:: AsyncExecution);
284 284
285 if (i > 0) { 285 if (i > 0) {
286 EXPECT_CALL(*scriptLoaders[i], execute()).WillOnce(Invoke([this, i] { 286 EXPECT_CALL(*scriptLoaders[i], execute()).WillOnce(Invoke([this, i] {
287 m_order.append(i); 287 m_order.append(i);
288 })); 288 }));
289 } 289 }
290 } 290 }
291 291
292 m_scriptRunner->notifyScriptReady(scriptLoaders[0], ScriptRunner::ASYNC_EXEC UTION); 292 m_scriptRunner->notifyScriptReady(scriptLoaders[0], ScriptRunner::AsyncExecu tion);
293 m_scriptRunner->notifyScriptReady(scriptLoaders[1], ScriptRunner::ASYNC_EXEC UTION); 293 m_scriptRunner->notifyScriptReady(scriptLoaders[1], ScriptRunner::AsyncExecu tion);
294 294
295 EXPECT_CALL(*scriptLoaders[0], execute()).WillOnce(Invoke([&scriptLoaders, t his] { 295 EXPECT_CALL(*scriptLoaders[0], execute()).WillOnce(Invoke([&scriptLoaders, t his] {
296 for (int i = 2; i < 20; i++) 296 for (int i = 2; i < 20; i++)
297 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::AS YNC_EXECUTION); 297 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::As yncExecution);
298 m_order.append(0); 298 m_order.append(0);
299 })); 299 }));
300 300
301 m_platform.runUntilIdle(); 301 m_platform.runUntilIdle();
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 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 312 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
313 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 313 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
314 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 314 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
315 315
316 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::IN_ORDE R_EXECUTION); 316 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder Execution);
317 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::IN_ORDE R_EXECUTION); 317 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder Execution);
318 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::IN_ORDE R_EXECUTION); 318 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::InOrder 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);
325 })); 325 }));
326 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 326 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
327 m_order.append(3); 327 m_order.append(3);
328 })); 328 }));
329 329
330 EXPECT_CALL(*scriptLoader2, isReady()) 330 EXPECT_CALL(*scriptLoader2, isReady())
331 .WillRepeatedly(Return(true)); 331 .WillRepeatedly(Return(true));
332 EXPECT_CALL(*scriptLoader3, isReady()) 332 EXPECT_CALL(*scriptLoader3, isReady())
333 .WillRepeatedly(Return(true)); 333 .WillRepeatedly(Return(true));
334 334
335 EXPECT_CALL(*scriptLoader1, isReady()) 335 EXPECT_CALL(*scriptLoader1, isReady())
336 .WillRepeatedly(Return(true)); 336 .WillRepeatedly(Return(true));
337 EXPECT_CALL(*scriptLoader2, isReady()) 337 EXPECT_CALL(*scriptLoader2, isReady())
338 .WillRepeatedly(Return(false)); 338 .WillRepeatedly(Return(false));
339 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::IN_ORDER_EXEC UTION); 339 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrderExecut ion);
340 340
341 EXPECT_CALL(*scriptLoader2, isReady()) 341 EXPECT_CALL(*scriptLoader2, isReady())
342 .WillRepeatedly(Return(true)); 342 .WillRepeatedly(Return(true));
343 EXPECT_CALL(*scriptLoader3, isReady()) 343 EXPECT_CALL(*scriptLoader3, isReady())
344 .WillRepeatedly(Return(false)); 344 .WillRepeatedly(Return(false));
345 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::IN_ORDER_EXEC UTION); 345 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrderExecut ion);
346 346
347 EXPECT_CALL(*scriptLoader3, isReady()) 347 EXPECT_CALL(*scriptLoader3, isReady())
348 .WillRepeatedly(Return(true)); 348 .WillRepeatedly(Return(true));
349 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::IN_ORDER_EXEC UTION); 349 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrderExecut ion);
350 350
351 m_platform.runSingleTask(); 351 m_platform.runSingleTask();
352 m_scriptRunner->suspend(); 352 m_scriptRunner->suspend();
353 m_scriptRunner->resume(); 353 m_scriptRunner->resume();
354 m_platform.runUntilIdle(); 354 m_platform.runUntilIdle();
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 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 362 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
363 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 363 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
364 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 364 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
365 365
366 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::ASYNC_E XECUTION); 366 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::AsyncEx ecution);
367 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::ASYNC_E XECUTION); 367 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::AsyncEx ecution);
368 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::ASYNC_E XECUTION); 368 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::AsyncEx ecution);
369 369
370 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::ASYNC_EXECUTI ON); 370 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::AsyncExecutio n);
371 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::ASYNC_EXECUTI ON); 371 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::AsyncExecutio n);
372 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::ASYNC_EXECUTI ON); 372 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::AsyncExecutio n);
373 373
374 EXPECT_CALL(*scriptLoader1, execute()) 374 EXPECT_CALL(*scriptLoader1, execute())
375 .WillOnce(Invoke([this] { 375 .WillOnce(Invoke([this] {
376 m_order.append(1); 376 m_order.append(1);
377 })); 377 }));
378 EXPECT_CALL(*scriptLoader2, execute()) 378 EXPECT_CALL(*scriptLoader2, execute())
379 .WillOnce(Invoke([this] { 379 .WillOnce(Invoke([this] {
380 m_order.append(2); 380 m_order.append(2);
381 })); 381 }));
382 EXPECT_CALL(*scriptLoader3, execute()) 382 EXPECT_CALL(*scriptLoader3, execute())
(...skipping 11 matching lines...) Expand all
394 } 394 }
395 395
396 TEST_F(ScriptRunnerTest, LateNotifications) 396 TEST_F(ScriptRunnerTest, LateNotifications)
397 { 397 {
398 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 398 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
399 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 399 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, ScriptRunner::IN_ORDE R_EXECUTION); 404 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder Execution);
405 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::IN_ORDE R_EXECUTION); 405 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder 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, ScriptRunner::IN_ORDER_EXEC UTION); 414 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrderExecut ion);
415 m_platform.runUntilIdle(); 415 m_platform.runUntilIdle();
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, ScriptRunner::IN_ORDER_EXEC UTION); 418 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrderExecut ion);
419 m_platform.runUntilIdle(); 419 m_platform.runUntilIdle();
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 Persistent<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_elem ent.get()); 426 Persistent<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_elem ent.get());
427 Persistent<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_elem ent.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, ScriptRunner::ASYNC_E XECUTION); 432 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::AsyncEx ecution);
433 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::ASYNC_E XECUTION); 433 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::AsyncEx ecution);
434 434
435 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::ASYNC_EXECUTI ON); 435 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::AsyncExecutio n);
436 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::ASYNC_EXECUTI ON); 436 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::AsyncExecutio n);
437 437
438 m_scriptRunner.release(); 438 m_scriptRunner.release();
439 439
440 ThreadHeap::collectAllGarbage(); 440 ThreadHeap::collectAllGarbage();
441 441
442 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do n ot access dead object. 442 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do n ot access dead object.
443 EXPECT_CALL(*scriptLoader1, execute()).Times(0); 443 EXPECT_CALL(*scriptLoader1, execute()).Times(0);
444 EXPECT_CALL(*scriptLoader2, execute()).Times(0); 444 EXPECT_CALL(*scriptLoader2, execute()).Times(0);
445 445
446 m_platform.runUntilIdle(); 446 m_platform.runUntilIdle();
447 } 447 }
448 448
449 } // namespace blink 449 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698