summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/test/browser/browser_jsterm_helpers_no_override.js
blob: 674e92c0388c89d12506240d629b439e1c5135a9 (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
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Check that console helpers are not set when existing variables with similar names
// exists in the page.

const TEST_URI = `data:text/html,<!DOCTYPE html><script>
    var $ = "var_$";
    const $$ = "const_$$";
    let help = "let_help";
    globalThis.values = "globalThis_values";
    function keys() {
      return "function_keys";
    }

    function pauseInDebugger() {
      let $x = "let_$x";
      debugger;
    }
  </script>`;

add_task(async function () {
  const hud = await openNewTabAndConsole(TEST_URI);

  let message = await executeAndWaitForResultMessage(hud, "$", "var_$");
  ok(message, "$ was not overridden");

  message = await executeAndWaitForResultMessage(hud, "$$", "const_$$");
  ok(message, "$$ was not overridden");

  message = await executeAndWaitForResultMessage(hud, "help", "let_help");
  ok(message, "help was not overridden");

  message = await executeAndWaitForResultMessage(
    hud,
    "values",
    "globalThis_values"
  );
  ok(message, "values was not overridden");

  message = await executeAndWaitForResultMessage(
    hud,
    "keys()",
    "function_keys"
  );
  ok(message, "keys was not overridden");

  info("Pause in Debugger");
  await openDebugger();
  const toolbox = gDevTools.getToolboxForTab(gBrowser.selectedTab);
  const dbg = createDebuggerContext(toolbox);
  SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
    content.wrappedJSObject.pauseInDebugger();
  });
  await pauseDebugger(dbg);

  info("Go back to Console");
  await toolbox.selectTool("webconsole");
  message = await executeAndWaitForResultMessage(hud, "$x", "let_$x");
  ok(
    message,
    `frame variable "$x" was not overridden while paused in the debugger`
  );

  await resume(dbg);
});

add_task(async function () {
  // Test the behavior when the variables are declared in the script.

  const hud = await openNewTabAndConsole("data:text/html,Nothing");

  let message = await executeAndWaitForResultMessage(
    hud,
    "var $ = 'var_$'; $",
    "var_$"
  );
  ok(message, "$ was not overridden");

  message = await executeAndWaitForResultMessage(
    hud,
    "const $$ = 'const_$$'; $$",
    "const_$$"
  );
  ok(message, "$$ was not overridden");

  message = await executeAndWaitForResultMessage(
    hud,
    "function keys() { return 'function_keys';  } keys()",
    "function_keys"
  );
  ok(message, "keys was not overridden");

  // Hoisted variable.
  message = await executeAndWaitForResultMessage(
    hud,
    "{ var clear = 'var_clear';  } clear",
    "var_clear"
  );
  ok(message, "clear was not overridden");

  // Hoisted function.
  message = await executeAndWaitForResultMessage(
    hud,
    "{ function help() { return 'function_help';  } } help()",
    "function_help"
  );
  ok(message, "help was not overridden");

  // Lexical variables are not hoisted.
  message = await executeAndWaitForResultMessage(
    hud,
    "{ let values = 'let_values';  } typeof values",
    "function"
  );
  ok(message, "values was not overridden because it's not global");
});

add_task(async function () {
  // NOTE: Open a new page to use the same binding name again.

  const hud = await openNewTabAndConsole("data:text/html,Nothing");

  // An assignment on `globalThis` property inside the script doesn't shadow
  // the helper binding.
  let message = await executeAndWaitForResultMessage(
    hud,
    "globalThis.values = 'globalThis_values'; typeof values",
    "function"
  );
  ok(message, "values was overridden because it's not declaration");

  // Executing `values` again shadows the helper binding, given it exists
  // before the execution.
  message = await executeAndWaitForResultMessage(
    hud,
    "values",
    "globalThis_values"
  );
  ok(message, "values was not overridden if it exists before the execution");
});