browser_jsterm_helpers_no_override.js (3928B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 // Check that console helpers are not set when existing variables with similar names 7 // exists in the page. 8 9 const TEST_URI = `data:text/html,<!DOCTYPE html><script> 10 var $ = "var_$"; 11 const $$ = "const_$$"; 12 let help = "let_help"; 13 globalThis.values = "globalThis_values"; 14 function keys() { 15 return "function_keys"; 16 } 17 18 function pauseInDebugger() { 19 let $x = "let_$x"; 20 debugger; 21 } 22 </script>`; 23 24 add_task(async function () { 25 const hud = await openNewTabAndConsole(TEST_URI); 26 27 let message = await executeAndWaitForResultMessage(hud, "$", "var_$"); 28 ok(message, "$ was not overridden"); 29 30 message = await executeAndWaitForResultMessage(hud, "$$", "const_$$"); 31 ok(message, "$$ was not overridden"); 32 33 message = await executeAndWaitForResultMessage(hud, "help", "let_help"); 34 ok(message, "help was not overridden"); 35 36 message = await executeAndWaitForResultMessage( 37 hud, 38 "values", 39 "globalThis_values" 40 ); 41 ok(message, "values was not overridden"); 42 43 message = await executeAndWaitForResultMessage( 44 hud, 45 "keys()", 46 "function_keys" 47 ); 48 ok(message, "keys was not overridden"); 49 50 info("Pause in Debugger"); 51 await openDebugger(); 52 const toolbox = gDevTools.getToolboxForTab(gBrowser.selectedTab); 53 const dbg = createDebuggerContext(toolbox); 54 SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { 55 content.wrappedJSObject.pauseInDebugger(); 56 }); 57 await pauseDebugger(dbg); 58 59 info("Go back to Console"); 60 await toolbox.selectTool("webconsole"); 61 message = await executeAndWaitForResultMessage(hud, "$x", "let_$x"); 62 ok( 63 message, 64 `frame variable "$x" was not overridden while paused in the debugger` 65 ); 66 67 await resume(dbg); 68 }); 69 70 add_task(async function () { 71 // Test the behavior when the variables are declared in the script. 72 73 const hud = await openNewTabAndConsole("data:text/html,Nothing"); 74 75 let message = await executeAndWaitForResultMessage( 76 hud, 77 "var $ = 'var_$'; $", 78 "var_$" 79 ); 80 ok(message, "$ was not overridden"); 81 82 message = await executeAndWaitForResultMessage( 83 hud, 84 "const $$ = 'const_$$'; $$", 85 "const_$$" 86 ); 87 ok(message, "$$ was not overridden"); 88 89 message = await executeAndWaitForResultMessage( 90 hud, 91 "function keys() { return 'function_keys'; } keys()", 92 "function_keys" 93 ); 94 ok(message, "keys was not overridden"); 95 96 // Hoisted variable. 97 message = await executeAndWaitForResultMessage( 98 hud, 99 "{ var clear = 'var_clear'; } clear", 100 "var_clear" 101 ); 102 ok(message, "clear was not overridden"); 103 104 // Hoisted function. 105 message = await executeAndWaitForResultMessage( 106 hud, 107 "{ function help() { return 'function_help'; } } help()", 108 "function_help" 109 ); 110 ok(message, "help was not overridden"); 111 112 // Lexical variables are not hoisted. 113 message = await executeAndWaitForResultMessage( 114 hud, 115 "{ let values = 'let_values'; } typeof values", 116 "function" 117 ); 118 ok(message, "values was not overridden because it's not global"); 119 }); 120 121 add_task(async function () { 122 // NOTE: Open a new page to use the same binding name again. 123 124 const hud = await openNewTabAndConsole("data:text/html,Nothing"); 125 126 // An assignment on `globalThis` property inside the script doesn't shadow 127 // the helper binding. 128 let message = await executeAndWaitForResultMessage( 129 hud, 130 "globalThis.values = 'globalThis_values'; typeof values", 131 "function" 132 ); 133 ok(message, "values was overridden because it's not declaration"); 134 135 // Executing `values` again shadows the helper binding, given it exists 136 // before the execution. 137 message = await executeAndWaitForResultMessage( 138 hud, 139 "values", 140 "globalThis_values" 141 ); 142 ok(message, "values was not overridden if it exists before the execution"); 143 });