123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- <!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>
|