summaryrefslogtreecommitdiff
path: root/deps/v8/test/inspector/debugger/framework-stepping.js
blob: 3ce20d880134062ec035d9f5009683db3652056f (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
// 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.

let {session, contextGroup, Protocol} = InspectorTest.start('Checks stepping with blackboxed frames on stack');

contextGroup.addInlineScript(
    `
function frameworkCall(funcs) {
  for (var f of funcs) f();
}

function frameworkBreakAndCall(funcs) {
  inspector.breakProgram('', '');
  for (var f of funcs) f();
}`,
    'framework.js');

contextGroup.addInlineScript(
    `
function userFoo() {
  return 1;
}

function userBoo() {
  return 2;
}

function testStepFromUser() {
  frameworkCall([userFoo, userBoo])
}

function testStepFromFramework() {
  frameworkBreakAndCall([userFoo, userBoo]);
}`,
    'user.js');

session.setupScriptMap();

Protocol.Debugger.enable()
    .then(
        () => Protocol.Debugger.setBlackboxPatterns(
            {patterns: ['framework\.js']}))
    .then(() => InspectorTest.runTestSuite(testSuite));

var testSuite = [
  function testStepIntoFromUser(next) {
    contextGroup.schedulePauseOnNextStatement('', '');
    test('testStepFromUser()', [
      'print',                          // before testStepFromUser call
      'stepInto', 'stepInto', 'print',  // userFoo
      'stepInto', 'stepInto', 'print',  // userBoo
      'stepInto', 'stepInto', 'print'   // testStepFromUser
    ]).then(next);
  },

  function testStepOverFromUser(next) {
    contextGroup.schedulePauseOnNextStatement('', '');
    test('testStepFromUser()', [
      'print',                          // before testStepFromUser call
      'stepInto', 'stepInto', 'print',  // userFoo
      'stepOver', 'stepOver', 'print',  // userBoo
      'stepOver', 'stepOver', 'print'   // testStepFromUser
    ]).then(next);
  },

  function testStepOutFromUser(next) {
    contextGroup.schedulePauseOnNextStatement('', '');
    test('testStepFromUser()', [
      'print',                          // before testStepFromUser call
      'stepInto', 'stepInto', 'print',  // userFoo
      'stepOut', 'print'                // testStepFromUser
    ]).then(next);
  },

  function testStepIntoFromFramework(next) {
    test('testStepFromFramework()', [
      'print',              // frameworkBreakAndCall
      'stepInto', 'print',  // userFoo
    ]).then(next);
  },

  function testStepOverFromFramework(next) {
    test('testStepFromFramework()', [
      'print',              // frameworkBreakAndCall
      'stepOver', 'print',  // testStepFromFramework
    ]).then(next);
  },

  function testStepOutFromFramework(next) {
    test('testStepFromFramework()', [
      'print',             // frameworkBreakAndCall
      'stepOut', 'print',  // testStepFromFramework
    ]).then(next);
  }
];

function test(entryExpression, actions) {
  Protocol.Debugger.onPaused(message => {
    var action = actions.shift() || 'resume';
    if (action === 'print') {
      session.logCallFrames(message.params.callFrames);
      InspectorTest.log('');
      action = actions.shift() || 'resume';
    }
    if (action) InspectorTest.log(`Executing ${action}...`);
    Protocol.Debugger[action]();
  });
  return Protocol.Runtime.evaluate(
      {expression: entryExpression + '//# sourceURL=expr.js'});
}