diff options
Diffstat (limited to 'dom/push/test/xpcshell/test_handler_service.js')
-rw-r--r-- | dom/push/test/xpcshell/test_handler_service.js | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/dom/push/test/xpcshell/test_handler_service.js b/dom/push/test/xpcshell/test_handler_service.js new file mode 100644 index 0000000000..bee29c1c77 --- /dev/null +++ b/dom/push/test/xpcshell/test_handler_service.js @@ -0,0 +1,74 @@ +"use strict"; + +// Here we test that if an xpcom component is registered with the category +// manager for push notifications against a specific scope, that service is +// instantiated before the message is delivered. + +const { MockRegistrar } = ChromeUtils.importESModule( + "resource://testing-common/MockRegistrar.sys.mjs" +); + +let pushService = Cc["@mozilla.org/push/Service;1"].getService( + Ci.nsIPushService +); + +function PushServiceHandler() { + // Register a push observer. + this.observed = []; + Services.obs.addObserver(this, pushService.pushTopic); + Services.obs.addObserver(this, pushService.subscriptionChangeTopic); + Services.obs.addObserver(this, pushService.subscriptionModifiedTopic); +} + +PushServiceHandler.prototype = { + classID: Components.ID("{bb7c5199-c0f7-4976-9f6d-1306e32c5591}"), + QueryInterface: ChromeUtils.generateQI([]), + + observe(subject, topic, data) { + this.observed.push({ subject, topic, data }); + }, +}; + +let handlerService = new PushServiceHandler(); + +add_test(function test_service_instantiation() { + const CONTRACT_ID = "@mozilla.org/dom/push/test/PushServiceHandler;1"; + let scope = "chrome://test-scope"; + + MockRegistrar.register(CONTRACT_ID, handlerService); + Services.catMan.addCategoryEntry("push", scope, CONTRACT_ID, false, false); + + let pushNotifier = Cc["@mozilla.org/push/Notifier;1"].getService( + Ci.nsIPushNotifier + ); + let principal = Services.scriptSecurityManager.getSystemPrincipal(); + pushNotifier.notifyPush(scope, principal, ""); + + equal(handlerService.observed.length, 1); + equal(handlerService.observed[0].topic, pushService.pushTopic); + let message = handlerService.observed[0].subject.QueryInterface( + Ci.nsIPushMessage + ); + equal(message.principal, principal); + strictEqual(message.data, null); + equal(handlerService.observed[0].data, scope); + + // and a subscription change. + pushNotifier.notifySubscriptionChange(scope, principal); + equal(handlerService.observed.length, 2); + equal(handlerService.observed[1].topic, pushService.subscriptionChangeTopic); + equal(handlerService.observed[1].subject, principal); + equal(handlerService.observed[1].data, scope); + + // and a subscription modified event. + pushNotifier.notifySubscriptionModified(scope, principal); + equal(handlerService.observed.length, 3); + equal( + handlerService.observed[2].topic, + pushService.subscriptionModifiedTopic + ); + equal(handlerService.observed[2].subject, principal); + equal(handlerService.observed[2].data, scope); + + run_next_test(); +}); |