summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/test-content-events.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/test-content-events.js')
-rw-r--r--addon-sdk/source/test/test-content-events.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/addon-sdk/source/test/test-content-events.js b/addon-sdk/source/test/test-content-events.js
new file mode 100644
index 000000000..059c356c4
--- /dev/null
+++ b/addon-sdk/source/test/test-content-events.js
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { Loader } = require("sdk/test/loader");
+const { getMostRecentBrowserWindow, getInnerId } = require("sdk/window/utils");
+const { openTab, closeTab, getBrowserForTab } = require("sdk/tabs/utils");
+const { defer } = require("sdk/core/promise");
+const { curry, identity, partial } = require("sdk/lang/functional");
+
+const { nuke } = require("sdk/loader/sandbox");
+
+const { open: openWindow, close: closeWindow } = require('sdk/window/helpers');
+
+const openBrowserWindow = partial(openWindow, null, {features: {toolbar: true}});
+
+var when = curry(function(options, tab) {
+ let type = options.type || options;
+ let capture = options.capture || false;
+ let target = getBrowserForTab(tab);
+ let { promise, resolve } = defer();
+
+ target.addEventListener(type, function handler(event) {
+ if (!event.target.defaultView.frameElement) {
+ target.removeEventListener(type, handler, capture);
+ resolve(tab);
+ }
+ }, capture);
+
+ return promise;
+});
+
+var use = use = value => () => value;
+
+
+var open = curry((url, window) => openTab(window, url));
+var close = function(tab) {
+ let promise = when("pagehide", tab);
+ closeTab(tab);
+ return promise;
+}
+
+exports["test dead object errors"] = function(assert, done) {
+ let system = require("sdk/system/events");
+ let loader = Loader(module);
+ let { events } = loader.require("sdk/content/events");
+
+ // The dead object error is properly reported on console but
+ // doesn't raise any test's exception
+ function onMessage({ subject }) {
+ let message = subject.wrappedJSObject;
+ let { level } = message;
+ let text = String(message.arguments[0]);
+
+ if (level === "error" && text.includes("can't access dead object"))
+ fail(text);
+ }
+
+ let cleanup = () => system.off("console-api-log-event", onMessage);
+ let fail = (reason) => {
+ cleanup();
+ assert.fail(reason);
+ }
+
+ loader.unload();
+
+ nuke(loader.sharedGlobalSandbox);
+
+ system.on("console-api-log-event", onMessage, true);
+
+ openBrowserWindow().
+ then(closeWindow).
+ then(() => assert.pass("checking dead object errors")).
+ then(cleanup).
+ then(done, fail);
+};
+
+// ignore *-document-global-created events that are not very consistent.
+// only allow data uris that we create to ignore unwanted events, e.g.,
+// about:blank, http:// requests from Fennec's `about:`home page that displays
+// add-ons a user could install, local `searchplugins`, other chrome uris
+// Calls callback if passes filter
+function eventFilter (type, target, callback) {
+ if (target.URL.startsWith("data:text/html,") &&
+ type !== "chrome-document-global-created" &&
+ type !== "content-document-global-created")
+
+ callback();
+}
+require("test").run(exports);