aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/test/inspector/debugger/continue-to-location.js
blob: 878499d1feaa658299924a98e1855f7775d9d0ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// 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.

let {session, contextGroup, Protocol} = InspectorTest.start('Tests Debugger.continueToLocation');

contextGroup.addScript(
`function statementsExample()
{
  var self = arguments.callee;

  debugger;

  self.step = 1;

  self.step = 2;

  void [
    self.step = 3,
    self.step = 4,
    self.step = 5,
    self.step = 6
  ];

  self.step = 7;
}`);

var scenario = [
  // requested line number, expected control parameter 'step', expected line number
  [ 8, 1, 8 ],
  [ 8, 1, 8 ],
  [ 12, 6, 17 ],
  [ 13, 6, 17 ],
  [ 17, 6, 17 ],
  [ 17, 6, 17 ],
];

Protocol.Debugger.enable();

Protocol.Runtime.evaluate({ "expression": "statementsExample" }).then(callbackEvalFunctionObject);

function callbackEvalFunctionObject(response)
{
  var functionObjectId = response.result.result.objectId;
  Protocol.Runtime.getProperties({ objectId: functionObjectId }).then(callbackFunctionDetails);
}

function callbackFunctionDetails(response)
{
  var result = response.result;
  var scriptId;
  for (var prop of result.internalProperties) {
    if (prop.name === "[[FunctionLocation]]")
      scriptId = prop.value.value.scriptId;
  }

  nextScenarioStep(0);

  function nextScenarioStep(pos)
  {
    if (pos < scenario.length)
      gotoSinglePassChain(scriptId, scenario[pos][0], scenario[pos][1], scenario[pos][2], nextScenarioStep.bind(this, pos + 1));
    else
      InspectorTest.completeTest();
  }
}

function gotoSinglePassChain(scriptId, lineNumber, expectedResult, expectedLineNumber, next)
{
  Protocol.Debugger.oncePaused().then(handleDebuggerPausedOne);

  Protocol.Runtime.evaluate({ "expression": "setTimeout(statementsExample, 0)" });

  function handleDebuggerPausedOne(messageObject)
  {
    InspectorTest.log("Paused on debugger statement");

    Protocol.Debugger.oncePaused().then(handleDebuggerPausedTwo);

    Protocol.Debugger.continueToLocation({ location: { scriptId: scriptId, lineNumber: lineNumber, columnNumber: 0} }).then(logContinueToLocation);

    function logContinueToLocation(response)
    {
      if (response.error) {
        InspectorTest.log("Failed to execute continueToLocation " + JSON.stringify(response.error));
        InspectorTest.completeTest();
      }
    }
  }
  function handleDebuggerPausedTwo(messageObject)
  {
    InspectorTest.log("Paused after continueToLocation");
    var actualLineNumber = messageObject.params.callFrames[0].location.lineNumber;

    InspectorTest.log("Stopped on line " + actualLineNumber + ", expected " + expectedLineNumber + ", requested " + lineNumber + ", (0-based numbers).");

    Protocol.Debugger.oncePaused(handleDebuggerPausedUnexpected);

    Protocol.Runtime.evaluate({ "expression": "statementsExample.step" }).then(callbackStepEvaluate);
  }

  function callbackStepEvaluate(response)
  {
    var resultValue = response.result.result.value;
    InspectorTest.log("Control parameter 'step' calculation result: " + resultValue + ", expected: " + expectedResult);
    InspectorTest.log(resultValue === expectedResult ? "SUCCESS" : "FAIL");
    Protocol.Debugger.resume();
    next();
  }

  function handleDebuggerPausedUnexpected(messageObject)
  {
    InspectorTest.log("Unexpected debugger pause");
    InspectorTest.completeTest();
  }
}