summaryrefslogtreecommitdiffstats
path: root/dom/serviceworkers/test/openWindow_worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/serviceworkers/test/openWindow_worker.js')
-rw-r--r--dom/serviceworkers/test/openWindow_worker.js178
1 files changed, 178 insertions, 0 deletions
diff --git a/dom/serviceworkers/test/openWindow_worker.js b/dom/serviceworkers/test/openWindow_worker.js
new file mode 100644
index 0000000000..ffaad009be
--- /dev/null
+++ b/dom/serviceworkers/test/openWindow_worker.js
@@ -0,0 +1,178 @@
+// the worker won't shut down between events because we increased
+// the timeout values.
+var client;
+var window_count = 0;
+var expected_window_count = 9;
+var isolated_window_count = 0;
+var expected_isolated_window_count = 2;
+var resolve_got_all_windows = null;
+var got_all_windows = new Promise(function (res, rej) {
+ resolve_got_all_windows = res;
+});
+
+// |expected_window_count| needs to be updated for every new call that's
+// expected to actually open a new window regardless of what |clients.openWindow|
+// returns.
+function testForUrl(url, throwType, clientProperties, resultsArray) {
+ return clients
+ .openWindow(url)
+ .then(function (e) {
+ if (throwType != null) {
+ resultsArray.push({
+ result: false,
+ message: "openWindow should throw " + throwType,
+ });
+ } else if (clientProperties) {
+ resultsArray.push({
+ result: e instanceof WindowClient,
+ message: `openWindow should resolve to a WindowClient for url ${url}, got ${e}`,
+ });
+ resultsArray.push({
+ result: e.url == clientProperties.url,
+ message: "Client url should be " + clientProperties.url,
+ });
+ // Add more properties
+ } else {
+ resultsArray.push({
+ result: e == null,
+ message: "Open window should resolve to null. Got: " + e,
+ });
+ }
+ })
+ .catch(function (err) {
+ if (throwType == null) {
+ resultsArray.push({
+ result: false,
+ message: "Unexpected throw: " + err,
+ });
+ } else {
+ resultsArray.push({
+ result: err.toString().includes(throwType),
+ message: "openWindow should throw: " + err,
+ });
+ }
+ });
+}
+
+onmessage = function (event) {
+ if (event.data == "testNoPopup") {
+ client = event.source;
+
+ var results = [];
+ var promises = [];
+ promises.push(testForUrl("about:blank", "TypeError", null, results));
+ promises.push(
+ testForUrl("http://example.com", "InvalidAccessError", null, results)
+ );
+ promises.push(
+ testForUrl("_._*`InvalidURL", "InvalidAccessError", null, results)
+ );
+ event.waitUntil(
+ Promise.all(promises).then(function (e) {
+ client.postMessage(results);
+ })
+ );
+ }
+
+ if (event.data == "NEW_WINDOW" || event.data == "NEW_ISOLATED_WINDOW") {
+ window_count += 1;
+ if (event.data == "NEW_ISOLATED_WINDOW") {
+ isolated_window_count += 1;
+ }
+ if (window_count == expected_window_count) {
+ resolve_got_all_windows();
+ }
+ }
+
+ if (event.data == "CHECK_NUMBER_OF_WINDOWS") {
+ event.waitUntil(
+ got_all_windows
+ .then(function () {
+ return clients.matchAll();
+ })
+ .then(function (cl) {
+ event.source.postMessage([
+ {
+ result: cl.length == expected_window_count,
+ message: `The number of windows is correct. ${cl.length} == ${expected_window_count}`,
+ },
+ {
+ result: isolated_window_count == expected_isolated_window_count,
+ message: `The number of isolated windows is correct. ${isolated_window_count} == ${expected_isolated_window_count}`,
+ },
+ ]);
+ for (i = 0; i < cl.length; i++) {
+ cl[i].postMessage("CLOSE");
+ }
+ })
+ );
+ }
+};
+
+onnotificationclick = function (e) {
+ var results = [];
+ var promises = [];
+
+ var redirect =
+ "http://mochi.test:8888/tests/dom/serviceworkers/test/redirect.sjs?";
+ var redirect_xorigin =
+ "http://example.com/tests/dom/serviceworkers/test/redirect.sjs?";
+ var same_origin =
+ "http://mochi.test:8888/tests/dom/serviceworkers/test/open_window/client.sjs";
+ var different_origin =
+ "http://example.com/tests/dom/serviceworkers/test/open_window/client.sjs";
+
+ promises.push(testForUrl("about:blank", "TypeError", null, results));
+ promises.push(testForUrl(different_origin, null, null, results));
+ promises.push(testForUrl(same_origin, null, { url: same_origin }, results));
+ promises.push(
+ testForUrl("open_window/client.sjs", null, { url: same_origin }, results)
+ );
+
+ // redirect tests
+ promises.push(
+ testForUrl(
+ redirect + "open_window/client.sjs",
+ null,
+ { url: same_origin },
+ results
+ )
+ );
+ promises.push(testForUrl(redirect + different_origin, null, null, results));
+
+ promises.push(
+ testForUrl(redirect_xorigin + "open_window/client.sjs", null, null, results)
+ );
+ promises.push(
+ testForUrl(
+ redirect_xorigin + same_origin,
+ null,
+ { url: same_origin },
+ results
+ )
+ );
+
+ // coop+coep tests
+ promises.push(
+ testForUrl(
+ same_origin + "?crossOriginIsolated=true",
+ null,
+ { url: same_origin + "?crossOriginIsolated=true" },
+ results
+ )
+ );
+ promises.push(
+ testForUrl(
+ different_origin + "?crossOriginIsolated=true",
+ null,
+ null,
+ results
+ )
+ );
+
+ e.waitUntil(
+ Promise.all(promises).then(function () {
+ client.postMessage(results);
+ })
+ );
+};