OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 InspectorTest.evaluateInPage( |
| 6 `function TestExpression(a, b) { |
| 7 return a + b; |
| 8 }`); |
| 9 |
| 10 // A general-purpose engine for sending a sequence of protocol commands. |
| 11 // The clients provide requests and response handlers, while the engine catches |
| 12 // errors and makes sure that once there's nothing to do completeTest() is calle
d. |
| 13 // @param step is an object with command, params and callback fields |
| 14 function runRequestSeries(step) { |
| 15 processStep(step); |
| 16 |
| 17 function processStep(currentStep) { |
| 18 try { |
| 19 processStepOrFail(currentStep); |
| 20 } catch (e) { |
| 21 InspectorTest.log(e.stack); |
| 22 InspectorTest.completeTest(); |
| 23 } |
| 24 } |
| 25 |
| 26 function processStepOrFail(currentStep) { |
| 27 if (!currentStep) { |
| 28 InspectorTest.completeTest(); |
| 29 return; |
| 30 } |
| 31 if (!currentStep.command) { |
| 32 // A simple loopback step. |
| 33 var next = currentStep.callback(); |
| 34 processStep(next); |
| 35 return; |
| 36 } |
| 37 |
| 38 var innerCallback = function(response) { |
| 39 var next; |
| 40 if ("error" in response) { |
| 41 if (!("errorHandler" in currentStep)) { |
| 42 // Error message is not logged intentionally, it may be platform-speci
fic. |
| 43 InspectorTest.log("Protocol command '" + currentStep.command + "' fail
ed"); |
| 44 InspectorTest.completeTest(); |
| 45 return; |
| 46 } |
| 47 try { |
| 48 next = currentStep.errorHandler(response.error); |
| 49 } catch (e) { |
| 50 InspectorTest.log(e.stack); |
| 51 InspectorTest.completeTest(); |
| 52 return; |
| 53 } |
| 54 } else { |
| 55 try { |
| 56 next = currentStep.callback(response.result); |
| 57 } catch (e) { |
| 58 InspectorTest.log(e.stack); |
| 59 InspectorTest.completeTest(); |
| 60 return; |
| 61 } |
| 62 } |
| 63 processStep(next); |
| 64 } |
| 65 InspectorTest.sendCommand(currentStep.command, currentStep.params, innerCall
back); |
| 66 } |
| 67 } |
| 68 |
| 69 function logEqualsCheck(actual, expected) |
| 70 { |
| 71 if (actual === expected) { |
| 72 InspectorTest.log("PASS, result value: " + actual); |
| 73 } else { |
| 74 InspectorTest.log("FAIL, actual value: " + actual + ", expected: " + expecte
d); |
| 75 } |
| 76 } |
| 77 function logCheck(description, success) |
| 78 { |
| 79 InspectorTest.log(description + ": " + (success ? "PASS" : "FAIL")); |
| 80 } |
| 81 |
| 82 var firstStep = { callback: enableDebugger }; |
| 83 |
| 84 runRequestSeries(firstStep); |
| 85 |
| 86 function enableDebugger() { |
| 87 return { command: "Debugger.enable", params: {}, callback: evalFunction }; |
| 88 } |
| 89 |
| 90 function evalFunction(response) { |
| 91 var expression = "TestExpression(2, 4)"; |
| 92 return { command: "Runtime.evaluate", params: { expression: expression }, call
back: callbackEvalFunction }; |
| 93 } |
| 94 |
| 95 function callbackEvalFunction(result) { |
| 96 InspectorTest.log("Function evaluate: " + JSON.stringify(result.result)); |
| 97 logEqualsCheck(result.result.value, 6); |
| 98 |
| 99 return { command: "Runtime.evaluate", params: { expression: "TestExpression" }
, callback: callbackEvalFunctionObject }; |
| 100 } |
| 101 |
| 102 function callbackEvalFunctionObject(result) { |
| 103 return { command: "Runtime.getProperties", params: { objectId: result.result.o
bjectId }, callback: callbackFunctionDetails }; |
| 104 } |
| 105 |
| 106 function callbackFunctionDetails(result) |
| 107 { |
| 108 var scriptId; |
| 109 for (var prop of result.internalProperties) { |
| 110 if (prop.name === "[[FunctionLocation]]") |
| 111 scriptId = prop.value.value.scriptId; |
| 112 } |
| 113 return createScriptManipulationArc(scriptId, null); |
| 114 } |
| 115 |
| 116 // Several steps with scriptId in context. |
| 117 function createScriptManipulationArc(scriptId, next) { |
| 118 return { command: "Debugger.getScriptSource", params: { scriptId: scriptId },
callback: callbackGetScriptSource }; |
| 119 |
| 120 var originalText; |
| 121 |
| 122 function callbackGetScriptSource(result) { |
| 123 originalText = result.scriptSource; |
| 124 var patched = originalText.replace("a + b", "a * b"); |
| 125 |
| 126 return { command: "Debugger.setScriptSource", params: { scriptId: scriptId,
scriptSource: patched }, callback: callbackSetScriptSource }; |
| 127 } |
| 128 |
| 129 function callbackSetScriptSource(result) { |
| 130 var expression = "TestExpression(2, 4)"; |
| 131 return { command: "Runtime.evaluate", params: { expression: expression }, ca
llback: callbackEvalFunction2 }; |
| 132 } |
| 133 |
| 134 function callbackEvalFunction2(result) { |
| 135 InspectorTest.log("Function evaluate: " + JSON.stringify(result.result)); |
| 136 logEqualsCheck(result.result.value, 8); |
| 137 |
| 138 var patched = originalText.replace("a + b", "a # b"); |
| 139 |
| 140 return { command: "Debugger.setScriptSource", params: { scriptId: scriptId,
scriptSource: patched }, callback: errorCallbackSetScriptSource2 }; |
| 141 } |
| 142 |
| 143 function errorCallbackSetScriptSource2(result) { |
| 144 var exceptionDetails = result.exceptionDetails; |
| 145 logCheck("Has error reported", !!exceptionDetails); |
| 146 logCheck("Reported error is a compile error", !!exceptionDetails); |
| 147 if (exceptionDetails) |
| 148 logEqualsCheck(exceptionDetails.lineNumber, 1); |
| 149 return next; |
| 150 } |
| 151 } |
OLD | NEW |