// Copyright 2019 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. // Flags: --no-always-opt const { contextGroup, Protocol } = InspectorTest.start( `Tests that exercise Debugger.setVariableValue`); (async function test(){ await Protocol.Debugger.enable(); await Protocol.Runtime.enable(); contextGroup.addInlineScript(` function test() { let num = 5; let obj = {b: 4}; let bool = true; let set_breakpoint_here = true; debugger; } `, 'test.js'); Protocol.Runtime.evaluate({expression: "test();"}); const {params:{callFrames:[{callFrameId}]}} = await Protocol.Debugger.oncePaused(); InspectorTest.runAsyncTestSuite([ async function testSetVariableValueMain() { // Set value to a Number let result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'num', callFrameId }); InspectorTest.logMessage(result); await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { value: 10 }, callFrameId }); result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'num', callFrameId }); InspectorTest.logMessage(result); // Set Value to NaN await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { unserializableValue: 'NaN' }, callFrameId }); result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'num', callFrameId }); InspectorTest.logMessage(result); // Set Value to boolean:true await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { value: true }, callFrameId }); result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'num', callFrameId }); InspectorTest.logMessage(result); // Set Value to a new object await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { value: { a: 3 } }, callFrameId }); result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'num', callFrameId }); InspectorTest.logMessage(result); let props = await Protocol.Runtime.getProperties({ objectId: result.result.result.objectId, ownProperties: true }); InspectorTest.logMessage(props); // Set Value to new Array await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { value: ['1', '2', '3'] }, callFrameId }); result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'num', callFrameId }); InspectorTest.logMessage(result); props = await Protocol.Runtime.getProperties({ objectId: result.result.result.objectId, ownProperties: true }); InspectorTest.logMessage(props); // Set Value to existing object with objectId result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'obj', callFrameId: callFrameId }); let objectId = result.result.result.objectId; await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { objectId: objectId }, callFrameId: callFrameId }); result = await Protocol.Debugger.evaluateOnCallFrame({ expression: 'num', callFrameId: callFrameId }); InspectorTest.logMessage(result); props = await Protocol.Runtime.getProperties({ objectId: result.result.result.objectId, ownProperties: true }); InspectorTest.logMessage(props); }, async function testInvalidFrame() { let result = await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { unserializableValue: 'NaN' }, callFrameId: 'fakeCallFrame' }); InspectorTest.log('setVariableValue with invalid callFrameId'); InspectorTest.logMessage(InspectorTest.trimErrorMessage(result)); result = await Protocol.Debugger.setVariableValue({ scopeNumber: 'invalidScopeType', variableName: 'num', newValue: { unserializableValue: 'NaN' }, callFrameId }); InspectorTest.log('setVariableValue with invalid scopeNumber') InspectorTest.logMessage(InspectorTest.trimErrorMessage(result)); result = await Protocol.Debugger.setVariableValue({ scopeNumber: 1000, variableName: 'num', newValue: { unserializableValue: 'NaN' }, callFrameId }); InspectorTest.log('setVariableValue with invalid scopeNumber'); InspectorTest.logMessage(result); result = await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'FakeObjectName', newValue: { unserializableValue: 'NaN' }, callFrameId }); InspectorTest.log('setVariableValue with invalid variableName'); InspectorTest.logMessage(InspectorTest.trimErrorMessage(result)); }, async function testNewValueErrors() { let result = await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { unserializableValue: 'not unserializable value' }, callFrameId }); InspectorTest.log('setVariableValue with invalid unserializableValue'); InspectorTest.logMessage(InspectorTest.trimErrorMessage(result)); result = await Protocol.Debugger.setVariableValue({ scopeNumber: 0, variableName: 'num', newValue: { objectId: 2000 }, callFrameId }); InspectorTest.log('setVariableValue with invalid objectId'); InspectorTest.logMessage(InspectorTest.trimErrorMessage(result)); } ]); })();