Index: test/inspector/protocol-test.js |
diff --git a/test/inspector/protocol-test.js b/test/inspector/protocol-test.js |
index 3884a16ed99a1bdd0183f48ea503fa6772ff50b8..9b85e24672c03c3cbf8c6ef3254ba64f97c67045 100644 |
--- a/test/inspector/protocol-test.js |
+++ b/test/inspector/protocol-test.js |
@@ -3,33 +3,102 @@ |
// found in the LICENSE file. |
InspectorTest = {}; |
-InspectorTest._dispatchTable = new Map(); |
-InspectorTest._requestId = 0; |
InspectorTest._dumpInspectorProtocolMessages = false; |
-InspectorTest._eventHandler = {}; |
InspectorTest._commandsForLogging = new Set(); |
-Protocol = new Proxy({}, { |
- get: function(target, agentName, receiver) { |
- return new Proxy({}, { |
- get: function(target, methodName, receiver) { |
- const eventPattern = /^on(ce)?([A-Z][A-Za-z0-9]+)/; |
- var match = eventPattern.exec(methodName); |
- if (!match) { |
- return (args, contextGroupId) => InspectorTest._sendCommandPromise(`${agentName}.${methodName}`, args || {}, contextGroupId); |
- } else { |
- var eventName = match[2]; |
- eventName = eventName.charAt(0).toLowerCase() + eventName.slice(1); |
- if (match[1]) |
- return () => InspectorTest._waitForEventPromise( |
- `${agentName}.${eventName}`); |
- else |
- return (listener) => { InspectorTest._eventHandler[`${agentName}.${eventName}`] = listener }; |
+InspectorTest.createContextGroup = function() { |
+ var contextGroup = {}; |
+ contextGroup.id = utils.createContextGroup(); |
+ contextGroup.schedulePauseOnNextStatement = (reason, details) => utils.schedulePauseOnNextStatement(contextGroup.id, reason, details); |
+ contextGroup.cancelPauseOnNextStatement = () => utils.cancelPauseOnNextStatement(contextGroup.id); |
+ contextGroup.addScript = (string, lineOffset, columnOffset, url) => utils.compileAndRunWithOrigin(contextGroup.id, string, url || '', lineOffset || 0, columnOffset || 0, false); |
+ contextGroup.addModule = (string, url, lineOffset, columnOffset) => utils.compileAndRunWithOrigin(contextGroup.id, string, url, lineOffset || 0, columnOffset || 0, true); |
+ return contextGroup; |
+} |
+ |
+InspectorTest._sessions = new Map(); |
+InspectorTest.createSession = function(contextGroup) { |
+ var session = { |
+ contextGroup: contextGroup, |
+ _dispatchTable: new Map(), |
+ _eventHandler: {}, |
+ _requestId: 0, |
+ }; |
+ session.Protocol = new Proxy({}, { |
+ get: function(target, agentName, receiver) { |
+ return new Proxy({}, { |
+ get: function(target, methodName, receiver) { |
+ const eventPattern = /^on(ce)?([A-Z][A-Za-z0-9]+)/; |
+ var match = eventPattern.exec(methodName); |
+ if (!match) { |
+ return args => session._sendCommandPromise(`${agentName}.${methodName}`, args || {}); |
+ } else { |
+ var eventName = match[2]; |
+ eventName = eventName.charAt(0).toLowerCase() + eventName.slice(1); |
+ if (match[1]) |
+ return () => InspectorTest._waitForEventPromise(session, `${agentName}.${eventName}`); |
+ else |
+ return (listener) => { session._eventHandler[`${agentName}.${eventName}`] = listener }; |
+ } |
+ } |
+ }); |
+ } |
+ }); |
+ session._dispatchMessage = messageString => { |
+ let messageObject = JSON.parse(messageString); |
+ if (InspectorTest._dumpInspectorProtocolMessages) |
+ utils.print("backend: " + JSON.stringify(messageObject)); |
+ try { |
+ var messageId = messageObject["id"]; |
+ if (typeof messageId === "number") { |
+ var handler = session._dispatchTable.get(messageId); |
+ if (handler) { |
+ handler(messageObject); |
+ session._dispatchTable.delete(messageId); |
} |
+ } else { |
+ var eventName = messageObject["method"]; |
+ var eventHandler = session._eventHandler[eventName]; |
+ if (session._scriptMap && eventName === "Debugger.scriptParsed") |
+ session._scriptMap.set(messageObject.params.scriptId, JSON.parse(JSON.stringify(messageObject.params))); |
+ if (eventName === "Debugger.scriptParsed" && messageObject.params.url === "wait-pending-tasks.js") |
+ return; |
+ if (eventHandler) |
+ eventHandler(messageObject); |
} |
- }); |
+ } catch (e) { |
+ InspectorTest.log("Exception when dispatching message: " + e + "\n" + e.stack + "\n message = " + JSON.stringify(messageObject, null, 2)); |
+ InspectorTest.completeTest(); |
+ } |
+ }; |
+ session.id = utils.connectSession(contextGroup.id, '', session._dispatchMessage.bind(session)); |
+ InspectorTest._sessions.set(session.id, session); |
+ session.disconnect = () => utils.disconnectSession(session.id); |
+ session.reconnect = () => { |
+ InspectorTest._sessions.delete(session.id); |
+ var state = utils.disconnectSession(session.id); |
+ session.id = utils.connectSession(contextGroup.id, state, session._dispatchMessage.bind(session)); |
+ InspectorTest._sessions.set(session.id, session); |
+ }; |
+ session.sendRawCommand = (requestId, command, handler) => { |
+ if (InspectorTest._dumpInspectorProtocolMessages) |
+ utils.print("frontend: " + command); |
+ session._dispatchTable.set(requestId, handler); |
+ utils.sendMessageToBackend(session.id, command); |
+ } |
+ session._sendCommandPromise = (method, params) => { |
+ var requestId = ++session._requestId; |
+ var messageObject = { "id": requestId, "method": method, "params": params }; |
+ var fulfillCallback; |
+ var promise = new Promise(fulfill => fulfillCallback = fulfill); |
+ if (InspectorTest._commandsForLogging.has(method)) { |
+ utils.print(method + ' called'); |
+ } |
+ session.sendRawCommand(requestId, JSON.stringify(messageObject), fulfillCallback); |
+ return promise; |
} |
-}); |
+ return session; |
+} |
InspectorTest.logProtocolCommandCalls = (command) => InspectorTest._commandsForLogging.add(command); |
@@ -108,28 +177,29 @@ InspectorTest.logObject = function(object, title) |
InspectorTest.log(lines.join("\n")); |
} |
-InspectorTest.logCallFrames = function(callFrames) |
+InspectorTest.logCallFrames = function(callFrames, session) |
{ |
+ session = session || InspectorTest.session; |
for (var frame of callFrames) { |
var functionName = frame.functionName || '(anonymous)'; |
- var url = frame.url ? frame.url : InspectorTest._scriptMap.get(frame.location.scriptId).url; |
+ var url = frame.url ? frame.url : session._scriptMap.get(frame.location.scriptId).url; |
var lineNumber = frame.location ? frame.location.lineNumber : frame.lineNumber; |
var columnNumber = frame.location ? frame.location.columnNumber : frame.columnNumber; |
InspectorTest.log(`${functionName} (${url}:${lineNumber}:${columnNumber})`); |
} |
} |
-InspectorTest.logSourceLocation = function(location) |
+InspectorTest.logSourceLocation = function(location, session) |
{ |
+ session = session || InspectorTest.session; |
var scriptId = location.scriptId; |
- if (!InspectorTest._scriptMap || !InspectorTest._scriptMap.has(scriptId)) { |
+ if (!session._scriptMap || !session._scriptMap.has(scriptId)) { |
InspectorTest.log("InspectorTest.setupScriptMap should be called before Protocol.Debugger.enable."); |
InspectorTest.completeTest(); |
} |
- var script = InspectorTest._scriptMap.get(scriptId); |
+ var script = session._scriptMap.get(scriptId); |
if (!script.scriptSource) { |
- // TODO(kozyatinskiy): doesn't assume that contextId == contextGroupId. |
- return Protocol.Debugger.getScriptSource({ scriptId }, script.executionContextId) |
+ return session.Protocol.Debugger.getScriptSource({ scriptId }) |
.then(message => script.scriptSource = message.result.scriptSource) |
.then(dumpSourceWithLocation); |
} |
@@ -146,14 +216,15 @@ InspectorTest.logSourceLocation = function(location) |
} |
} |
-InspectorTest.logSourceLocations = function(locations) { |
+InspectorTest.logSourceLocations = function(locations, session) { |
if (locations.length == 0) return Promise.resolve(); |
- return InspectorTest.logSourceLocation(locations[0]) |
- .then(() => InspectorTest.logSourceLocations(locations.splice(1))); |
+ return InspectorTest.logSourceLocation(locations[0], session) |
+ .then(() => InspectorTest.logSourceLocations(locations.splice(1), session)); |
} |
-InspectorTest.logAsyncStackTrace = function(asyncStackTrace) |
+InspectorTest.logAsyncStackTrace = function(asyncStackTrace, session) |
{ |
+ session = InspectorTest.session || session; |
while (asyncStackTrace) { |
if (asyncStackTrace.promiseCreationFrame) { |
var frame = asyncStackTrace.promiseCreationFrame; |
@@ -162,7 +233,7 @@ InspectorTest.logAsyncStackTrace = function(asyncStackTrace) |
} else { |
InspectorTest.log(`-- ${asyncStackTrace.description} --`); |
} |
- InspectorTest.logCallFrames(asyncStackTrace.callFrames); |
+ InspectorTest.logCallFrames(asyncStackTrace.callFrames, session); |
asyncStackTrace = asyncStackTrace.parent; |
} |
} |
@@ -176,26 +247,17 @@ InspectorTest.completeTestAfterPendingTimeouts = function() |
InspectorTest.waitPendingTasks = function() |
{ |
- return Protocol.Runtime.evaluate({ expression: "new Promise(r => setTimeout(r, 0))//# sourceURL=wait-pending-tasks.js", awaitPromise: true }); |
+ var promises = []; |
+ for (var session of InspectorTest._sessions.values()) |
+ promises.push(session.Protocol.Runtime.evaluate({ expression: "new Promise(r => setTimeout(r, 0))//# sourceURL=wait-pending-tasks.js", awaitPromise: true })); |
+ return Promise.all(promises); |
} |
-InspectorTest.addScript = (string, lineOffset, columnOffset) => utils.compileAndRunWithOrigin(string, "", lineOffset || 0, columnOffset || 0, false); |
-InspectorTest.addScriptWithUrl = (string, url) => utils.compileAndRunWithOrigin(string, url, 0, 0, false); |
-InspectorTest.addModule = (string, url, lineOffset, columnOffset) => utils.compileAndRunWithOrigin(string, url, lineOffset || 0, columnOffset || 0, true); |
- |
InspectorTest.startDumpingProtocolMessages = function() |
{ |
InspectorTest._dumpInspectorProtocolMessages = true; |
} |
-InspectorTest.sendRawCommand = function(requestId, command, handler, contextGroupId) |
-{ |
- if (InspectorTest._dumpInspectorProtocolMessages) |
- utils.print("frontend: " + command); |
- InspectorTest._dispatchTable.set(requestId, handler); |
- sendMessageToBackend(command, contextGroupId || 0); |
-} |
- |
InspectorTest.checkExpectation = function(fail, name, messageObject) |
{ |
if (fail === !!messageObject.error) { |
@@ -210,10 +272,11 @@ InspectorTest.checkExpectation = function(fail, name, messageObject) |
InspectorTest.expectedSuccess = InspectorTest.checkExpectation.bind(null, false); |
InspectorTest.expectedError = InspectorTest.checkExpectation.bind(null, true); |
-InspectorTest.setupScriptMap = function() { |
- if (InspectorTest._scriptMap) |
+InspectorTest.setupScriptMap = function(session) { |
+ session = session || InspectorTest.session; |
+ if (session._scriptMap) |
return; |
- InspectorTest._scriptMap = new Map(); |
+ session._scriptMap = new Map(); |
} |
InspectorTest.runTestSuite = function(testSuite) |
@@ -234,68 +297,28 @@ InspectorTest.runTestSuite = function(testSuite) |
InspectorTest.runAsyncTestSuite = async function(testSuite) { |
for (var test of testSuite) { |
InspectorTest.log("\nRunning test: " + test.name); |
- await test(); |
+ try { |
+ await test(); |
+ } catch (e) { |
+ utils.print(e.stack); |
+ } |
} |
InspectorTest.completeTest(); |
} |
-InspectorTest._sendCommandPromise = function(method, params, contextGroupId) |
+InspectorTest._waitForEventPromise = function(session, eventName) |
{ |
- var requestId = ++InspectorTest._requestId; |
- var messageObject = { "id": requestId, "method": method, "params": params }; |
- var fulfillCallback; |
- var promise = new Promise(fulfill => fulfillCallback = fulfill); |
- if (InspectorTest._commandsForLogging.has(method)) { |
- utils.print(method + ' called'); |
- } |
- InspectorTest.sendRawCommand(requestId, JSON.stringify(messageObject), fulfillCallback, contextGroupId); |
- return promise; |
-} |
- |
-InspectorTest._waitForEventPromise = function(eventName) |
-{ |
- return new Promise(fulfill => InspectorTest._eventHandler[eventName] = fullfillAndClearListener.bind(null, fulfill)); |
+ return new Promise(fulfill => session._eventHandler[eventName] = fullfillAndClearListener.bind(null, fulfill)); |
function fullfillAndClearListener(fulfill, result) |
{ |
- delete InspectorTest._eventHandler[eventName]; |
+ delete session._eventHandler[eventName]; |
fulfill(result); |
} |
} |
-InspectorTest._dispatchMessage = function(messageObject) |
-{ |
- if (InspectorTest._dumpInspectorProtocolMessages) |
- utils.print("backend: " + JSON.stringify(messageObject)); |
- try { |
- var messageId = messageObject["id"]; |
- if (typeof messageId === "number") { |
- var handler = InspectorTest._dispatchTable.get(messageId); |
- if (handler) { |
- handler(messageObject); |
- InspectorTest._dispatchTable.delete(messageId); |
- } |
- } else { |
- var eventName = messageObject["method"]; |
- var eventHandler = InspectorTest._eventHandler[eventName]; |
- if (InspectorTest._scriptMap && eventName === "Debugger.scriptParsed") |
- InspectorTest._scriptMap.set(messageObject.params.scriptId, JSON.parse(JSON.stringify(messageObject.params))); |
- if (eventName === "Debugger.scriptParsed" && messageObject.params.url === "wait-pending-tasks.js") |
- return; |
- if (eventHandler) |
- eventHandler(messageObject); |
- } |
- } catch (e) { |
- InspectorTest.log("Exception when dispatching message: " + e + "\n" + e.stack + "\n message = " + JSON.stringify(messageObject, null, 2)); |
- InspectorTest.completeTest(); |
- } |
-} |
- |
-InspectorTest.loadScript = function(fileName) { |
- InspectorTest.addScript(utils.read(fileName)); |
-} |
- |
-InspectorTest.setupInjectedScriptEnvironment = function(debug) { |
+InspectorTest.setupInjectedScriptEnvironment = function(debug, session) { |
+ session = session || InspectorTest.session; |
let scriptSource = ''; |
// First define all getters on Object.prototype. |
let injectedScriptSource = utils.read('src/inspector/injected-script-source.js'); |
@@ -314,17 +337,28 @@ InspectorTest.setupInjectedScriptEnvironment = function(debug) { |
__proto__: null |
}); |
`).join('\n') + '})();'; |
- InspectorTest.addScript(scriptSource); |
+ session.contextGroup.addScript(scriptSource); |
if (debug) { |
InspectorTest.log('WARNING: InspectorTest.setupInjectedScriptEnvironment with debug flag for debugging only and should not be landed.'); |
InspectorTest.log('WARNING: run test with --expose-inspector-scripts flag to get more details.'); |
InspectorTest.log('WARNING: you can additionally comment rjsmin in xxd.py to get unminified injected-script-source.js.'); |
- InspectorTest.setupScriptMap(); |
- Protocol.Debugger.enable(); |
- Protocol.Debugger.onPaused(message => { |
+ InspectorTest.setupScriptMap(session); |
+ sesison.Protocol.Debugger.enable(); |
+ session.Protocol.Debugger.onPaused(message => { |
let callFrames = message.params.callFrames; |
- InspectorTest.logSourceLocations(callFrames.map(frame => frame.location)); |
+ InspectorTest.logSourceLocations(callFrames.map(frame => frame.location), session); |
}) |
} |
} |
+ |
+try { |
+ InspectorTest.contextGroup = InspectorTest.createContextGroup(); |
+ InspectorTest.session = InspectorTest.createSession(InspectorTest.contextGroup); |
+ this.Protocol = InspectorTest.session.Protocol; |
+ InspectorTest.addScript = InspectorTest.contextGroup.addScript.bind(InspectorTest.contextGroup); |
+ InspectorTest.addModule = InspectorTest.contextGroup.addModule.bind(InspectorTest.contextGroup); |
+ InspectorTest.loadScript = fileName => InspectorTest.addScript(utils.read(fileName)); |
+} catch (e) { |
+ utils.print(e.stack); |
+} |