From 7e438a92304742ff2014901847d664ebbde77b8e Mon Sep 17 00:00:00 2001 From: Kit Cambridge Date: Tue, 4 Aug 2015 13:43:23 -0700 Subject: [PATCH] Bug 1189543 - `pushManager.getSubscription()` should return `null` for nonexistent push subscriptions in workers. r=nsm --HG-- extra : commitid : 1y3hC0xJqr6 extra : rebase_source : 29a7f65263d0d5d84a0940f1b8219b45b783b655 --- dom/push/PushManager.cpp | 10 +- dom/push/test/mochitest.ini | 2 + dom/push/test/test_push_manager_worker.html | 101 ++++++++++++++++++++ dom/push/test/worker.js | 30 ++++++ 4 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 dom/push/test/test_push_manager_worker.html diff --git a/dom/push/PushManager.cpp b/dom/push/PushManager.cpp index 6462395a7d0a..df874446c6d7 100644 --- a/dom/push/PushManager.cpp +++ b/dom/push/PushManager.cpp @@ -444,9 +444,13 @@ public: nsRefPtr proxy = mProxy.forget(); nsRefPtr promise = proxy->GetWorkerPromise(); if (NS_SUCCEEDED(mStatus)) { - nsRefPtr sub = - new WorkerPushSubscription(mEndpoint, mScope); - promise->MaybeResolve(sub); + if (mEndpoint.IsEmpty()) { + promise->MaybeResolve(JS::NullHandleValue); + } else { + nsRefPtr sub = + new WorkerPushSubscription(mEndpoint, mScope); + promise->MaybeResolve(sub); + } } else { promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); } diff --git a/dom/push/test/mochitest.ini b/dom/push/test/mochitest.ini index 732f9a1d3b90..3ba53d885e17 100644 --- a/dom/push/test/mochitest.ini +++ b/dom/push/test/mochitest.ini @@ -21,3 +21,5 @@ skip-if = os == "android" || toolkit == "gonk" skip-if = os == "android" || toolkit == "gonk" [test_try_registering_offline_disabled.html] skip-if = os == "android" || toolkit == "gonk" +[test_push_manager_worker.html] +skip-if = os == "android" || toolkit == "gonk" diff --git a/dom/push/test/test_push_manager_worker.html b/dom/push/test/test_push_manager_worker.html new file mode 100644 index 000000000000..6e1c6f52a830 --- /dev/null +++ b/dom/push/test/test_push_manager_worker.html @@ -0,0 +1,101 @@ + + + + + Test for Bug 1184574 + + + + +Mozilla Bug 1184574 +

+ +
+
+ + + + diff --git a/dom/push/test/worker.js b/dom/push/test/worker.js index 3bfd9ada9aa0..ce7608144bd0 100644 --- a/dom/push/test/worker.js +++ b/dom/push/test/worker.js @@ -1,7 +1,14 @@ // 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 a message from `test_push_manager_worker.html`, and +// verifies that `PushManager` can be used from the worker. + this.onpush = handlePush; +this.onmessage = handleMessage; function handlePush(event) { @@ -14,3 +21,26 @@ function handlePush(event) { result[0].postMessage({type: "finished", okay: "no"}); }); } + +function handleMessage(event) { + self.registration.pushManager.getSubscription().then(subscription => { + if (subscription.endpoint != event.data.endpoint) { + throw new Error("Wrong push endpoint in worker"); + } + return subscription.unsubscribe(); + }).then(result => { + if (!result) { + throw new Error("Error dropping subscription in worker"); + } + return self.registration.pushManager.getSubscription(); + }).then(subscription => { + if (subscription) { + throw new Error("Subscription not dropped in worker"); + } + return self.registration.pushManager.subscribe(); + }).then(subscription => { + event.ports[0].postMessage({endpoint: subscription.endpoint}); + }).catch(error => { + event.ports[0].postMessage({error: error}); + }); +}