| Index: test/inspector/debugger/set-script-source.js
|
| diff --git a/test/inspector/debugger/set-script-source.js b/test/inspector/debugger/set-script-source.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8e58503357e78373c5d661fbac09d411d1a0c154
|
| --- /dev/null
|
| +++ b/test/inspector/debugger/set-script-source.js
|
| @@ -0,0 +1,151 @@
|
| +// 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.evaluateInPage(
|
| +`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);
|
| + }
|
| + InspectorTest.sendCommand(currentStep.command, currentStep.params, 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;
|
| + }
|
| +}
|
|
|