| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project 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 InspectorTest = {}; | 5 InspectorTest = {}; |
| 6 InspectorTest._dispatchTable = new Map(); | 6 InspectorTest._dispatchTable = new Map(); |
| 7 InspectorTest._requestId = 0; | 7 InspectorTest._requestId = 0; |
| 8 InspectorTest._dumpInspectorProtocolMessages = false; | 8 InspectorTest._dumpInspectorProtocolMessages = false; |
| 9 InspectorTest.eventHandler = {}; | 9 InspectorTest._eventHandler = {}; |
| 10 | 10 |
| 11 InspectorTest.startDumpingProtocolMessages = function() | 11 Protocol = new Proxy({}, { |
| 12 { | 12 get: function(target, agentName, receiver) { |
| 13 InspectorTest._dumpInspectorProtocolMessages = true; | 13 return new Proxy({}, { |
| 14 } | 14 get: function(target, methodName, receiver) { |
| 15 | 15 const eventPattern = /^on(ce)?([A-Z][A-Za-z0-9]+)/; |
| 16 InspectorTest.sendCommand = function(method, params, handler) | 16 var match = eventPattern.exec(methodName); |
| 17 { | 17 if (!match) { |
| 18 var requestId = ++InspectorTest._requestId; | 18 return (args) => InspectorTest._sendCommandPromise(`${agentName}.${met
hodName}`, args || {}); |
| 19 var messageObject = { "id": requestId, "method": method, "params": params }; | 19 } else { |
| 20 InspectorTest.sendRawCommand(requestId, JSON.stringify(messageObject), handler
); | 20 var eventName = match[2]; |
| 21 } | 21 eventName = eventName.charAt(0).toLowerCase() + eventName.slice(1); |
| 22 | 22 if (match[1]) |
| 23 InspectorTest.sendRawCommand = function(requestId, command, handler) | 23 return (args) => InspectorTest._waitForEventPromise(`${agentName}.${
eventName}`, args || {}); |
| 24 { | 24 else |
| 25 if (InspectorTest._dumpInspectorProtocolMessages) | 25 return (listener) => { InspectorTest._eventHandler[`${agentName}.${e
ventName}`] = listener }; |
| 26 print("frontend: " + command); | 26 } |
| 27 InspectorTest._dispatchTable.set(requestId, handler); | 27 } |
| 28 sendMessageToBackend(command); | 28 }); |
| 29 } | |
| 30 | |
| 31 InspectorTest.sendCommandOrDie = function(command, properties, callback) | |
| 32 { | |
| 33 InspectorTest.sendCommand(command, properties, commandCallback); | |
| 34 function commandCallback(msg) | |
| 35 { | |
| 36 if (msg.error) { | |
| 37 InspectorTest.log("ERROR: " + msg.error.message); | |
| 38 InspectorTest.completeTest(); | |
| 39 return; | |
| 40 } | |
| 41 if (callback) | |
| 42 callback(msg.result); | |
| 43 } | 29 } |
| 44 } | 30 }); |
| 45 | |
| 46 InspectorTest.sendCommandPromise = function(method, params) | |
| 47 { | |
| 48 return new Promise(fulfill => InspectorTest.sendCommand(method, params, fulfil
l)); | |
| 49 } | |
| 50 | |
| 51 InspectorTest.waitForEventPromise = function(eventName) | |
| 52 { | |
| 53 return new Promise(fulfill => InspectorTest.eventHandler[eventName] = fullfill
AndClearListener.bind(null, fulfill)); | |
| 54 | |
| 55 function fullfillAndClearListener(fulfill, result) | |
| 56 { | |
| 57 delete InspectorTest.eventHandler[eventName]; | |
| 58 fulfill(result); | |
| 59 } | |
| 60 } | |
| 61 | |
| 62 InspectorTest.dispatchMessage = function(messageObject) | |
| 63 { | |
| 64 if (InspectorTest._dumpInspectorProtocolMessages) | |
| 65 print("backend: " + JSON.stringify(messageObject)); | |
| 66 try { | |
| 67 var messageId = messageObject["id"]; | |
| 68 if (typeof messageId === "number") { | |
| 69 var handler = InspectorTest._dispatchTable.get(messageId); | |
| 70 if (handler) { | |
| 71 handler(messageObject); | |
| 72 InspectorTest._dispatchTable.delete(messageId); | |
| 73 } | |
| 74 } else { | |
| 75 var eventName = messageObject["method"]; | |
| 76 var eventHandler = InspectorTest.eventHandler[eventName]; | |
| 77 if (eventHandler) | |
| 78 eventHandler(messageObject); | |
| 79 } | |
| 80 } catch (e) { | |
| 81 InspectorTest.log("Exception when dispatching message: " + e + "\n" + e.stac
k + "\n message = " + JSON.stringify(messageObject, null, 2)); | |
| 82 InspectorTest.completeTest(); | |
| 83 } | |
| 84 } | |
| 85 | 31 |
| 86 InspectorTest.log = print.bind(null); | 32 InspectorTest.log = print.bind(null); |
| 87 | 33 |
| 34 InspectorTest.logMessage = function(message) |
| 35 { |
| 36 if (message.id) |
| 37 message.id = "<messageId>"; |
| 38 |
| 39 const nonStableFields = new Set(["objectId", "scriptId", "exceptionId", "times
tamp"]); |
| 40 var objects = [ message ]; |
| 41 while (objects.length) { |
| 42 var object = objects.shift(); |
| 43 for (var key in object) { |
| 44 if (nonStableFields.has(key)) |
| 45 object[key] = `<${key}>`; |
| 46 else if (typeof object[key] === "object") |
| 47 objects.push(object[key]); |
| 48 } |
| 49 } |
| 50 |
| 51 InspectorTest.logObject(message); |
| 52 return message; |
| 53 } |
| 54 |
| 88 InspectorTest.logObject = function(object, title) | 55 InspectorTest.logObject = function(object, title) |
| 89 { | 56 { |
| 90 var lines = []; | 57 var lines = []; |
| 91 | 58 |
| 92 function dumpValue(value, prefix, prefixWithName) | 59 function dumpValue(value, prefix, prefixWithName) |
| 93 { | 60 { |
| 94 if (typeof value === "object" && value !== null) { | 61 if (typeof value === "object" && value !== null) { |
| 95 if (value instanceof Array) | 62 if (value instanceof Array) |
| 96 dumpItems(value, prefix, prefixWithName); | 63 dumpItems(value, prefix, prefixWithName); |
| 97 else | 64 else |
| (...skipping 28 matching lines...) Expand all Loading... |
| 126 lines.push(firstLinePrefix + "["); | 93 lines.push(firstLinePrefix + "["); |
| 127 for (var i = 0; i < object.length; ++i) | 94 for (var i = 0; i < object.length; ++i) |
| 128 dumpValue(object[i], " " + prefix, " " + prefix + "[" + i + "] : "); | 95 dumpValue(object[i], " " + prefix, " " + prefix + "[" + i + "] : "); |
| 129 lines.push(prefix + "]"); | 96 lines.push(prefix + "]"); |
| 130 } | 97 } |
| 131 | 98 |
| 132 dumpValue(object, "", title); | 99 dumpValue(object, "", title); |
| 133 InspectorTest.log(lines.join("\n")); | 100 InspectorTest.log(lines.join("\n")); |
| 134 } | 101 } |
| 135 | 102 |
| 136 InspectorTest.logMessage = function(message) | |
| 137 { | |
| 138 if (message.id) | |
| 139 message.id = 0; | |
| 140 | |
| 141 const nonStableFields = new Set(["objectId", "scriptId", "exceptionId"]); | |
| 142 var objects = [ message ]; | |
| 143 while (objects.length) { | |
| 144 var object = objects.shift(); | |
| 145 for (var key in object) { | |
| 146 if (nonStableFields.has(key)) | |
| 147 object[key] = `<${key}>`; | |
| 148 else if (typeof object[key] === "object") | |
| 149 objects.push(object[key]); | |
| 150 } | |
| 151 } | |
| 152 | |
| 153 InspectorTest.logObject(message); | |
| 154 return message; | |
| 155 } | |
| 156 | |
| 157 InspectorTest.completeTest = quit.bind(null); | 103 InspectorTest.completeTest = quit.bind(null); |
| 158 | 104 |
| 159 InspectorTest.completeTestAfterPendingTimeouts = function() | 105 InspectorTest.completeTestAfterPendingTimeouts = function() |
| 160 { | 106 { |
| 161 InspectorTest.sendCommand("Runtime.evaluate", { | 107 InspectorTest.sendCommand("Runtime.evaluate", { |
| 162 expression: "new Promise(resolve => setTimeout(resolve, 0))", | 108 expression: "new Promise(resolve => setTimeout(resolve, 0))", |
| 163 awaitPromise: true }, InspectorTest.completeTest); | 109 awaitPromise: true }, InspectorTest.completeTest); |
| 164 } | 110 } |
| 165 | 111 |
| 166 InspectorTest.evaluateInPage = function(string, callback) | 112 InspectorTest.addScript = function(string) |
| 167 { | 113 { |
| 168 InspectorTest.sendCommand("Runtime.evaluate", { "expression": string }, functi
on(message) { | 114 return InspectorTest._sendCommandPromise("Runtime.evaluate", { "expression": s
tring }).then(dumpErrorIfNeeded); |
| 115 |
| 116 function dumpErrorIfNeeded(message) |
| 117 { |
| 169 if (message.error) { | 118 if (message.error) { |
| 170 InspectorTest.log("Error while executing '" + string + "': " + message.err
or.message); | 119 InspectorTest.log("Error while executing '" + string + "': " + message.err
or.message); |
| 171 InspectorTest.completeTest(); | 120 InspectorTest.completeTest(); |
| 172 } | 121 } |
| 173 else if (callback) | 122 } |
| 174 callback(message.result.result.value); | |
| 175 }); | |
| 176 }; | 123 }; |
| 177 | 124 |
| 125 InspectorTest.startDumpingProtocolMessages = function() |
| 126 { |
| 127 InspectorTest._dumpInspectorProtocolMessages = true; |
| 128 } |
| 129 |
| 130 InspectorTest.sendRawCommand = function(requestId, command, handler) |
| 131 { |
| 132 if (InspectorTest._dumpInspectorProtocolMessages) |
| 133 print("frontend: " + command); |
| 134 InspectorTest._dispatchTable.set(requestId, handler); |
| 135 sendMessageToBackend(command); |
| 136 } |
| 137 |
| 178 InspectorTest.checkExpectation = function(fail, name, messageObject) | 138 InspectorTest.checkExpectation = function(fail, name, messageObject) |
| 179 { | 139 { |
| 180 if (fail === !!messageObject.error) { | 140 if (fail === !!messageObject.error) { |
| 181 InspectorTest.log("PASS: " + name); | 141 InspectorTest.log("PASS: " + name); |
| 182 return true; | 142 return true; |
| 183 } | 143 } |
| 184 | 144 |
| 185 InspectorTest.log("FAIL: " + name + ": " + JSON.stringify(messageObject)); | 145 InspectorTest.log("FAIL: " + name + ": " + JSON.stringify(messageObject)); |
| 186 InspectorTest.completeTest(); | 146 InspectorTest.completeTest(); |
| 187 return false; | 147 return false; |
| 188 } | 148 } |
| 189 InspectorTest.expectedSuccess = InspectorTest.checkExpectation.bind(null, false)
; | 149 InspectorTest.expectedSuccess = InspectorTest.checkExpectation.bind(null, false)
; |
| 190 InspectorTest.expectedError = InspectorTest.checkExpectation.bind(null, true); | 150 InspectorTest.expectedError = InspectorTest.checkExpectation.bind(null, true); |
| 191 | 151 |
| 192 InspectorTest.runTestSuite = function(testSuite) | 152 InspectorTest.runTestSuite = function(testSuite) |
| 193 { | 153 { |
| 194 function nextTest() | 154 function nextTest() |
| 195 { | 155 { |
| 196 if (!testSuite.length) { | 156 if (!testSuite.length) { |
| 197 InspectorTest.completeTest(); | 157 InspectorTest.completeTest(); |
| 198 return; | 158 return; |
| 199 } | 159 } |
| 200 var fun = testSuite.shift(); | 160 var fun = testSuite.shift(); |
| 201 InspectorTest.log("\nRunning test: " + fun.name); | 161 InspectorTest.log("\nRunning test: " + fun.name); |
| 202 fun(nextTest); | 162 fun(nextTest); |
| 203 } | 163 } |
| 204 nextTest(); | 164 nextTest(); |
| 205 } | 165 } |
| 166 |
| 167 InspectorTest._sendCommandPromise = function(method, params) |
| 168 { |
| 169 var requestId = ++InspectorTest._requestId; |
| 170 var messageObject = { "id": requestId, "method": method, "params": params }; |
| 171 var fulfillCallback; |
| 172 var promise = new Promise(fulfill => fulfillCallback = fulfill); |
| 173 InspectorTest.sendRawCommand(requestId, JSON.stringify(messageObject), fulfill
Callback); |
| 174 return promise; |
| 175 } |
| 176 |
| 177 InspectorTest._waitForEventPromise = function(eventName) |
| 178 { |
| 179 return new Promise(fulfill => InspectorTest._eventHandler[eventName] = fullfil
lAndClearListener.bind(null, fulfill)); |
| 180 |
| 181 function fullfillAndClearListener(fulfill, result) |
| 182 { |
| 183 delete InspectorTest._eventHandler[eventName]; |
| 184 fulfill(result); |
| 185 } |
| 186 } |
| 187 |
| 188 InspectorTest._dispatchMessage = function(messageObject) |
| 189 { |
| 190 if (InspectorTest._dumpInspectorProtocolMessages) |
| 191 print("backend: " + JSON.stringify(messageObject)); |
| 192 try { |
| 193 var messageId = messageObject["id"]; |
| 194 if (typeof messageId === "number") { |
| 195 var handler = InspectorTest._dispatchTable.get(messageId); |
| 196 if (handler) { |
| 197 handler(messageObject); |
| 198 InspectorTest._dispatchTable.delete(messageId); |
| 199 } |
| 200 } else { |
| 201 var eventName = messageObject["method"]; |
| 202 var eventHandler = InspectorTest._eventHandler[eventName]; |
| 203 if (eventHandler) |
| 204 eventHandler(messageObject); |
| 205 } |
| 206 } catch (e) { |
| 207 InspectorTest.log("Exception when dispatching message: " + e + "\n" + e.stac
k + "\n message = " + JSON.stringify(messageObject, null, 2)); |
| 208 InspectorTest.completeTest(); |
| 209 } |
| 210 } |
| OLD | NEW |