| 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 |