OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 var TestRunner = class { | 5 var TestRunner = class { |
6 constructor(baseURL, log, completeTest, fetch) { | 6 constructor(baseURL, log, completeTest, fetch) { |
7 this._dumpInspectorProtocolMessages = false; | 7 this._dumpInspectorProtocolMessages = false; |
8 this._baseURL = baseURL; | 8 this._baseURL = baseURL; |
9 this._log = log; | 9 this._log = log; |
10 this._completeTest = completeTest; | 10 this._completeTest = completeTest; |
11 this._fetch = fetch; | 11 this._fetch = fetch; |
12 } | 12 } |
13 | 13 |
14 startDumpingProtocolMessages() { | 14 startDumpingProtocolMessages() { |
15 this._dumpInspectorProtocolMessages = true; | 15 this._dumpInspectorProtocolMessages = true; |
16 }; | 16 }; |
17 | 17 |
18 completeTest() { | 18 completeTest() { |
19 this._completeTest.call(null); | 19 this._completeTest.call(null); |
20 } | 20 } |
21 | 21 |
22 log(text) { | 22 log(text) { |
23 this._log.call(null, text); | 23 this._log.call(null, text); |
24 } | 24 } |
25 | 25 |
26 logMessage(originalMessage) { | 26 logMessage(originalMessage, title) { |
27 var message = JSON.parse(JSON.stringify(originalMessage)); | 27 var message = JSON.parse(JSON.stringify(originalMessage)); |
28 if (message.id) | 28 if (message.id) |
29 message.id = '<messageId>'; | 29 message.id = '<messageId>'; |
30 const nonStableFields = new Set(['nodeId', 'objectId', 'scriptId', 'timestam
p']); | 30 const nonStableFields = new Set(['nodeId', 'objectId', 'scriptId', 'timestam
p', 'backendNodeId', 'parentId', 'frameId', 'baseURL', 'documentURL']); |
31 var objects = [message]; | 31 var objects = [message]; |
32 while (objects.length) { | 32 while (objects.length) { |
33 var object = objects.shift(); | 33 var object = objects.shift(); |
34 for (var key in object) { | 34 for (var key in object) { |
35 if (nonStableFields.has(key)) | 35 if (nonStableFields.has(key)) |
36 object[key] = `<${key}>`; | 36 object[key] = `<${key}>`; |
37 else if (typeof object[key] === 'string' && object[key].match(/\d+:\d+:\
d+:debug/)) | 37 else if (typeof object[key] === 'string' && object[key].match(/\d+:\d+:\
d+:debug/)) |
38 object[key] = object[key].replace(/\d+/, '<scriptId>'); | 38 object[key] = object[key].replace(/\d+/, '<scriptId>'); |
39 else if (typeof object[key] === 'object') | 39 else if (typeof object[key] === 'object') |
40 objects.push(object[key]); | 40 objects.push(object[key]); |
41 } | 41 } |
42 } | 42 } |
43 this.logObject(message); | 43 this.logObject(message, title); |
44 return originalMessage; | 44 return originalMessage; |
45 } | 45 } |
46 | 46 |
47 logObject(object, title) { | 47 logObject(object, title) { |
48 var lines = []; | 48 var lines = []; |
49 | 49 |
50 function dumpValue(value, prefix, prefixWithName) { | 50 function dumpValue(value, prefix, prefixWithName) { |
51 if (typeof value === 'object' && value !== null) { | 51 if (typeof value === 'object' && value !== null) { |
52 if (value instanceof Array) | 52 if (value instanceof Array) |
53 dumpItems(value, prefix, prefixWithName); | 53 dumpItems(value, prefix, prefixWithName); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 var session = await this.createSession(); | 184 var session = await this.createSession(); |
185 session.protocol.Page.enable(); | 185 session.protocol.Page.enable(); |
186 session.protocol.Page.navigate({url: url}); | 186 session.protocol.Page.navigate({url: url}); |
187 | 187 |
188 var callback; | 188 var callback; |
189 var promise = new Promise(f => callback = f); | 189 var promise = new Promise(f => callback = f); |
190 session.protocol.Page.onFrameNavigated(message => { | 190 session.protocol.Page.onFrameNavigated(message => { |
191 if (!message.params.frame.parentId) | 191 if (!message.params.frame.parentId) |
192 callback(); | 192 callback(); |
193 }); | 193 }); |
194 await promise; | 194 await Promise.all([ |
| 195 promise, |
| 196 session.protocol.Page.onceLoadEventFired() |
| 197 ]); |
195 | 198 |
196 await session.disconnect(); | 199 await session.disconnect(); |
197 } | 200 } |
198 | 201 |
199 async loadHTML(html) { | 202 async loadHTML(html) { |
200 if (DevToolsAPI._sessions.get(this._targetId)) | 203 if (DevToolsAPI._sessions.get(this._targetId)) |
201 this._testRunner.die('Cannot loadHTML with active session', new Error()); | 204 this._testRunner.die('Cannot loadHTML with active session', new Error()); |
202 | 205 |
203 html = html.replace(/'/g, "\\'").replace(/\n/g, '\\n'); | 206 html = html.replace(/'/g, "\\'").replace(/\n/g, '\\n'); |
204 var session = await this.createSession(); | 207 var session = await this.createSession(); |
205 await session.protocol.Runtime.evaluate({expression: `document.body.innerHTM
L='${html}'`}); | 208 await session.protocol.Runtime.evaluate({expression: `document.write('${html
}');document.close();`}); |
206 await session.disconnect(); | 209 await session.disconnect(); |
207 } | 210 } |
208 }; | 211 }; |
209 | 212 |
210 TestRunner.Session = class { | 213 TestRunner.Session = class { |
211 constructor(page) { | 214 constructor(page) { |
212 this._testRunner = page._testRunner; | 215 this._testRunner = page._testRunner; |
213 this._page = page; | 216 this._page = page; |
214 this._requestId = 0; | 217 this._requestId = 0; |
215 this._dispatchTable = new Map(); | 218 this._dispatchTable = new Map(); |
(...skipping 13 matching lines...) Expand all Loading... |
229 | 232 |
230 sendCommand(method, params) { | 233 sendCommand(method, params) { |
231 var requestId = ++this._requestId; | 234 var requestId = ++this._requestId; |
232 var messageObject = {'id': requestId, 'method': method, 'params': params}; | 235 var messageObject = {'id': requestId, 'method': method, 'params': params}; |
233 if (this._testRunner._dumpInspectorProtocolMessages) | 236 if (this._testRunner._dumpInspectorProtocolMessages) |
234 this._testRunner.log(`frontend => backend: ${JSON.stringify(messageObject)
}`); | 237 this._testRunner.log(`frontend => backend: ${JSON.stringify(messageObject)
}`); |
235 return this.sendRawCommand(requestId, JSON.stringify(messageObject)); | 238 return this.sendRawCommand(requestId, JSON.stringify(messageObject)); |
236 } | 239 } |
237 | 240 |
238 async evaluate(code) { | 241 async evaluate(code) { |
| 242 if (typeof code === 'function') |
| 243 code = `(${code.toString()})()`; |
239 var response = await this.protocol.Runtime.evaluate({expression: code, retur
nByValue: true}); | 244 var response = await this.protocol.Runtime.evaluate({expression: code, retur
nByValue: true}); |
240 if (response.error) { | 245 if (response.error) { |
241 this._testRunner.log(`Error while evaluating '${code}': ${response.error}`
); | 246 this._testRunner.log(`Error while evaluating '${code}': ${response.error}`
); |
242 this._testRunner.completeTest(); | 247 this._testRunner.completeTest(); |
243 } else { | 248 } else { |
244 return response.result.result.value; | 249 return response.result.result.value; |
245 } | 250 } |
246 } | 251 } |
247 | 252 |
248 async evaluateAsync(code) { | 253 async evaluateAsync(code) { |
| 254 if (typeof code === 'function') |
| 255 code = `(${code.toString()})()`; |
249 var response = await this.protocol.Runtime.evaluate({expression: code, retur
nByValue: true, awaitPromise: true}); | 256 var response = await this.protocol.Runtime.evaluate({expression: code, retur
nByValue: true, awaitPromise: true}); |
250 if (response.error) { | 257 if (response.error) { |
251 this._testRunner.log(`Error while evaluating async '${code}': ${response.e
rror}`); | 258 this._testRunner.log(`Error while evaluating async '${code}': ${response.e
rror}`); |
252 this._testRunner.completeTest(); | 259 this._testRunner.completeTest(); |
253 } else { | 260 } else { |
254 return response.result.result.value; | 261 return response.result.result.value; |
255 } | 262 } |
256 } | 263 } |
257 | 264 |
258 _dispatchMessage(message) { | 265 _dispatchMessage(message) { |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 | 450 |
444 window['onerror'] = (message, source, lineno, colno, error) => { | 451 window['onerror'] = (message, source, lineno, colno, error) => { |
445 DevToolsAPI._log(`${error}\n${error.stack}`); | 452 DevToolsAPI._log(`${error}\n${error.stack}`); |
446 DevToolsAPI._completeTest(); | 453 DevToolsAPI._completeTest(); |
447 }; | 454 }; |
448 | 455 |
449 window.addEventListener('unhandledrejection', e => { | 456 window.addEventListener('unhandledrejection', e => { |
450 DevToolsAPI._log(`Promise rejection: ${e.reason}\n${e.reason ? e.reason.stack
: ''}`); | 457 DevToolsAPI._log(`Promise rejection: ${e.reason}\n${e.reason ? e.reason.stack
: ''}`); |
451 DevToolsAPI._completeTest(); | 458 DevToolsAPI._completeTest(); |
452 }, false); | 459 }, false); |
OLD | NEW |