Bug 1191931, Part 2 - Test resubscribing from a worker. r?mt draft
authorKit Cambridge <kcambridge@mozilla.com>
Thu, 28 Jan 2016 08:06:32 -0800
changeset 326892 007a96561cc0236f45204d6d5eb78d6c97ea61ca
parent 326890 a0411eee29b8c032f3005664f37f20283574dd1b
child 326893 e42ac232e49a1ea36f797681f3023b9997e031df
push id10179
push userkcambridge@mozilla.com
push dateThu, 28 Jan 2016 16:19:15 +0000
reviewersmt
bugs1191931
milestone47.0a1
Bug 1191931, Part 2 - Test resubscribing from a worker. r?mt
dom/push/test/test_register.html
dom/push/test/worker.js
--- a/dom/push/test/test_register.html
+++ b/dom/push/test/test_register.html
@@ -44,20 +44,30 @@ http://creativecommons.org/licenses/publ
   });
 
   add_task(function* checkPermissionState() {
     var state = yield registration.pushManager.permissionState();
     is(state, "granted", "permissionState() should resolve to granted.");
   });
 
   var pushSubscription;
-  add_task(function* setupPushNotification() {
+  add_task(function* subscribe() {
     pushSubscription = yield registration.pushManager.subscribe();
   });
 
+  add_task(function* resubscribe() {
+    var data = yield sendRequestToWorker({
+      type: "resubscribe",
+      endpoint: pushSubscription.endpoint,
+    });
+    pushSubscription = yield registration.pushManager.getSubscription();
+    is(data.endpoint, pushSubscription.endpoint,
+       "Subscription endpoints should match after resubscribing in worker");
+  });
+
   add_task(function* waitForPushNotification() {
     yield Promise.all([
       controlledFrame.contentWindow.waitOnPushMessage(),
       fetch("http://mochi.test:8888/tests/dom/push/test/push-server.sjs", {
         method: "PUT",
         headers: {
           "X-Push-Method": "POST",
           "X-Push-Server": pushSubscription.endpoint,
--- a/dom/push/test/worker.js
+++ b/dom/push/test/worker.js
@@ -1,27 +1,50 @@
 // 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.
+
 this.onpush = handlePush;
 this.onmessage = handleMessage;
 
 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 reply(event, promise) {
+  event.waitUntil(promise.then(result => {
+    event.ports[0].postMessage(result);
+  }).catch(error => {
+    event.ports[0].postMessage({
+      error: String(error),
+    });
+  }));
+}
+
 function handlePush(event) {
 
   event.waitUntil(self.clients.matchAll().then(function(result) {
     if (event instanceof PushEvent) {
       if (!('data' in event)) {
         result[0].postMessage({type: "finished", okay: "yes"});
         return;
       }
@@ -41,24 +64,39 @@ function handlePush(event) {
       return;
     }
     result[0].postMessage({type: "finished", okay: "no"});
   }));
 }
 
 function handleMessage(event) {
   if (event.data.type == "publicKey") {
-    event.waitUntil(self.registration.pushManager.getSubscription().then(subscription => {
-      event.ports[0].postMessage({
+    reply(event, self.registration.pushManager.getSubscription().then(
+      subscription => ({
         p256dh: subscription.getKey("p256dh"),
         auth: subscription.getKey("auth"),
-      });
-    }).catch(error => {
-      event.ports[0].postMessage({
-        error: String(error),
-      });
+      })
+    ));
+    return;
+  }
+  if (event.data.type == "resubscribe") {
+    reply(event, self.registration.pushManager.getSubscription().then(
+      subscription => {
+        assert(subscription.endpoint == event.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,
+      };
     }));
     return;
   }
-  event.ports[0].postMessage({
-    error: "Invalid message type: " + event.data.type,
-  });
+  reply(event, Promise.reject(
+    "Invalid message type: " + event.data.type));
 }