diff options
Diffstat (limited to 'devtools/client/shared/sourceeditor/test/head.js')
-rw-r--r-- | devtools/client/shared/sourceeditor/test/head.js | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/devtools/client/shared/sourceeditor/test/head.js b/devtools/client/shared/sourceeditor/test/head.js new file mode 100644 index 0000000000..ec9b05b245 --- /dev/null +++ b/devtools/client/shared/sourceeditor/test/head.js @@ -0,0 +1,198 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/* exported promiseWaitForFocus, setup, ch, teardown, loadHelperScript, + limit, ch, read, codemirrorSetStatus */ + +"use strict"; + +// shared-head.js handles imports, constants, and utility functions +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/devtools/client/shared/test/shared-head.js", + this +); + +const Editor = require("resource://devtools/client/shared/sourceeditor/editor.js"); +const { + getClientCssProperties, +} = require("resource://devtools/client/fronts/css-properties.js"); + +function promiseWaitForFocus(el) { + return new Promise(resolve => waitForFocus(resolve, el)); +} + +async function setup(additionalOpts = {}) { + try { + const opt = "chrome,titlebar,toolbar,centerscreen,resizable,dialog=no"; + const win = Services.ww.openWindow( + null, + CHROME_URL_ROOT + "head.xhtml", + "_blank", + opt, + null + ); + const opts = { + value: "Hello.", + lineNumbers: true, + foldGutter: true, + gutters: [ + "CodeMirror-linenumbers", + "breakpoints", + "CodeMirror-foldgutter", + ], + cssProperties: getClientCssProperties(), + ...additionalOpts, + }; + + await once(win, "load"); + await promiseWaitForFocus(win); + + const box = win.document.querySelector("box"); + const editor = new Editor(opts); + await editor.appendTo(box); + + return { + ed: editor, + win, + edWin: editor.container.contentWindow.wrappedJSObject, + }; + } catch (o_O) { + ok(false, o_O.message); + return null; + } +} + +function ch(exp, act, label) { + is(exp.line, act.line, label + " (line)"); + is(exp.ch, act.ch, label + " (ch)"); +} + +function teardown(ed, win) { + ed.destroy(); + win.close(); + + while (gBrowser.tabs.length > 1) { + gBrowser.removeCurrentTab(); + } + finish(); +} + +/** + * Some tests may need to import one or more of the test helper scripts. + * A test helper script is simply a js file that contains common test code that + * is either not common-enough to be in head.js, or that is located in a + * separate directory. + * The script will be loaded synchronously and in the test's scope. + * @param {String} filePath The file path, relative to the current directory. + * Examples: + * - "helper_attributes_test_runner.js" + */ +function loadHelperScript(filePath) { + const testDir = gTestPath.substr(0, gTestPath.lastIndexOf("/")); + Services.scriptloader.loadSubScript(testDir + "/" + filePath, this); +} + +/** + * This method returns the portion of the input string `source` up to the + * [line, ch] location. + */ +function limit(source, [line, char]) { + line++; + const list = source.split("\n"); + if (list.length < line) { + return source; + } + if (line == 1) { + return list[0].slice(0, char); + } + return [...list.slice(0, line - 1), list[line - 1].slice(0, char)].join("\n"); +} + +function read(url) { + const scriptableStream = Cc[ + "@mozilla.org/scriptableinputstream;1" + ].getService(Ci.nsIScriptableInputStream); + + const channel = NetUtil.newChannel({ + uri: url, + loadUsingSystemPrincipal: true, + }); + const input = channel.open(); + scriptableStream.init(input); + + let data = ""; + while (input.available()) { + data = data.concat(scriptableStream.read(input.available())); + } + scriptableStream.close(); + input.close(); + + return data; +} + +/** + * This function is called by the CodeMirror test runner to report status + * messages from the CM tests. + * @see codemirror.html + */ +function codemirrorSetStatus(statusMsg, type, customMsg) { + switch (type) { + case "expected": + case "ok": + ok(1, statusMsg); + break; + case "error": + case "fail": + ok(0, statusMsg); + break; + default: + info(statusMsg); + break; + } + + if (customMsg && typeof customMsg == "string" && customMsg != statusMsg) { + info(customMsg); + } +} + +async function runCodeMirrorTest(uri) { + const actorURI = + "chrome://mochitests/content/browser/devtools/client/shared/sourceeditor/test/CodeMirrorTestActors.jsm"; + + const { CodeMirrorTestParent } = ChromeUtils.import(actorURI); + + ChromeUtils.registerWindowActor("CodeMirrorTest", { + parent: { + moduleURI: actorURI, + }, + child: { + moduleURI: actorURI, + events: { + DOMWindowCreated: {}, + }, + }, + }); + + const donePromise = new Promise(resolve => { + CodeMirrorTestParent.setCallback((name, data) => { + switch (name) { + case "setStatus": + const { statusMsg, type, customMsg } = data; + codemirrorSetStatus(statusMsg, type, customMsg); + break; + case "done": + resolve(!data.failed); + break; + } + }); + }); + + await addTab(uri); + const result = await donePromise; + ok(result, "CodeMirror tests all passed"); + while (gBrowser.tabs.length > 1) { + gBrowser.removeCurrentTab(); + } + + ChromeUtils.unregisterWindowActor("CodeMirrorTest"); +} |