diff options
Diffstat (limited to 'devtools/shared/webconsole/test/test_jsterm.html')
-rw-r--r-- | devtools/shared/webconsole/test/test_jsterm.html | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/devtools/shared/webconsole/test/test_jsterm.html b/devtools/shared/webconsole/test/test_jsterm.html new file mode 100644 index 000000000..b6eefad4b --- /dev/null +++ b/devtools/shared/webconsole/test/test_jsterm.html @@ -0,0 +1,309 @@ +<!DOCTYPE HTML> +<html lang="en"> +<head> + <meta charset="utf8"> + <title>Test for JavaScript terminal functionality</title> + <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> + <script type="text/javascript;version=1.8" src="common.js"></script> + <!-- Any copyright is dedicated to the Public Domain. + - http://creativecommons.org/publicdomain/zero/1.0/ --> +</head> +<body> +<p>Test for JavaScript terminal functionality</p> + +<iframe id="content-iframe" src="http://example.com/chrome/devtools/shared/webconsole/test/sandboxed_iframe.html"></iframe> + +<script class="testbody" type="text/javascript;version=1.8"> +SimpleTest.waitForExplicitFinish(); + +let gState; + +let {MAX_AUTOCOMPLETE_ATTEMPTS,MAX_AUTOCOMPLETIONS} = require("devtools/shared/webconsole/js-property-provider"); + +// This test runs all of its assertions twice - once with +// evaluateJS and once with evaluateJSAsync. +let evaluatingSync = true; +function evaluateJS(input, options = {}) { + return new Promise((resolve, reject) => { + if (evaluatingSync) { + gState.client.evaluateJS(input, resolve, options); + } else { + gState.client.evaluateJSAsync(input, resolve, options); + } + }); +} + +function startTest() +{ + removeEventListener("load", startTest); + + attachConsoleToTab(["PageError"], onAttach); +} + +function onAttach(aState, aResponse) +{ + top.foobarObject = Object.create(null); + top.foobarObject.foo = 1; + top.foobarObject.foobar = 2; + top.foobarObject.foobaz = 3; + top.foobarObject.omg = 4; + top.foobarObject.omgfoo = 5; + top.foobarObject.strfoo = "foobarz"; + top.foobarObject.omgstr = "foobarz" + + (new Array(DebuggerServer.LONG_STRING_LENGTH * 2)).join("abb"); + + top.largeObject1 = Object.create(null); + for (let i = 0; i < MAX_AUTOCOMPLETE_ATTEMPTS + 1; i++) { + top.largeObject1['a' + i] = i; + } + + top.largeObject2 = Object.create(null); + for (let i = 0; i < MAX_AUTOCOMPLETIONS * 2; i++) { + top.largeObject2['a' + i] = i; + } + + gState = aState; + + let tests = [doSimpleEval, doWindowEval, doEvalWithException, + doEvalWithHelper, doEvalString, doEvalLongString, + doEvalWithBinding, doEvalWithBindingFrame, + forceLexicalInit].map(t => { + return Task.async(t); + }); + + runTests(tests, testEnd); +} + +function* doSimpleEval() { + info("test eval '2+2'"); + let response = yield evaluateJS("2+2"); + checkObject(response, { + from: gState.actor, + input: "2+2", + result: 4, + }); + + ok(!response.exception, "no eval exception"); + ok(!response.helperResult, "no helper result"); + + nextTest(); +} + +function* doWindowEval() { + info("test eval 'document'"); + let response = yield evaluateJS("document"); + checkObject(response, { + from: gState.actor, + input: "document", + result: { + type: "object", + class: "XULDocument", + actor: /[a-z]/, + }, + }); + + ok(!response.exception, "no eval exception"); + ok(!response.helperResult, "no helper result"); + + nextTest(); +} + +function* doEvalWithException() { + info("test eval with exception"); + let response = yield evaluateJS("window.doTheImpossible()"); + checkObject(response, { + from: gState.actor, + input: "window.doTheImpossible()", + result: { + type: "undefined", + }, + exceptionMessage: /doTheImpossible/, + }); + + ok(response.exception, "js eval exception"); + ok(!response.helperResult, "no helper result"); + + nextTest(); +} + +function* doEvalWithHelper() { + info("test eval with helper"); + let response = yield evaluateJS("clear()"); + checkObject(response, { + from: gState.actor, + input: "clear()", + result: { + type: "undefined", + }, + helperResult: { type: "clearOutput" }, + }); + + ok(!response.exception, "no eval exception"); + + nextTest(); +} + +function* doEvalString() { + let response = yield evaluateJS("window.foobarObject.strfoo"); + checkObject(response, { + from: gState.actor, + input: "window.foobarObject.strfoo", + result: "foobarz", + }); + + nextTest(); +} + +function* doEvalLongString() { + let response = yield evaluateJS("window.foobarObject.omgstr"); + let str = top.foobarObject.omgstr; + let initial = str.substring(0, DebuggerServer.LONG_STRING_INITIAL_LENGTH); + + checkObject(response, { + from: gState.actor, + input: "window.foobarObject.omgstr", + result: { + type: "longString", + initial: initial, + length: str.length, + }, + }); + + nextTest(); +} + +function* doEvalWithBinding() { + let response = yield evaluateJS("document;"); + let documentActor = response.result.actor; + + info("running a command with _self as document using bindObjectActor"); + let bindObjectSame = yield evaluateJS("_self === document", { + bindObjectActor: documentActor + }); + checkObject(bindObjectSame, { + result: true + }); + + info("running a command with _self as document using selectedObjectActor"); + let selectedObjectSame = yield evaluateJS("_self === document", { + selectedObjectActor: documentActor + }); + checkObject(selectedObjectSame, { + result: true + }); + + nextTest(); +} + +function* doEvalWithBindingFrame() { + let frameWin = top.document.querySelector("iframe").contentWindow; + frameWin.fooFrame = { bar: 1 }; + + let response = yield evaluateJS( + "document.querySelector('iframe').contentWindow.fooFrame" + ); + let iframeObjectActor = response.result.actor; + ok(iframeObjectActor, "There is an actor associated with the response"); + + let bindObjectGlobal = yield evaluateJS("this.temp0 = _self;", { + bindObjectActor: iframeObjectActor + }); + ok(!top.temp0, + "Global doesn't match the top global with bindObjectActor"); + ok(frameWin.temp0 && frameWin.temp0.bar === 1, + "Global matches the object's global with bindObjectActor"); + + let selectedObjectGlobal = yield evaluateJS("this.temp1 = _self;", { + selectedObjectActor: iframeObjectActor + }); + ok(top.temp1 && top.temp1.bar === 1, + "Global matches the top global with bindObjectActor"); + ok(!frameWin.temp1, + "Global doesn't match the object's global with bindObjectActor"); + + nextTest() +} + +function* forceLexicalInit() { + info("test that failed let/const bindings are initialized to undefined"); + + const testData = [ + { + stmt: "let foopie = wubbalubadubdub", + vars: ["foopie"] + }, + { + stmt: "let {z, w={n}=null} = {}", + vars: ["z", "w"] + }, + { + stmt: "let [a, b, c] = null", + vars: ["a", "b", "c"] + }, + { + stmt: "const nein1 = rofl, nein2 = copter", + vars: ["nein1", "nein2"] + }, + { + stmt: "const {ha} = null", + vars: ["ha"] + }, + { + stmt: "const [haw=[lame]=null] = []", + vars: ["haw"] + }, + { + stmt: "const [rawr, wat=[lame]=null] = []", + vars: ["rawr", "haw"] + }, + { + stmt: "let {zzz: xyz=99, zwz: wb} = nexistepas()", + vars: ["xyz", "wb"] + }, + { + stmt: "let {c3pdoh=101} = null", + vars: ["c3pdoh"] + } + ]; + + for (let data of testData) { + let response = yield evaluateJS(data.stmt); + checkObject(response, { + from: gState.actor, + input: data.stmt, + result: undefined, + }); + ok(response.exception, "expected exception"); + for (let varName of data.vars) { + let response2 = yield evaluateJS(varName); + checkObject(response2, { + from: gState.actor, + input: varName, + result: undefined, + }); + ok(!response2.exception, "unexpected exception"); + } + } + + nextTest(); +} + +function testEnd() +{ + // If this is the first run, reload the page and do it again. + // Otherwise, end the test. + closeDebugger(gState, function() { + gState = null; + if (evaluatingSync) { + evaluatingSync = false; + startTest(); + } else { + SimpleTest.finish(); + } + }); +} + +addEventListener("load", startTest); +</script> +</body> +</html> |