Bug 1273251: Part 5 - Add tests for event listeners in nuked sandboxes. r?peterv
MozReview-Commit-ID: 1Ok8hhaOdp4
new file mode 100644
--- /dev/null
+++ b/js/xpconnect/tests/unit/test_nuke_sandbox_event_listeners.js
@@ -0,0 +1,81 @@
+/* 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/. */
+
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=1273251
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+function promiseEvent(target, event) {
+ return new Promise(resolve => {
+ target.addEventListener(event, resolve, {capture: true, once: true});
+ });
+}
+
+add_task(function*() {
+ let principal = Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("http://example.com/");
+
+ let webnav = Services.appShell.createWindowlessBrowser(false);
+
+ let docShell = webnav.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDocShell);
+
+ docShell.createAboutBlankContentViewer(principal);
+
+ let window = webnav.document.defaultView;
+ let sandbox = Cu.Sandbox(window, {sandboxPrototype: window});
+
+ function sandboxContent() {
+ window.addEventListener("FromTest", () => {
+ window.dispatchEvent(new CustomEvent("FromSandbox"));
+ }, true);
+ }
+
+ Cu.evalInSandbox(`(${sandboxContent})()`, sandbox);
+
+
+ let fromTestPromise = promiseEvent(window, "FromTest");
+ let fromSandboxPromise = promiseEvent(window, "FromSandbox");
+
+ do_print("Dispatch FromTest event");
+ window.dispatchEvent(new window.CustomEvent("FromTest"));
+
+ yield fromTestPromise;
+ do_print("Got event from test");
+
+ yield fromSandboxPromise;
+ do_print("Got response from sandbox");
+
+
+ window.addEventListener("FromSandbox", () => {
+ ok(false, "Got unexpected reply from sandbox");
+ }, true);
+
+ do_print("Nuke sandbox");
+ Cu.nukeSandbox(sandbox);
+
+
+ do_print("Dispatch FromTest event");
+ fromTestPromise = promiseEvent(window, "FromTest");
+ window.dispatchEvent(new window.CustomEvent("FromTest"));
+ yield fromTestPromise;
+ do_print("Got event from test");
+
+
+ // Force cycle collection, which should cause our callback reference
+ // to be dropped, and dredge up potential issues there.
+ Cu.forceCC();
+
+
+ do_print("Dispatch FromTest event");
+ fromTestPromise = promiseEvent(window, "FromTest");
+ window.dispatchEvent(new window.CustomEvent("FromTest"));
+ yield fromTestPromise;
+ do_print("Got event from test");
+
+
+ webnav.close();
+});
--- a/js/xpconnect/tests/unit/xpcshell.ini
+++ b/js/xpconnect/tests/unit/xpcshell.ini
@@ -95,16 +95,17 @@ fail-if = os == "android"
# Bug 676965: test fails consistently on Android
fail-if = os == "android"
[test_tearoffs.js]
[test_want_components.js]
[test_components.js]
[test_allowedDomains.js]
[test_allowedDomainsXHR.js]
[test_nuke_sandbox.js]
+[test_nuke_sandbox_event_listeners.js]
[test_sandbox_metadata.js]
[test_exportFunction.js]
[test_promise.js]
[test_returncode.js]
skip-if = os == "android" # native test components aren't available on Android
[test_textDecoder.js]
[test_url.js]
[test_URLSearchParams.js]