diff options
Diffstat (limited to 'deps/v8/test/inspector/debugger/set-script-source.js')
-rw-r--r-- | deps/v8/test/inspector/debugger/set-script-source.js | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/deps/v8/test/inspector/debugger/set-script-source.js b/deps/v8/test/inspector/debugger/set-script-source.js new file mode 100644 index 0000000000..36944cca6c --- /dev/null +++ b/deps/v8/test/inspector/debugger/set-script-source.js @@ -0,0 +1,152 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +InspectorTest.addScript( +`function TestExpression(a, b) { + return a + b; +}`); + +// A general-purpose engine for sending a sequence of protocol commands. +// The clients provide requests and response handlers, while the engine catches +// errors and makes sure that once there's nothing to do completeTest() is called. +// @param step is an object with command, params and callback fields +function runRequestSeries(step) { + processStep(step); + + function processStep(currentStep) { + try { + processStepOrFail(currentStep); + } catch (e) { + InspectorTest.log(e.stack); + InspectorTest.completeTest(); + } + } + + function processStepOrFail(currentStep) { + if (!currentStep) { + InspectorTest.completeTest(); + return; + } + if (!currentStep.command) { + // A simple loopback step. + var next = currentStep.callback(); + processStep(next); + return; + } + + var innerCallback = function(response) { + var next; + if ("error" in response) { + if (!("errorHandler" in currentStep)) { + // Error message is not logged intentionally, it may be platform-specific. + InspectorTest.log("Protocol command '" + currentStep.command + "' failed"); + InspectorTest.completeTest(); + return; + } + try { + next = currentStep.errorHandler(response.error); + } catch (e) { + InspectorTest.log(e.stack); + InspectorTest.completeTest(); + return; + } + } else { + try { + next = currentStep.callback(response.result); + } catch (e) { + InspectorTest.log(e.stack); + InspectorTest.completeTest(); + return; + } + } + processStep(next); + } + var command = currentStep.command.split("."); + Protocol[command[0]][command[1]](currentStep.params).then(innerCallback); + } +} + +function logEqualsCheck(actual, expected) +{ + if (actual === expected) { + InspectorTest.log("PASS, result value: " + actual); + } else { + InspectorTest.log("FAIL, actual value: " + actual + ", expected: " + expected); + } +} +function logCheck(description, success) +{ + InspectorTest.log(description + ": " + (success ? "PASS" : "FAIL")); +} + +var firstStep = { callback: enableDebugger }; + +runRequestSeries(firstStep); + +function enableDebugger() { + return { command: "Debugger.enable", params: {}, callback: evalFunction }; +} + +function evalFunction(response) { + var expression = "TestExpression(2, 4)"; + return { command: "Runtime.evaluate", params: { expression: expression }, callback: callbackEvalFunction }; +} + +function callbackEvalFunction(result) { + InspectorTest.log("Function evaluate: " + JSON.stringify(result.result)); + logEqualsCheck(result.result.value, 6); + + return { command: "Runtime.evaluate", params: { expression: "TestExpression" }, callback: callbackEvalFunctionObject }; +} + +function callbackEvalFunctionObject(result) { + return { command: "Runtime.getProperties", params: { objectId: result.result.objectId }, callback: callbackFunctionDetails }; +} + +function callbackFunctionDetails(result) +{ + var scriptId; + for (var prop of result.internalProperties) { + if (prop.name === "[[FunctionLocation]]") + scriptId = prop.value.value.scriptId; + } + return createScriptManipulationArc(scriptId, null); +} + +// Several steps with scriptId in context. +function createScriptManipulationArc(scriptId, next) { + return { command: "Debugger.getScriptSource", params: { scriptId: scriptId }, callback: callbackGetScriptSource }; + + var originalText; + + function callbackGetScriptSource(result) { + originalText = result.scriptSource; + var patched = originalText.replace("a + b", "a * b"); + + return { command: "Debugger.setScriptSource", params: { scriptId: scriptId, scriptSource: patched }, callback: callbackSetScriptSource }; + } + + function callbackSetScriptSource(result) { + var expression = "TestExpression(2, 4)"; + return { command: "Runtime.evaluate", params: { expression: expression }, callback: callbackEvalFunction2 }; + } + + function callbackEvalFunction2(result) { + InspectorTest.log("Function evaluate: " + JSON.stringify(result.result)); + logEqualsCheck(result.result.value, 8); + + var patched = originalText.replace("a + b", "a # b"); + + return { command: "Debugger.setScriptSource", params: { scriptId: scriptId, scriptSource: patched }, callback: errorCallbackSetScriptSource2 }; + } + + function errorCallbackSetScriptSource2(result) { + var exceptionDetails = result.exceptionDetails; + logCheck("Has error reported", !!exceptionDetails); + logCheck("Reported error is a compile error", !!exceptionDetails); + if (exceptionDetails) + logEqualsCheck(exceptionDetails.lineNumber, 1); + return next; + } +} |