Bug 1191931, Part 2 - Test resubscribing from a worker. r?mt
--- 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));
}