text: // Copyright 2017 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
  
  let {session, contextGroup, Protocol} =
      InspectorTest.start('Tests Debugger.setScriptSource');
  
  session.setupScriptMap();
  
  function foo(a,b,c) {
  var x = a;
  debugger;
  return x + b;
  }
  
  function boo() {
  debugger;
  var x = 1;
  return x + 2;
  }
  
  InspectorTest.runAsyncTestSuite([
    async function addLineAfter() {
      await Protocol.Debugger.enable();
      Protocol.Runtime.evaluate({expression: foo.toString()});
      let {params:{scriptId}} = await Protocol.Debugger.onceScriptParsed();
      Protocol.Runtime.evaluate({
        expression: 'setTimeout(() => foo(1,2,3), 0)//# sourceURL=test.js'});
      let {params:{callFrames}} = await Protocol.Debugger.oncePaused();
      await session.logSourceLocation(callFrames[0].location);
      await replaceInSource(scriptId, 'debugger;', 'debugger;\nvar x = 3;');
  
      Protocol.Debugger.resume();
      await Protocol.Debugger.oncePaused();
      await Protocol.Debugger.disable();
    },
  
    async function addLineBefore() {
      await Protocol.Debugger.enable();
      Protocol.Runtime.evaluate({expression: foo.toString()});
      let {params:{scriptId}} = await Protocol.Debugger.onceScriptParsed();
      Protocol.Runtime.evaluate({
        expression: 'setTimeout(foo, 0)//# sourceURL=test.js'});
      let {params:{callFrames}} = await Protocol.Debugger.oncePaused();
      await session.logSourceLocation(callFrames[0].location);
      await replaceInSource(scriptId, 'debugger;', 'var x = 3;\ndebugger;');
  
      Protocol.Debugger.resume();
      await Protocol.Debugger.oncePaused();
      await Protocol.Debugger.disable();
    },
  
    async function breakAtFirstLineAddLineAfter() {
      await Protocol.Debugger.enable();
      Protocol.Runtime.evaluate({expression: boo.toString()});
      let {params:{scriptId}} = await Protocol.Debugger.onceScriptParsed();
      Protocol.Runtime.evaluate({
        expression: 'setTimeout(boo, 0)//# sourceURL=test.js'});
      let {params:{callFrames}} = await Protocol.Debugger.oncePaused();
      await session.logSourceLocation(callFrames[0].location);
      await replaceInSource(scriptId, 'debugger;', 'debugger;\nvar x = 3;');
  
      await Protocol.Debugger.disable();
    },
  
    async function breakAtFirstLineAddLineBefore() {
      await Protocol.Debugger.enable();
      Protocol.Runtime.evaluate({expression: boo.toString()});
      let {params:{scriptId}} = await Protocol.Debugger.onceScriptParsed();
      Protocol.Runtime.evaluate({
        expression: 'setTimeout(boo, 0)//# sourceURL=test.js'});
      let {params:{callFrames}} = await Protocol.Debugger.oncePaused();
      await session.logSourceLocation(callFrames[0].location);
      await replaceInSource(scriptId, 'debugger;', 'var x = 3;\ndebugger;');
  
      await Protocol.Debugger.disable();
    }
  ]);
  
  async function replaceInSource(scriptId, oldString, newString) {
    InspectorTest.log('---');
    let {result:{scriptSource}} =
        await Protocol.Debugger.getScriptSource({scriptId});
    let {result} = await Protocol.Debugger.setScriptSource({
      scriptId,
      scriptSource: scriptSource.replace(oldString, newString)
    });
    InspectorTest.log('Break location after LiveEdit:');
    await session.logSourceLocation(result.callFrames[0].location, true);
    InspectorTest.log('stackChanged: ' + result.stackChanged);
    if (result.stackChanged) {
      InspectorTest.log('Protocol.Debugger.stepInto');
      Protocol.Debugger.stepInto();
      var {params:{callFrames}} = await Protocol.Debugger.oncePaused();
      await session.logSourceLocation(callFrames[0].location);
    }
  }
  