summaryrefslogtreecommitdiffstats
path: root/dom/broadcastchannel/tests
diff options
context:
space:
mode:
Diffstat (limited to 'dom/broadcastchannel/tests')
-rw-r--r--dom/broadcastchannel/tests/blank.html2
-rw-r--r--dom/broadcastchannel/tests/broadcastchannel_sharedWorker.js17
-rw-r--r--dom/broadcastchannel/tests/broadcastchannel_worker_alive.js7
-rw-r--r--dom/broadcastchannel/tests/browser.ini6
-rw-r--r--dom/broadcastchannel/tests/browser_private_browsing.js93
-rw-r--r--dom/broadcastchannel/tests/file_mozbrowser.html20
-rw-r--r--dom/broadcastchannel/tests/file_mozbrowser2.html21
-rw-r--r--dom/broadcastchannel/tests/iframe_broadcastchannel.html33
-rw-r--r--dom/broadcastchannel/tests/iframe_mozbrowser.html15
-rw-r--r--dom/broadcastchannel/tests/iframe_mozbrowser2.html15
-rw-r--r--dom/broadcastchannel/tests/mochitest.ini26
-rw-r--r--dom/broadcastchannel/tests/testUrl1_bfcache.html18
-rw-r--r--dom/broadcastchannel/tests/testUrl2_bfcache.html12
-rw-r--r--dom/broadcastchannel/tests/test_bfcache.html120
-rw-r--r--dom/broadcastchannel/tests/test_broadcastchannel_basic.html67
-rw-r--r--dom/broadcastchannel/tests/test_broadcastchannel_close.html61
-rw-r--r--dom/broadcastchannel/tests/test_broadcastchannel_self.html37
-rw-r--r--dom/broadcastchannel/tests/test_broadcastchannel_sharedWorker.html52
-rw-r--r--dom/broadcastchannel/tests/test_broadcastchannel_worker_alive.html56
-rw-r--r--dom/broadcastchannel/tests/test_dataCloning.html27
-rw-r--r--dom/broadcastchannel/tests/test_dataURL.html35
-rw-r--r--dom/broadcastchannel/tests/test_event_listener_leaks.html55
-rw-r--r--dom/broadcastchannel/tests/test_invalidState.html27
-rw-r--r--dom/broadcastchannel/tests/test_message_after_close.html31
-rw-r--r--dom/broadcastchannel/tests/test_ordering.html64
25 files changed, 917 insertions, 0 deletions
diff --git a/dom/broadcastchannel/tests/blank.html b/dom/broadcastchannel/tests/blank.html
new file mode 100644
index 0000000000..358db717dd
--- /dev/null
+++ b/dom/broadcastchannel/tests/blank.html
@@ -0,0 +1,2 @@
+<!DOCTYPE HTML>
+<html><body></body></html>
diff --git a/dom/broadcastchannel/tests/broadcastchannel_sharedWorker.js b/dom/broadcastchannel/tests/broadcastchannel_sharedWorker.js
new file mode 100644
index 0000000000..ad24ce39ea
--- /dev/null
+++ b/dom/broadcastchannel/tests/broadcastchannel_sharedWorker.js
@@ -0,0 +1,17 @@
+/* eslint-env worker */
+
+onconnect = function(evt) {
+ evt.ports[0].onmessage = function(evt1) {
+ var bc = new BroadcastChannel("foobar");
+ bc.addEventListener("message", function(event) {
+ bc.postMessage(
+ event.data == "hello world from the window"
+ ? "hello world from the worker"
+ : "KO"
+ );
+ bc.close();
+ });
+
+ evt1.target.postMessage("READY");
+ };
+};
diff --git a/dom/broadcastchannel/tests/broadcastchannel_worker_alive.js b/dom/broadcastchannel/tests/broadcastchannel_worker_alive.js
new file mode 100644
index 0000000000..d63e7d3bfb
--- /dev/null
+++ b/dom/broadcastchannel/tests/broadcastchannel_worker_alive.js
@@ -0,0 +1,7 @@
+new BroadcastChannel("foobar").addEventListener("message", function(event) {
+ if (event.data != "READY") {
+ event.target.postMessage(event.data);
+ }
+});
+
+new BroadcastChannel("foobar").postMessage("READY");
diff --git a/dom/broadcastchannel/tests/browser.ini b/dom/broadcastchannel/tests/browser.ini
new file mode 100644
index 0000000000..b036a1e9bf
--- /dev/null
+++ b/dom/broadcastchannel/tests/browser.ini
@@ -0,0 +1,6 @@
+[DEFAULT]
+skip-if = os == 'android'
+support-files =
+ blank.html
+
+[browser_private_browsing.js]
diff --git a/dom/broadcastchannel/tests/browser_private_browsing.js b/dom/broadcastchannel/tests/browser_private_browsing.js
new file mode 100644
index 0000000000..42d90d77ab
--- /dev/null
+++ b/dom/broadcastchannel/tests/browser_private_browsing.js
@@ -0,0 +1,93 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const URL =
+ "http://mochi.test:8888/browser/dom/broadcastchannel/tests/blank.html";
+
+add_task(async function() {
+ var win1 = OpenBrowserWindow({ private: true });
+ var win1Promise = new win1.Promise(resolve => {
+ win1.addEventListener(
+ "load",
+ function() {
+ resolve();
+ },
+ { once: true }
+ );
+ });
+ await win1Promise;
+
+ var win2 = OpenBrowserWindow({ private: false });
+ var win2Promise = new win2.Promise(resolve => {
+ win2.addEventListener(
+ "load",
+ function() {
+ resolve();
+ },
+ { once: true }
+ );
+ });
+ await win2Promise;
+
+ var tab1 = BrowserTestUtils.addTab(win1.gBrowser, URL);
+ await BrowserTestUtils.browserLoaded(win1.gBrowser.getBrowserForTab(tab1));
+ var browser1 = gBrowser.getBrowserForTab(tab1);
+
+ var tab2 = BrowserTestUtils.addTab(win2.gBrowser, URL);
+ await BrowserTestUtils.browserLoaded(win2.gBrowser.getBrowserForTab(tab2));
+ var browser2 = gBrowser.getBrowserForTab(tab2);
+
+ var p1 = SpecialPowers.spawn(browser1, [], function(opts) {
+ return new content.window.Promise(resolve => {
+ content.window.bc = new content.window.BroadcastChannel("foobar");
+ content.window.bc.onmessage = function(e) {
+ resolve(e.data);
+ };
+ });
+ });
+
+ var p2 = SpecialPowers.spawn(browser2, [], function(opts) {
+ return new content.window.Promise(resolve => {
+ content.window.bc = new content.window.BroadcastChannel("foobar");
+ content.window.bc.onmessage = function(e) {
+ resolve(e.data);
+ };
+ });
+ });
+
+ await SpecialPowers.spawn(browser1, [], function(opts) {
+ return new content.window.Promise(resolve => {
+ var bc = new content.window.BroadcastChannel("foobar");
+ bc.postMessage("hello world from private browsing");
+ resolve();
+ });
+ });
+
+ await SpecialPowers.spawn(browser2, [], function(opts) {
+ return new content.window.Promise(resolve => {
+ var bc = new content.window.BroadcastChannel("foobar");
+ bc.postMessage("hello world from non private browsing");
+ resolve();
+ });
+ });
+
+ var what1 = await p1;
+ is(
+ what1,
+ "hello world from private browsing",
+ "No messages received from the other window."
+ );
+
+ var what2 = await p2;
+ is(
+ what2,
+ "hello world from non private browsing",
+ "No messages received from the other window."
+ );
+
+ BrowserTestUtils.removeTab(tab1);
+ await BrowserTestUtils.closeWindow(win1);
+
+ BrowserTestUtils.removeTab(tab2);
+ await BrowserTestUtils.closeWindow(win2);
+});
diff --git a/dom/broadcastchannel/tests/file_mozbrowser.html b/dom/broadcastchannel/tests/file_mozbrowser.html
new file mode 100644
index 0000000000..6370500d98
--- /dev/null
+++ b/dom/broadcastchannel/tests/file_mozbrowser.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>MozBrowser iframe</title>
+</head>
+<body>
+<div id="container"></div>
+ <script type="application/javascript">
+
+ var ifr = document.createElement("iframe");
+ ifr.src = "http://mochi.test:8888/tests/dom/broadcastchannel/tests/iframe_mozbrowser.html";
+ ifr.onload = function() { alert("DONE"); };
+
+ var domParent = document.getElementById("container");
+ domParent.appendChild(ifr);
+
+ </script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/file_mozbrowser2.html b/dom/broadcastchannel/tests/file_mozbrowser2.html
new file mode 100644
index 0000000000..2e5f394eb8
--- /dev/null
+++ b/dom/broadcastchannel/tests/file_mozbrowser2.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>MozBrowser iframe</title>
+</head>
+<body>
+<div id="container"></div>
+ <script type="application/javascript">
+
+ var ifr = document.createElement("iframe");
+ ifr.setAttribute("mozbrowser", true);
+ ifr.src = "http://mochi.test:8888/tests/dom/broadcastchannel/tests/iframe_mozbrowser2.html";
+ ifr.onload = function() { alert("DONE"); };
+
+ var domParent = document.getElementById("container");
+ domParent.appendChild(ifr);
+
+ </script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/iframe_broadcastchannel.html b/dom/broadcastchannel/tests/iframe_broadcastchannel.html
new file mode 100644
index 0000000000..2d1724da0b
--- /dev/null
+++ b/dom/broadcastchannel/tests/iframe_broadcastchannel.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+ <script type="application/javascript">
+
+function is(a, b, msg) {
+ ok(a == b, msg);
+}
+
+function ok(a, msg) {
+ window.parent.postMessage({ status: a ? "OK" : "KO", message: msg }, "*");
+}
+
+ok("BroadcastChannel" in window, "BroadcastChannel exists");
+
+var bc = new BroadcastChannel("foobar");
+ok(bc, "BroadcastChannel can be created");
+is(bc.name, "foobar", "BroadcastChannel.name is foobar");
+
+ok("postMessage" in bc, "BroadcastChannel has postMessage() method");
+
+bc.onmessage = function(evt) {
+ ok(evt instanceof MessageEvent, "evt is a MessageEvent");
+ is(evt.target, bc, "MessageEvent.target is bc");
+ is(evt.target.name, "foobar", "MessageEvent.target.name is foobar");
+ is(evt.target.name, bc.name, "MessageEvent.target.name is bc.name");
+ is(evt.data, "Hello world from the window!", "Message received from the window");
+ bc.postMessage("Hello world from the iframe!");
+};
+
+ </script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/iframe_mozbrowser.html b/dom/broadcastchannel/tests/iframe_mozbrowser.html
new file mode 100644
index 0000000000..adbb77a061
--- /dev/null
+++ b/dom/broadcastchannel/tests/iframe_mozbrowser.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>MozBrowser iframe</title>
+</head>
+<body>
+ <script type="application/javascript">
+
+var bc = new BroadcastChannel("foobar");
+bc.postMessage("This is wrong!");
+
+ </script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/iframe_mozbrowser2.html b/dom/broadcastchannel/tests/iframe_mozbrowser2.html
new file mode 100644
index 0000000000..adbb77a061
--- /dev/null
+++ b/dom/broadcastchannel/tests/iframe_mozbrowser2.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>MozBrowser iframe</title>
+</head>
+<body>
+ <script type="application/javascript">
+
+var bc = new BroadcastChannel("foobar");
+bc.postMessage("This is wrong!");
+
+ </script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/mochitest.ini b/dom/broadcastchannel/tests/mochitest.ini
new file mode 100644
index 0000000000..32dfc6d942
--- /dev/null
+++ b/dom/broadcastchannel/tests/mochitest.ini
@@ -0,0 +1,26 @@
+[DEFAULT]
+support-files =
+ iframe_broadcastchannel.html
+ broadcastchannel_sharedWorker.js
+ broadcastchannel_worker_alive.js
+ !/dom/events/test/event_leak_utils.js
+ file_mozbrowser.html
+ file_mozbrowser2.html
+ iframe_mozbrowser.html
+ iframe_mozbrowser2.html
+ testUrl1_bfcache.html
+ testUrl2_bfcache.html
+
+[test_broadcastchannel_basic.html]
+[test_broadcastchannel_close.html]
+[test_broadcastchannel_self.html]
+[test_broadcastchannel_sharedWorker.html]
+[test_broadcastchannel_worker_alive.html]
+[test_bfcache.html]
+[test_event_listener_leaks.html]
+skip-if = (os == "win" && processor == "aarch64") #bug 1535784
+[test_invalidState.html]
+[test_ordering.html]
+[test_dataCloning.html]
+[test_dataURL.html]
+[test_message_after_close.html]
diff --git a/dom/broadcastchannel/tests/testUrl1_bfcache.html b/dom/broadcastchannel/tests/testUrl1_bfcache.html
new file mode 100644
index 0000000000..d31b13bd25
--- /dev/null
+++ b/dom/broadcastchannel/tests/testUrl1_bfcache.html
@@ -0,0 +1,18 @@
+<script>
+var bc = new BroadcastChannel("a");
+onpageshow = function(e) {
+ var bc1 = new BroadcastChannel("testUrl1_bfcache");
+ bc1.onmessage = function(event) {
+ if (event.data == "close") {
+ bc1.postMessage("closed");
+ bc1.close();
+ bc.close();
+ window.close();
+ } else if (event.data == "load") {
+ bc1.close();
+ location.href = "testUrl2_bfcache.html";
+ }
+ };
+ bc1.postMessage({type: e.type, persisted: e.persisted});
+};
+</script>
diff --git a/dom/broadcastchannel/tests/testUrl2_bfcache.html b/dom/broadcastchannel/tests/testUrl2_bfcache.html
new file mode 100644
index 0000000000..a1eed7927a
--- /dev/null
+++ b/dom/broadcastchannel/tests/testUrl2_bfcache.html
@@ -0,0 +1,12 @@
+<script>
+onpageshow = function(e) {
+ var bc2 = new BroadcastChannel("testUrl2_bfcache");
+ bc2.onmessage = function(event) {
+ if (event.data == "back") {
+ bc2.close();
+ history.back();
+ }
+ };
+ bc2.postMessage({type: e.type, persisted: e.persisted});
+};
+</script>
diff --git a/dom/broadcastchannel/tests/test_bfcache.html b/dom/broadcastchannel/tests/test_bfcache.html
new file mode 100644
index 0000000000..0197f343e2
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_bfcache.html
@@ -0,0 +1,120 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Test for bfcache and BroadcastChannel</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+ <script type="application/javascript">
+
+ /*
+ * The test opens a new window. Then a message 'load' is sent there to load
+ * another page. If expectedPersisted is false, a dummy message is sent
+ * through a BroadcastChannel which the first has registered to use.
+ * That should evict the page from bfcache.
+ * 'back' message is sent to call history.back().
+ * The page which is loaded from session history should be persisted if
+ * expectedPersisted is true.
+ */
+
+ SimpleTest.waitForExplicitFinish();
+ var testUrl1 = "testUrl1_bfcache.html";
+
+
+ function executeTest() {
+ var bc1 = new BroadcastChannel("testUrl1_bfcache");
+ var bc2 = new BroadcastChannel("testUrl2_bfcache");
+ bc1.onmessage = function(event) {
+ if (event.data == "closed") {
+ info("Closed");
+ runTest();
+ return;
+ }
+ page1Shown(event.data);
+ };
+ bc2.onmessage = function(event) { page2Shown(event.data); };
+
+ var counter = 0;
+ var expectedPersisted = false;
+ var bc = new BroadcastChannel("a");
+
+ function page1Shown(e) {
+ if (counter == 0) {
+ ok(!e.persisted, "test page should have been persisted initially");
+ bc1.postMessage("load");
+ } else {
+ is(e.persisted, expectedPersisted, "test page should have been persisted in pageshow");
+ bc1.postMessage("close");
+ }
+
+ counter++;
+ }
+
+ function page2Shown(e) {
+ if (!expectedPersisted) {
+ SimpleTest.executeSoon(function() {
+ info("Posting a message.");
+ bc.postMessage(42);
+ });
+ }
+
+ SimpleTest.executeSoon(function() {
+ info("Going back");
+ bc2.postMessage("back");
+ });
+ }
+
+ var tests = [
+ { expectedPersisted: true },
+ { expectedPersisted: false },
+ ];
+
+ function runTest() {
+ if (!tests.length) {
+ bc.close();
+ bc1.close();
+ bc2.close();
+ SimpleTest.finish();
+ return;
+ }
+
+ var test = tests.shift();
+
+ counter = 0;
+ expectedPersisted = test.expectedPersisted;
+ window.open(testUrl1, "", "noopener");
+ }
+
+
+ // If Fission is disabled, the pref is no-op.
+ SpecialPowers.pushPrefEnv({set: [["fission.bfcacheInParent", true]]}, () => {
+ runTest();
+ });
+
+ }
+
+ if (isXOrigin) {
+ // Bug 1746646: Make mochitests work with TCP enabled (cookieBehavior = 5)
+ // Acquire storage access permission here so that the BroadcastChannel used to
+ // communicate with the opened windows works in xorigin tests. Otherwise,
+ // the iframe containing this page is isolated from first-party storage access,
+ // which isolates BroadcastChannel communication.
+ SpecialPowers.wrap(document).notifyUserGestureActivation();
+ SpecialPowers.addPermission("storageAccessAPI", true, window.location.href).then(() => {
+ SpecialPowers.wrap(document).requestStorageAccess().then(() => {
+ SpecialPowers.pushPrefEnv({
+ set: [["privacy.partition.always_partition_third_party_non_cookie_storage", false]]
+ }).then(() => {
+ executeTest();
+ });
+ });
+ });
+ } else {
+ executeTest();
+ }
+
+ </script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_basic.html b/dom/broadcastchannel/tests/test_broadcastchannel_basic.html
new file mode 100644
index 0000000000..09196b0c52
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_broadcastchannel_basic.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<div id="content"></div>
+
+<script type="application/javascript">
+
+function runTest() {
+ addEventListener("message", receiveMessage, false);
+ function receiveMessage(evt) {
+ if (evt.data.status == "OK") {
+ ok(true, evt.data.message);
+ } else if (evt.data.status == "KO") {
+ ok(false, evt.data.message);
+ } else {
+ ok(false, "Unknown message");
+ }
+ }
+
+ ok("BroadcastChannel" in window, "BroadcastChannel exists");
+
+ var bc = new BroadcastChannel("foobar");
+ ok(bc, "BroadcastChannel can be created");
+ is(bc.name, "foobar", "BroadcastChannel.name is foobar");
+
+ ok("postMessage" in bc, "BroadcastChannel has postMessage() method");
+
+ bc.onmessage = function(evt) {
+ ok(evt instanceof MessageEvent, "This is a MessageEvent");
+ is(evt.target, bc, "MessageEvent.target is bc");
+ is(evt.target.name, "foobar", "MessageEvent.target.name is foobar");
+ is(evt.target.name, bc.name, "MessageEvent.target.name == bc.name");
+ ok(evt.origin.indexOf("http://mochi.test:8888") == 0, "MessageEvent.origin is correct");
+ is(evt.data, "Hello world from the iframe!", "The message from the iframe has been received!");
+ SimpleTest.finish();
+ };
+
+ var div = document.getElementById("content");
+ ok(div, "Parent exists");
+
+ var ifr = document.createElement("iframe");
+ ifr.addEventListener("load", iframeLoaded);
+ ifr.setAttribute("src", "iframe_broadcastchannel.html");
+ div.appendChild(ifr);
+
+ function iframeLoaded() {
+ bc.postMessage("Hello world from the window!");
+ }
+
+ // A leak test
+ var dummyBc = new BroadcastChannel("dont_leak_this");
+ dummyBc.foo = "bar";
+ // don't add message listener!
+}
+
+SimpleTest.waitForExplicitFinish();
+runTest();
+
+</script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_close.html b/dom/broadcastchannel/tests/test_broadcastchannel_close.html
new file mode 100644
index 0000000000..91cb9c92a4
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_broadcastchannel_close.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<div id="content"></div>
+
+<script type="application/javascript">
+
+function runTest() {
+ var receiver = new BroadcastChannel("foo");
+ var sequence = [ "2", "done" ];
+ receiver.onmessage = function(e) {
+ if (!sequence.length) {
+ ok(false, "No more data is expected");
+ return;
+ }
+
+ var data = sequence.shift();
+ is(e.data, data);
+
+ if (!sequence.length) {
+ SimpleTest.executeSoon(function() {
+ SimpleTest.finish();
+ });
+ }
+ };
+
+ var x = new BroadcastChannel("foo");
+ x.close();
+ try {
+ x.postMessage("1");
+ ok(false, "PostMessage should throw if called after a close().");
+ } catch (e) {
+ ok(true, "PostMessage should throw if called after a close().");
+ }
+
+ var y = new BroadcastChannel("foo");
+ y.postMessage("2");
+ y.close();
+ try {
+ y.postMessage("3");
+ ok(false, "PostMessage should throw if called after a close().");
+ } catch (e) {
+ ok(true, "PostMessage should throw if called after a close().");
+ }
+
+ var z = new BroadcastChannel("foo");
+ z.postMessage("done");
+}
+
+SimpleTest.waitForExplicitFinish();
+runTest();
+
+</script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_self.html b/dom/broadcastchannel/tests/test_broadcastchannel_self.html
new file mode 100644
index 0000000000..501f71f09c
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_broadcastchannel_self.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<div id="content"></div>
+
+<script type="application/javascript">
+
+function runTest() {
+ let x = new BroadcastChannel("foo");
+ let y = new BroadcastChannel("foo");
+
+ function func(e) {
+ is(e.target, y, "The target is !x");
+
+ SimpleTest.executeSoon(function() {
+ SimpleTest.finish();
+ });
+ }
+
+ x.onmessage = func;
+ y.onmessage = func;
+
+ x.postMessage("foo");
+}
+
+SimpleTest.waitForExplicitFinish();
+runTest();
+
+</script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_sharedWorker.html b/dom/broadcastchannel/tests/test_broadcastchannel_sharedWorker.html
new file mode 100644
index 0000000000..f76c17cbd8
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_broadcastchannel_sharedWorker.html
@@ -0,0 +1,52 @@
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<!DOCTYPE HTML>
+<html>
+<!--
+Tests of DOM BroadcastChannel in SharedWorkers
+-->
+<head>
+ <title>Test for BroadcastChannel in SharedWorkers</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script class="testbody" language="javascript">
+
+function runTests() {
+ var worker = new SharedWorker("broadcastchannel_sharedWorker.js");
+
+ var bc = new BroadcastChannel("foobar");
+
+ worker.port.onmessage = function(event) {
+ if (event.data == "READY") {
+ ok(true, "SharedWorker is ready!");
+ bc.postMessage("hello world from the window");
+ } else {
+ ok(false, "Something wrong happened");
+ }
+ };
+
+ bc.onmessage = function(event) {
+ is("hello world from the worker", event.data, "The message matches!");
+ bc.close();
+ SimpleTest.finish();
+ };
+
+ worker.port.postMessage("go");
+}
+
+SimpleTest.waitForExplicitFinish();
+runTests();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_worker_alive.html b/dom/broadcastchannel/tests/test_broadcastchannel_worker_alive.html
new file mode 100644
index 0000000000..3667c8ae9d
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_broadcastchannel_worker_alive.html
@@ -0,0 +1,56 @@
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<!DOCTYPE HTML>
+<html>
+<!--
+Tests of DOM BroadcastChannel in workers
+-->
+<head>
+ <title>Test for BroadcastChannel in workers</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script class="testbody" language="javascript">
+
+function runTests() {
+ var id = 0;
+ (new BroadcastChannel("foobar")).onmessage = function(event) {
+ info("MSG: " + event.data);
+
+ if (event.data == "READY") {
+ ok(true, "Worker is ready!");
+ } else {
+ is(id, event.data, "The message is correct: " + id);
+ }
+
+ for (var i = 0; i < 3; ++i) {
+ SpecialPowers.forceCC();
+ SpecialPowers.forceGC();
+ }
+
+ if (id == 5) {
+ SimpleTest.finish();
+ return;
+ }
+
+ event.target.postMessage(++id);
+ };
+
+ new Worker("broadcastchannel_worker_alive.js");
+}
+
+SimpleTest.waitForExplicitFinish();
+runTests();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_dataCloning.html b/dom/broadcastchannel/tests/test_dataCloning.html
new file mode 100644
index 0000000000..26c1ce370a
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_dataCloning.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel.postMessage invalid State</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<div id="content"></div>
+
+<script type="application/javascript">
+
+
+let c = new BroadcastChannel("foo");
+
+try {
+ c.postMessage(Symbol());
+ ok(false, "This should throw!");
+} catch (e) {
+ ok(true, "This should throw!");
+ is(e.name, "DataCloneError", "Correct DataCloneError exception thrown");
+}
+
+</script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_dataURL.html b/dom/broadcastchannel/tests/test_dataURL.html
new file mode 100644
index 0000000000..f4f9c71db3
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_dataURL.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel in data: URL</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<div id="dataURL">
+var a = new BroadcastChannel('a');
+var b = new BroadcastChannel('a');
+a.onmessage = function(e) { parent.postMessage(e.data, "*"); };
+b.postMessage(42);
+</div>
+
+<script>
+
+SimpleTest.waitForExplicitFinish();
+
+onmessage = function(e) {
+ is(e.data, 42, "BroadcastChannel works with data URLs");
+ SimpleTest.finish();
+};
+
+// eslint-disable-next-line no-useless-concat
+var url = "data:text/html,<script>" + document.getElementById("dataURL").textContent + "</" + "script>";
+
+var ifr = document.createElement("iframe");
+document.body.appendChild(ifr);
+
+ifr.setAttribute("sandbox", "allow-scripts");
+ifr.src = url;
+</script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_event_listener_leaks.html b/dom/broadcastchannel/tests/test_event_listener_leaks.html
new file mode 100644
index 0000000000..33568913fc
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_event_listener_leaks.html
@@ -0,0 +1,55 @@
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug 1450358 - Test BroadcastChannel event listener leak conditions</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/dom/events/test/event_leak_utils.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<script class="testbody" type="text/javascript">
+// Manipulate BroadcastChannel objects in the frame's context.
+// Its important here that we create a listener callback from
+// the DOM objects back to the frame's global in order to
+// exercise the leak condition.
+let count = 0;
+async function useBroadcastChannel(contentWindow) {
+ contentWindow.messageCount = 0;
+
+ count += 1;
+ const name = `test_event_listener_leaks-${count}`;
+
+ let bc = new contentWindow.BroadcastChannel(name);
+ let outer = new BroadcastChannel(name);
+ outer.postMessage("foo");
+
+ await new Promise(resolve => {
+ bc.onmessage = e => {
+ contentWindow.messageCount += 1;
+ resolve();
+ };
+ });
+
+ is(contentWindow.messageCount, 1, "message should be received");
+}
+
+async function runTest() {
+ try {
+ await checkForEventListenerLeaks("BroadcastChannel", useBroadcastChannel);
+ } catch (e) {
+ ok(false, e);
+ } finally {
+ SimpleTest.finish();
+ }
+}
+
+SimpleTest.waitForExplicitFinish();
+addEventListener("load", runTest, { once: true });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_invalidState.html b/dom/broadcastchannel/tests/test_invalidState.html
new file mode 100644
index 0000000000..371a58768a
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_invalidState.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel.postMessage invalid State</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<div id="content"></div>
+
+<script type="application/javascript">
+
+var c = new BroadcastChannel("foo");
+c.close();
+
+try {
+ c.postMessage("bar");
+ ok(false, "This should throw!");
+} catch (e) {
+ ok(true, "This should throw!");
+ is(e.name, "InvalidStateError", "Correct invalid-state exception thrown");
+}
+
+</script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_message_after_close.html b/dom/broadcastchannel/tests/test_message_after_close.html
new file mode 100644
index 0000000000..1ef8a018ea
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_message_after_close.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel - message after close</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<script>
+SimpleTest.waitForExplicitFinish();
+
+let a = new BroadcastChannel('a');
+let b = new BroadcastChannel('a');
+let count = 0;
+
+a.onmessage = function(e) {
+ ++count;
+ a.close();
+
+ setTimeout(() => {
+ is(count, 1, "Only 1 message received");
+ SimpleTest.finish();
+ }, 0);
+}
+
+for (let i = 0; i < 100; ++i) {
+ b.postMessage(42);
+}
+</script>
+</body>
+</html>
diff --git a/dom/broadcastchannel/tests/test_ordering.html b/dom/broadcastchannel/tests/test_ordering.html
new file mode 100644
index 0000000000..5dd36bc77d
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_ordering.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for BroadcastChannel.postMessage invalid State</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<div id="content"></div>
+
+<script type="application/javascript">
+
+let c1 = new BroadcastChannel("order");
+let c2 = new BroadcastChannel("order");
+let c3 = new BroadcastChannel("order");
+
+let events = [];
+let doneCount = 0;
+
+function whichBC(bc) {
+ if (bc == c1) return "c1";
+ if (bc == c2) return "c2";
+ if (bc == c3) return "c3";
+ return "What?!?";
+}
+
+function handler(e) {
+ events.push(e);
+ if (e.data == "done") {
+ doneCount++;
+ if (doneCount == 2) {
+ is(events.length, 6, "Correct length");
+ is(whichBC(events[0].target), "c2", "target for event 0");
+ is(events[0].data, "from c1");
+ is(whichBC(events[1].target), "c3", "target for event 1");
+ is(events[1].data, "from c1");
+ is(whichBC(events[2].target), "c1", "target for event 2");
+ is(events[2].data, "from c3");
+ is(whichBC(events[3].target), "c2", "target for event 3");
+ is(events[3].data, "from c3");
+ is(whichBC(events[4].target), "c1", "target for event 4");
+ is(events[4].data, "done");
+ is(whichBC(events[5].target), "c3", "target for event 5");
+ is(events[5].data, "done");
+
+ SimpleTest.finish();
+ }
+ }
+}
+
+c1.onmessage = handler;
+c2.onmessage = handler;
+c3.onmessage = handler;
+
+c1.postMessage("from c1");
+c3.postMessage("from c3");
+c2.postMessage("done");
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</body>
+</html>