summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js
blob: bc923ff4495b82e6df70286f9899b9b1254f2da5 (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

// Test that makes sure web console eval happens in the user-selected stackframe
// from the js debugger.

"use strict";

const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                 "test/test-eval-in-stackframe.html";

var gWebConsole, gJSTerm, gDebuggerWin, gThread, gDebuggerController;
var gStackframes;

// Force the old debugger UI since it's directly used (see Bug 1301705)
Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
registerCleanupFunction(function* () {
  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
});

function test() {
  loadTab(TEST_URI).then(() => {
    openConsole().then(consoleOpened);
  });
}

function consoleOpened(hud) {
  gWebConsole = hud;
  gJSTerm = hud.jsterm;
  gJSTerm.execute("foo").then(onExecuteFoo);
}

function onExecuteFoo() {
  isnot(gWebConsole.outputNode.textContent.indexOf("globalFooBug783499"), -1,
        "|foo| value is correct");

  gJSTerm.clearOutput();

  // Test for Bug 690529 - Web Console and Scratchpad should evaluate
  // expressions in the scope of the content window, not in a sandbox.
  executeSoon(() => {
    gJSTerm.execute("foo2 = 'newFoo'; window.foo2").then(onNewFoo2);
  });
}

function onNewFoo2(msg) {
  is(gWebConsole.outputNode.textContent.indexOf("undefined"), -1,
     "|undefined| is not displayed after adding |foo2|");

  ok(msg, "output result found");

  isnot(msg.textContent.indexOf("newFoo"), -1,
        "'newFoo' is displayed after adding |foo2|");

  gJSTerm.clearOutput();

  info("openDebugger");
  executeSoon(() => openDebugger().then(debuggerOpened));
}

function debuggerOpened(aResult) {
  gDebuggerWin = aResult.panelWin;
  gDebuggerController = gDebuggerWin.DebuggerController;
  gThread = gDebuggerController.activeThread;
  gStackframes = gDebuggerController.StackFrames;

  info("openConsole");
  executeSoon(() =>
    openConsole().then(() =>
      gJSTerm.execute("foo + foo2").then(onExecuteFooAndFoo2)
    )
  );
}

function onExecuteFooAndFoo2() {
  let expected = "globalFooBug783499newFoo";
  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
        "|foo + foo2| is displayed after starting the debugger");

  executeSoon(() => {
    gJSTerm.clearOutput();

    info("openDebugger");
    openDebugger().then(() => {
      gThread.addOneTimeListener("framesadded", onFramesAdded);

      info("firstCall()");
      ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
        content.wrappedJSObject.firstCall();
      });
    });
  });
}

function onFramesAdded() {
  info("onFramesAdded, openConsole() now");
  executeSoon(() =>
    openConsole().then(() =>
      gJSTerm.execute("foo + foo2").then(onExecuteFooAndFoo2InSecondCall)
    )
  );
}

function onExecuteFooAndFoo2InSecondCall() {
  let expected = "globalFooBug783499foo2SecondCall";
  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
        "|foo + foo2| from |secondCall()|");

  function runOpenConsole() {
    openConsole().then(() => {
      gJSTerm.execute("foo + foo2 + foo3").then(onExecuteFoo23InFirstCall);
    });
  }

  executeSoon(() => {
    gJSTerm.clearOutput();

    info("openDebugger and selectFrame(1)");

    openDebugger().then(() => {
      gStackframes.selectFrame(1);

      info("openConsole");
      executeSoon(() => runOpenConsole());
    });
  });
}

function onExecuteFoo23InFirstCall() {
  let expected = "fooFirstCallnewFoofoo3FirstCall";
  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
        "|foo + foo2 + foo3| from |firstCall()|");

  executeSoon(() =>
    gJSTerm.execute("foo = 'abba'; foo3 = 'bug783499'; foo + foo3").then(
                    onExecuteFooAndFoo3ChangesInFirstCall));
}

var onExecuteFooAndFoo3ChangesInFirstCall = Task.async(function*() {
  let expected = "abbabug783499";
  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
        "|foo + foo3| updated in |firstCall()|");

  yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
    is(content.wrappedJSObject.foo, "globalFooBug783499",
       "|foo| in content window");
    is(content.wrappedJSObject.foo2, "newFoo", "|foo2| in content window");
    ok(!content.wrappedJSObject.foo3,
       "|foo3| was not added to the content window");
  });

  gWebConsole = gJSTerm = gDebuggerWin = gThread = gDebuggerController =
    gStackframes = null;
  executeSoon(finishTest);
});