summaryrefslogtreecommitdiffstats
path: root/devtools/server/tests/browser/browser_directorscript_actors_exports.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/tests/browser/browser_directorscript_actors_exports.js')
-rw-r--r--devtools/server/tests/browser/browser_directorscript_actors_exports.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/devtools/server/tests/browser/browser_directorscript_actors_exports.js b/devtools/server/tests/browser/browser_directorscript_actors_exports.js
new file mode 100644
index 000000000..f9ef56f51
--- /dev/null
+++ b/devtools/server/tests/browser/browser_directorscript_actors_exports.js
@@ -0,0 +1,87 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const {DirectorManagerFront} = require("devtools/shared/fronts/director-manager");
+const {DirectorRegistry} = require("devtools/server/actors/director-registry");
+
+DirectorRegistry.clear();
+
+add_task(function* () {
+ let browser = yield addTab(MAIN_DOMAIN + "director-script-target.html");
+ let doc = browser.contentDocument;
+
+ initDebuggerServer();
+ let client = new DebuggerClient(DebuggerServer.connectPipe());
+ let form = yield connectDebuggerClient(client);
+
+ DirectorRegistry.clear();
+ let directorManager = DirectorManagerFront(client, form);
+
+ // director scripts attach method defaults to module.exports
+ let attachModuleExports = yield testDirectorScriptExports(directorManager, {
+ scriptId: "testDirectorScript_moduleExports",
+ scriptCode: "(" + (function () {
+ module.exports = function () {};
+ }).toString() + ")();",
+ scriptOptions: {}
+ });
+ ok(attachModuleExports.port, "testDirectorScript_moduleExports attach event received");
+
+ // director scripts attach method can be configured using the attachMethod scriptOptions
+ let attachExportsAttach = yield testDirectorScriptExports(directorManager, {
+ scriptId: "testDirectorScript_exportsAttach",
+ scriptCode: "(" + (function () {
+ exports.attach = function () {};
+ }).toString() + ")();",
+ scriptOptions: {
+ attachMethod: "attach"
+ }
+ });
+ ok(attachExportsAttach.port, "testDirectorScript_exportsAttach attach event received");
+
+ // director scripts without an attach method generates an error event
+ let errorUndefinedAttachMethod = yield testDirectorScriptExports(directorManager, {
+ scriptId: "testDirectorScript_undefinedAttachMethod",
+ scriptCode: "(" + (function () {
+ // this director script should raise an error
+ // because it doesn't export any attach method
+ }).toString() + ")();",
+ scriptOptions: {
+ attachMethod: "attach"
+ }
+ });
+ let { message } = errorUndefinedAttachMethod;
+ ok(!!message, "testDirectorScript_undefinedAttachMethod error event received");
+ assertIsDirectorScriptError(errorUndefinedAttachMethod);
+
+ yield client.close();
+ gBrowser.removeCurrentTab();
+ DirectorRegistry.clear();
+});
+
+function assertIsDirectorScriptError(error) {
+ ok(!!error.message, "errors should contain a message");
+ ok(!!error.stack, "errors should contain a stack trace");
+ ok(!!error.fileName, "errors should contain a fileName");
+ ok(typeof error.columnNumber == "number", "errors should contain a columnNumber");
+ ok(typeof error.lineNumber == "number", "errors should contain a lineNumber");
+
+ ok(!!error.directorScriptId, "errors should contain a directorScriptId");
+}
+
+function* testDirectorScriptExports(directorManager, directorScriptDef) {
+ let { scriptId } = directorScriptDef;
+
+ DirectorRegistry.install(scriptId, directorScriptDef);
+
+ let waitForAttach = once(directorManager, "director-script-attach");
+ let waitForError = once(directorManager, "director-script-error");
+ directorManager.enableByScriptIds([scriptId], {reload: false});
+
+ let attachOrErrorEvent = yield Promise.race([waitForAttach, waitForError]);
+
+ return attachOrErrorEvent;
+}