summaryrefslogtreecommitdiffstats
path: root/dom/push/test/worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/push/test/worker.js')
-rw-r--r--dom/push/test/worker.js174
1 files changed, 174 insertions, 0 deletions
diff --git a/dom/push/test/worker.js b/dom/push/test/worker.js
new file mode 100644
index 0000000000..bcdbf0e0ad
--- /dev/null
+++ b/dom/push/test/worker.js
@@ -0,0 +1,174 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// This worker is used for two types of tests. `handlePush` sends messages to
+// `frame.html`, which verifies that the worker can receive push messages.
+
+// `handleMessage` receives messages from `test_push_manager_worker.html`
+// and `test_data.html`, and verifies that `PushManager` can be used from
+// the worker.
+
+/* globals PushEvent */
+
+this.onpush = handlePush;
+this.onmessage = handleMessage;
+this.onpushsubscriptionchange = handlePushSubscriptionChange;
+
+function getJSON(data) {
+ var result = {
+ ok: false,
+ };
+ try {
+ result.value = data.json();
+ result.ok = true;
+ } catch (e) {
+ // Ignore syntax errors for invalid JSON.
+ }
+ return result;
+}
+
+function assert(value, message) {
+ if (!value) {
+ throw new Error(message);
+ }
+}
+
+function broadcast(event, promise) {
+ event.waitUntil(
+ Promise.resolve(promise).then(message => {
+ return self.clients.matchAll().then(clients => {
+ clients.forEach(client => client.postMessage(message));
+ });
+ })
+ );
+}
+
+function reply(event, promise) {
+ event.waitUntil(
+ Promise.resolve(promise)
+ .then(result => {
+ event.ports[0].postMessage(result);
+ })
+ .catch(error => {
+ event.ports[0].postMessage({
+ error: String(error),
+ });
+ })
+ );
+}
+
+function handlePush(event) {
+ if (event instanceof PushEvent) {
+ if (!("data" in event)) {
+ broadcast(event, { type: "finished", okay: "yes" });
+ return;
+ }
+ var message = {
+ type: "finished",
+ okay: "yes",
+ };
+ if (event.data) {
+ message.data = {
+ text: event.data.text(),
+ arrayBuffer: event.data.arrayBuffer(),
+ json: getJSON(event.data),
+ blob: event.data.blob(),
+ };
+ }
+ broadcast(event, message);
+ return;
+ }
+ broadcast(event, { type: "finished", okay: "no" });
+}
+
+var testHandlers = {
+ publicKey(data) {
+ return self.registration.pushManager
+ .getSubscription()
+ .then(subscription => ({
+ p256dh: subscription.getKey("p256dh"),
+ auth: subscription.getKey("auth"),
+ }));
+ },
+
+ resubscribe(data) {
+ return self.registration.pushManager
+ .getSubscription()
+ .then(subscription => {
+ assert(
+ subscription.endpoint == data.endpoint,
+ "Wrong push endpoint in worker"
+ );
+ return subscription.unsubscribe();
+ })
+ .then(result => {
+ assert(result, "Error unsubscribing in worker");
+ return self.registration.pushManager.getSubscription();
+ })
+ .then(subscription => {
+ assert(!subscription, "Subscription not removed in worker");
+ return self.registration.pushManager.subscribe();
+ })
+ .then(subscription => {
+ return {
+ endpoint: subscription.endpoint,
+ };
+ });
+ },
+
+ denySubscribe(data) {
+ return self.registration.pushManager
+ .getSubscription()
+ .then(subscription => {
+ assert(
+ !subscription,
+ "Should not return worker subscription with revoked permission"
+ );
+ return self.registration.pushManager.subscribe().then(
+ _ => {
+ assert(false, "Expected error subscribing with revoked permission");
+ },
+ error => {
+ return {
+ isDOMException: error instanceof DOMException,
+ name: error.name,
+ };
+ }
+ );
+ });
+ },
+
+ subscribeWithKey(data) {
+ return self.registration.pushManager
+ .subscribe({
+ applicationServerKey: data.key,
+ })
+ .then(
+ subscription => {
+ return {
+ endpoint: subscription.endpoint,
+ key: subscription.options.applicationServerKey,
+ };
+ },
+ error => {
+ return {
+ isDOMException: error instanceof DOMException,
+ name: error.name,
+ };
+ }
+ );
+ },
+};
+
+function handleMessage(event) {
+ var handler = testHandlers[event.data.type];
+ if (handler) {
+ reply(event, handler(event.data));
+ } else {
+ reply(event, Promise.reject("Invalid message type: " + event.data.type));
+ }
+}
+
+function handlePushSubscriptionChange(event) {
+ broadcast(event, { type: "changed", okay: "yes" });
+}