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

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: address comments 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::Async);
74 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXECUTIO N); 74 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async);
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::InOrder) ;
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::InOrder);
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 der);
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 r);
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 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder );
144 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::IN_ORDE R_EXECUTION); 144 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder );
145 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::IN_ORDE R_EXECUTION); 145 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::InOrder );
146 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::IN_ORDE R_EXECUTION); 146 m_scriptRunner->queueScriptForExecution(scriptLoader4, ScriptRunner::Async);
147 m_scriptRunner->queueScriptForExecution(scriptLoader4, ScriptRunner::ASYNC_E XECUTION); 147 m_scriptRunner->queueScriptForExecution(scriptLoader5, ScriptRunner::Async);
148 m_scriptRunner->queueScriptForExecution(scriptLoader5, ScriptRunner::ASYNC_E XECUTION);
149 148
150 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); 149 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true));
151 EXPECT_CALL(*scriptLoader2, isReady()) 150 EXPECT_CALL(*scriptLoader2, isReady())
152 .WillRepeatedly(Return(false)); 151 .WillRepeatedly(Return(false));
153 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::IN_ORDER_EXEC UTION); 152 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder);
154 153
155 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 154 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
156 EXPECT_CALL(*scriptLoader3, isReady()) 155 EXPECT_CALL(*scriptLoader3, isReady())
157 .WillRepeatedly(Return(false)); 156 .WillRepeatedly(Return(false));
158 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::IN_ORDER_EXEC UTION); 157 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder);
159 158
160 EXPECT_CALL(*scriptLoader3, isReady()) 159 EXPECT_CALL(*scriptLoader3, isReady())
161 .WillRepeatedly(Return(true)); 160 .WillRepeatedly(Return(true));
162 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::IN_ORDER_EXEC UTION); 161 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder);
163 162
164 m_scriptRunner->notifyScriptReady(scriptLoader4, ScriptRunner::ASYNC_EXECUTI ON); 163 m_scriptRunner->notifyScriptReady(scriptLoader4, ScriptRunner::Async);
165 m_scriptRunner->notifyScriptReady(scriptLoader5, ScriptRunner::ASYNC_EXECUTI ON); 164 m_scriptRunner->notifyScriptReady(scriptLoader5, ScriptRunner::Async);
166 165
167 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { 166 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] {
168 m_order.append(1); 167 m_order.append(1);
169 })); 168 }));
170 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { 169 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] {
171 m_order.append(2); 170 m_order.append(2);
172 })); 171 }));
173 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 172 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
174 m_order.append(3); 173 m_order.append(3);
175 })); 174 }));
176 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] { 175 EXPECT_CALL(*scriptLoader4, execute()).WillOnce(Invoke([this] {
177 m_order.append(4); 176 m_order.append(4);
178 })); 177 }));
179 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] { 178 EXPECT_CALL(*scriptLoader5, execute()).WillOnce(Invoke([this] {
180 m_order.append(5); 179 m_order.append(5);
181 })); 180 }));
182 181
183 m_platform.runUntilIdle(); 182 m_platform.runUntilIdle();
184 183
185 // Async tasks are expected to run first. 184 // Async tasks are expected to run first.
186 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3)); 185 EXPECT_THAT(m_order, ElementsAre(4, 5, 1, 2, 3));
187 } 186 }
188 187
189 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async) 188 TEST_F(ScriptRunnerTest, QueueReentrantScript_Async)
190 { 189 {
191 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 190 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
192 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 191 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
193 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 192 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
194 193
195 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::ASYNC_E XECUTION); 194 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async);
196 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::ASYNC_E XECUTION); 195 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async);
197 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::ASYNC_E XECUTION); 196 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::Async);
198 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::ASYNC_EXECUTI ON); 197 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async);
199 198
200 MockScriptLoader* scriptLoader = scriptLoader2; 199 MockScriptLoader* scriptLoader = scriptLoader2;
201 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this] { 200 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([scriptLoader, this] {
202 m_order.append(1); 201 m_order.append(1);
203 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC UTION); 202 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async);
204 })); 203 }));
205 204
206 scriptLoader = scriptLoader3; 205 scriptLoader = scriptLoader3;
207 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this] { 206 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([scriptLoader, this] {
208 m_order.append(2); 207 m_order.append(2);
209 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::ASYNC_EXEC UTION); 208 m_scriptRunner->notifyScriptReady(scriptLoader, ScriptRunner::Async);
210 })); 209 }));
211 210
212 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 211 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
213 m_order.append(3); 212 m_order.append(3);
214 })); 213 }));
215 214
216 // Make sure that re-entrant calls to notifyScriptReady don't cause ScriptRu nner::execute to do 215 // Make sure that re-entrant calls to notifyScriptReady don't cause ScriptRu nner::execute to do
217 // more work than expected. 216 // more work than expected.
218 m_platform.runSingleTask(); 217 m_platform.runSingleTask();
219 EXPECT_THAT(m_order, ElementsAre(1)); 218 EXPECT_THAT(m_order, ElementsAre(1));
220 219
221 m_platform.runSingleTask(); 220 m_platform.runSingleTask();
222 EXPECT_THAT(m_order, ElementsAre(1, 2)); 221 EXPECT_THAT(m_order, ElementsAre(1, 2));
223 222
224 m_platform.runSingleTask(); 223 m_platform.runSingleTask();
225 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); 224 EXPECT_THAT(m_order, ElementsAre(1, 2, 3));
226 } 225 }
227 226
228 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder) 227 TEST_F(ScriptRunnerTest, QueueReentrantScript_InOrder)
229 { 228 {
230 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 229 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
231 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 230 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
232 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 231 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
233 232
234 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); 233 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true));
235 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 234 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
236 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true)); 235 EXPECT_CALL(*scriptLoader3, isReady()).WillRepeatedly(Return(true));
237 236
238 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::IN_ORDE R_EXECUTION); 237 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder );
239 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::IN_ORDER_EXEC UTION); 238 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder);
240 239
241 MockScriptLoader* scriptLoader = scriptLoader2; 240 MockScriptLoader* scriptLoader = scriptLoader2;
242 EXPECT_CALL(*scriptLoader1, execute()) 241 EXPECT_CALL(*scriptLoader1, execute())
243 .WillOnce(Invoke([scriptLoader, &scriptLoader2, this] { 242 .WillOnce(Invoke([scriptLoader, &scriptLoader2, this] {
244 m_order.append(1); 243 m_order.append(1);
245 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: IN_ORDER_EXECUTION); 244 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: InOrder);
246 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::IN_OR DER_EXECUTION); 245 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrd er);
247 })); 246 }));
248 247
249 scriptLoader = scriptLoader3; 248 scriptLoader = scriptLoader3;
250 EXPECT_CALL(*scriptLoader2, execute()) 249 EXPECT_CALL(*scriptLoader2, execute())
251 .WillOnce(Invoke([scriptLoader, &scriptLoader3, this] { 250 .WillOnce(Invoke([scriptLoader, &scriptLoader3, this] {
252 m_order.append(2); 251 m_order.append(2);
253 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: IN_ORDER_EXECUTION); 252 m_scriptRunner->queueScriptForExecution(scriptLoader, ScriptRunner:: InOrder);
254 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::IN_OR DER_EXECUTION); 253 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrd er);
255 })); 254 }));
256 255
257 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 256 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
258 m_order.append(3); 257 m_order.append(3);
259 })); 258 }));
260 259
261 // Make sure that re-entrant calls to queueScriptForExecution don't cause Sc riptRunner::execute to do 260 // Make sure that re-entrant calls to queueScriptForExecution don't cause Sc riptRunner::execute to do
262 // more work than expected. 261 // more work than expected.
263 m_platform.runSingleTask(); 262 m_platform.runSingleTask();
264 EXPECT_THAT(m_order, ElementsAre(1)); 263 EXPECT_THAT(m_order, ElementsAre(1));
265 264
266 m_platform.runSingleTask(); 265 m_platform.runSingleTask();
267 EXPECT_THAT(m_order, ElementsAre(1, 2)); 266 EXPECT_THAT(m_order, ElementsAre(1, 2));
268 267
269 m_platform.runSingleTask(); 268 m_platform.runSingleTask();
270 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); 269 EXPECT_THAT(m_order, ElementsAre(1, 2, 3));
271 } 270 }
272 271
273 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts) 272 TEST_F(ScriptRunnerTest, QueueReentrantScript_ManyAsyncScripts)
274 { 273 {
275 MockScriptLoader* scriptLoaders[20]; 274 MockScriptLoader* scriptLoaders[20];
276 for (int i = 0; i < 20; i++) 275 for (int i = 0; i < 20; i++)
277 scriptLoaders[i] = nullptr; 276 scriptLoaders[i] = nullptr;
278 277
279 for (int i = 0; i < 20; i++) { 278 for (int i = 0; i < 20; i++) {
280 scriptLoaders[i] = MockScriptLoader::create(m_element.get()); 279 scriptLoaders[i] = MockScriptLoader::create(m_element.get());
281 EXPECT_CALL(*scriptLoaders[i], isReady()).WillRepeatedly(Return(true)); 280 EXPECT_CALL(*scriptLoaders[i], isReady()).WillRepeatedly(Return(true));
282 281
283 m_scriptRunner->queueScriptForExecution(scriptLoaders[i], ScriptRunner:: ASYNC_EXECUTION); 282 m_scriptRunner->queueScriptForExecution(scriptLoaders[i], ScriptRunner:: Async);
284 283
285 if (i > 0) { 284 if (i > 0) {
286 EXPECT_CALL(*scriptLoaders[i], execute()).WillOnce(Invoke([this, i] { 285 EXPECT_CALL(*scriptLoaders[i], execute()).WillOnce(Invoke([this, i] {
287 m_order.append(i); 286 m_order.append(i);
288 })); 287 }));
289 } 288 }
290 } 289 }
291 290
292 m_scriptRunner->notifyScriptReady(scriptLoaders[0], ScriptRunner::ASYNC_EXEC UTION); 291 m_scriptRunner->notifyScriptReady(scriptLoaders[0], ScriptRunner::Async);
293 m_scriptRunner->notifyScriptReady(scriptLoaders[1], ScriptRunner::ASYNC_EXEC UTION); 292 m_scriptRunner->notifyScriptReady(scriptLoaders[1], ScriptRunner::Async);
294 293
295 EXPECT_CALL(*scriptLoaders[0], execute()).WillOnce(Invoke([&scriptLoaders, t his] { 294 EXPECT_CALL(*scriptLoaders[0], execute()).WillOnce(Invoke([&scriptLoaders, t his] {
296 for (int i = 2; i < 20; i++) 295 for (int i = 2; i < 20; i++)
297 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::AS YNC_EXECUTION); 296 m_scriptRunner->notifyScriptReady(scriptLoaders[i], ScriptRunner::As ync);
298 m_order.append(0); 297 m_order.append(0);
299 })); 298 }));
300 299
301 m_platform.runUntilIdle(); 300 m_platform.runUntilIdle();
302 301
303 int expected[] = { 302 int expected[] = {
304 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 303 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
305 }; 304 };
306 305
307 EXPECT_THAT(m_order, testing::ElementsAreArray(expected)); 306 EXPECT_THAT(m_order, testing::ElementsAreArray(expected));
308 } 307 }
309 308
310 TEST_F(ScriptRunnerTest, ResumeAndSuspend_InOrder) 309 TEST_F(ScriptRunnerTest, ResumeAndSuspend_InOrder)
311 { 310 {
312 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 311 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
313 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 312 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
314 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 313 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
315 314
316 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::IN_ORDE R_EXECUTION); 315 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder );
317 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::IN_ORDE R_EXECUTION); 316 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder );
318 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::IN_ORDE R_EXECUTION); 317 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::InOrder );
319 318
320 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { 319 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] {
321 m_order.append(1); 320 m_order.append(1);
322 })); 321 }));
323 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { 322 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] {
324 m_order.append(2); 323 m_order.append(2);
325 })); 324 }));
326 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] { 325 EXPECT_CALL(*scriptLoader3, execute()).WillOnce(Invoke([this] {
327 m_order.append(3); 326 m_order.append(3);
328 })); 327 }));
329 328
330 EXPECT_CALL(*scriptLoader2, isReady()) 329 EXPECT_CALL(*scriptLoader2, isReady())
331 .WillRepeatedly(Return(true)); 330 .WillRepeatedly(Return(true));
332 EXPECT_CALL(*scriptLoader3, isReady()) 331 EXPECT_CALL(*scriptLoader3, isReady())
333 .WillRepeatedly(Return(true)); 332 .WillRepeatedly(Return(true));
334 333
335 EXPECT_CALL(*scriptLoader1, isReady()) 334 EXPECT_CALL(*scriptLoader1, isReady())
336 .WillRepeatedly(Return(true)); 335 .WillRepeatedly(Return(true));
337 EXPECT_CALL(*scriptLoader2, isReady()) 336 EXPECT_CALL(*scriptLoader2, isReady())
338 .WillRepeatedly(Return(false)); 337 .WillRepeatedly(Return(false));
339 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::IN_ORDER_EXEC UTION); 338 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder);
340 339
341 EXPECT_CALL(*scriptLoader2, isReady()) 340 EXPECT_CALL(*scriptLoader2, isReady())
342 .WillRepeatedly(Return(true)); 341 .WillRepeatedly(Return(true));
343 EXPECT_CALL(*scriptLoader3, isReady()) 342 EXPECT_CALL(*scriptLoader3, isReady())
344 .WillRepeatedly(Return(false)); 343 .WillRepeatedly(Return(false));
345 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::IN_ORDER_EXEC UTION); 344 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder);
346 345
347 EXPECT_CALL(*scriptLoader3, isReady()) 346 EXPECT_CALL(*scriptLoader3, isReady())
348 .WillRepeatedly(Return(true)); 347 .WillRepeatedly(Return(true));
349 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::IN_ORDER_EXEC UTION); 348 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::InOrder);
350 349
351 m_platform.runSingleTask(); 350 m_platform.runSingleTask();
352 m_scriptRunner->suspend(); 351 m_scriptRunner->suspend();
353 m_scriptRunner->resume(); 352 m_scriptRunner->resume();
354 m_platform.runUntilIdle(); 353 m_platform.runUntilIdle();
355 354
356 // Make sure elements are correct and in right order. 355 // Make sure elements are correct and in right order.
357 EXPECT_THAT(m_order, ElementsAre(1, 2, 3)); 356 EXPECT_THAT(m_order, ElementsAre(1, 2, 3));
358 } 357 }
359 358
360 TEST_F(ScriptRunnerTest, ResumeAndSuspend_Async) 359 TEST_F(ScriptRunnerTest, ResumeAndSuspend_Async)
361 { 360 {
362 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 361 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
363 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 362 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
364 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get()); 363 MockScriptLoader* scriptLoader3 = MockScriptLoader::create(m_element.get());
365 364
366 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::ASYNC_E XECUTION); 365 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async);
367 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::ASYNC_E XECUTION); 366 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async);
368 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::ASYNC_E XECUTION); 367 m_scriptRunner->queueScriptForExecution(scriptLoader3, ScriptRunner::Async);
369 368
370 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::ASYNC_EXECUTI ON); 369 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async);
371 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::ASYNC_EXECUTI ON); 370 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async);
372 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::ASYNC_EXECUTI ON); 371 m_scriptRunner->notifyScriptReady(scriptLoader3, ScriptRunner::Async);
373 372
374 EXPECT_CALL(*scriptLoader1, execute()) 373 EXPECT_CALL(*scriptLoader1, execute())
375 .WillOnce(Invoke([this] { 374 .WillOnce(Invoke([this] {
376 m_order.append(1); 375 m_order.append(1);
377 })); 376 }));
378 EXPECT_CALL(*scriptLoader2, execute()) 377 EXPECT_CALL(*scriptLoader2, execute())
379 .WillOnce(Invoke([this] { 378 .WillOnce(Invoke([this] {
380 m_order.append(2); 379 m_order.append(2);
381 })); 380 }));
382 EXPECT_CALL(*scriptLoader3, execute()) 381 EXPECT_CALL(*scriptLoader3, execute())
(...skipping 11 matching lines...) Expand all
394 } 393 }
395 394
396 TEST_F(ScriptRunnerTest, LateNotifications) 395 TEST_F(ScriptRunnerTest, LateNotifications)
397 { 396 {
398 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get()); 397 MockScriptLoader* scriptLoader1 = MockScriptLoader::create(m_element.get());
399 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get()); 398 MockScriptLoader* scriptLoader2 = MockScriptLoader::create(m_element.get());
400 399
401 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); 400 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true));
402 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 401 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
403 402
404 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::IN_ORDE R_EXECUTION); 403 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::InOrder );
405 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::IN_ORDE R_EXECUTION); 404 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::InOrder );
406 405
407 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] { 406 EXPECT_CALL(*scriptLoader1, execute()).WillOnce(Invoke([this] {
408 m_order.append(1); 407 m_order.append(1);
409 })); 408 }));
410 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] { 409 EXPECT_CALL(*scriptLoader2, execute()).WillOnce(Invoke([this] {
411 m_order.append(2); 410 m_order.append(2);
412 })); 411 }));
413 412
414 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::IN_ORDER_EXEC UTION); 413 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::InOrder);
415 m_platform.runUntilIdle(); 414 m_platform.runUntilIdle();
416 415
417 // At this moment all tasks can be already executed. Make sure that we do no t crash here. 416 // 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); 417 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::InOrder);
419 m_platform.runUntilIdle(); 418 m_platform.runUntilIdle();
420 419
421 EXPECT_THAT(m_order, ElementsAre(1, 2)); 420 EXPECT_THAT(m_order, ElementsAre(1, 2));
422 } 421 }
423 422
424 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner) 423 TEST_F(ScriptRunnerTest, TasksWithDeadScriptRunner)
425 { 424 {
426 Persistent<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_elem ent.get()); 425 Persistent<MockScriptLoader> scriptLoader1 = MockScriptLoader::create(m_elem ent.get());
427 Persistent<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_elem ent.get()); 426 Persistent<MockScriptLoader> scriptLoader2 = MockScriptLoader::create(m_elem ent.get());
428 427
429 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true)); 428 EXPECT_CALL(*scriptLoader1, isReady()).WillRepeatedly(Return(true));
430 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true)); 429 EXPECT_CALL(*scriptLoader2, isReady()).WillRepeatedly(Return(true));
431 430
432 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::ASYNC_E XECUTION); 431 m_scriptRunner->queueScriptForExecution(scriptLoader1, ScriptRunner::Async);
433 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::ASYNC_E XECUTION); 432 m_scriptRunner->queueScriptForExecution(scriptLoader2, ScriptRunner::Async);
434 433
435 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::ASYNC_EXECUTI ON); 434 m_scriptRunner->notifyScriptReady(scriptLoader1, ScriptRunner::Async);
436 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::ASYNC_EXECUTI ON); 435 m_scriptRunner->notifyScriptReady(scriptLoader2, ScriptRunner::Async);
437 436
438 m_scriptRunner.release(); 437 m_scriptRunner.release();
439 438
440 ThreadHeap::collectAllGarbage(); 439 ThreadHeap::collectAllGarbage();
441 440
442 // m_scriptRunner is gone. We need to make sure that ScriptRunner::Task do n ot access dead object. 441 // 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); 442 EXPECT_CALL(*scriptLoader1, execute()).Times(0);
444 EXPECT_CALL(*scriptLoader2, execute()).Times(0); 443 EXPECT_CALL(*scriptLoader2, execute()).Times(0);
445 444
446 m_platform.runUntilIdle(); 445 m_platform.runUntilIdle();
447 } 446 }
448 447
449 } // namespace blink 448 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/ScriptRunner.cpp ('k') | third_party/WebKit/Source/core/timing/PerformanceTiming.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698