112 lines
3.7 KiB
JavaScript
112 lines
3.7 KiB
JavaScript
'use strict';
|
|
|
|
const pushNotifier = Cc['@mozilla.org/push/Notifier;1']
|
|
.getService(Ci.nsIPushNotifier);
|
|
|
|
add_task(function* test_observer_remoting() {
|
|
if (isParent) {
|
|
yield testInParent();
|
|
} else {
|
|
yield testInChild();
|
|
}
|
|
});
|
|
|
|
const childTests = [{
|
|
text: 'Hello from child!',
|
|
principal: Services.scriptSecurityManager.getSystemPrincipal(),
|
|
}];
|
|
|
|
const parentTests = [{
|
|
text: 'Hello from parent!',
|
|
principal: Services.scriptSecurityManager.getSystemPrincipal(),
|
|
}];
|
|
|
|
function* testInParent() {
|
|
// Register observers for notifications from the child, then run the test in
|
|
// the child and wait for the notifications.
|
|
let promiseNotifications = childTests.reduce(
|
|
(p, test) => p.then(_ => waitForNotifierObservers(test, /* shouldNotify = */ false)),
|
|
Promise.resolve()
|
|
);
|
|
let promiseFinished = run_test_in_child('./test_observer_remoting.js');
|
|
yield promiseNotifications;
|
|
|
|
// Wait until the child is listening for notifications from the parent.
|
|
yield do_await_remote_message('push_test_observer_remoting_child_ready');
|
|
|
|
// Fire an observer notification in the parent that should be forwarded to
|
|
// the child.
|
|
yield parentTests.reduce(
|
|
(p, test) => p.then(_ => waitForNotifierObservers(test, /* shouldNotify = */ true)),
|
|
Promise.resolve()
|
|
);
|
|
|
|
// Wait for the child to exit.
|
|
yield promiseFinished;
|
|
}
|
|
|
|
function* testInChild() {
|
|
// Fire an observer notification in the child that should be forwarded to
|
|
// the parent.
|
|
yield childTests.reduce(
|
|
(p, test) => p.then(_ => waitForNotifierObservers(test, /* shouldNotify = */ true)),
|
|
Promise.resolve()
|
|
);
|
|
|
|
// Register observers for notifications from the parent, let the parent know
|
|
// we're ready, and wait for the notifications.
|
|
let promiseNotifierObservers = parentTests.reduce(
|
|
(p, test) => p.then(_ => waitForNotifierObservers(test, /* shouldNotify = */ false)),
|
|
Promise.resolve()
|
|
);
|
|
do_send_remote_message('push_test_observer_remoting_child_ready');
|
|
yield promiseNotifierObservers;
|
|
}
|
|
|
|
var waitForNotifierObservers = Task.async(function* ({ text, principal }, shouldNotify = false) {
|
|
let notifyPromise = promiseObserverNotification(
|
|
PushServiceComponent.pushTopic);
|
|
let subChangePromise = promiseObserverNotification(
|
|
PushServiceComponent.subscriptionChangeTopic);
|
|
let subModifiedPromise = promiseObserverNotification(
|
|
PushServiceComponent.subscriptionModifiedTopic);
|
|
|
|
let scope = 'chrome://test-scope';
|
|
let data = new TextEncoder('utf-8').encode(text);
|
|
|
|
if (shouldNotify) {
|
|
pushNotifier.notifyPushWithData(scope, principal, '', data.length, data);
|
|
pushNotifier.notifySubscriptionChange(scope, principal);
|
|
pushNotifier.notifySubscriptionModified(scope, principal);
|
|
}
|
|
|
|
let {
|
|
data: notifyScope,
|
|
subject: notifySubject,
|
|
} = yield notifyPromise;
|
|
equal(notifyScope, scope,
|
|
'Should fire push notifications with the correct scope');
|
|
let message = notifySubject.QueryInterface(Ci.nsIPushMessage);
|
|
equal(message.principal, principal,
|
|
'Should include the principal in the push message');
|
|
strictEqual(message.data.text(), text, 'Should include data');
|
|
|
|
let {
|
|
data: subChangeScope,
|
|
subject: subChangePrincipal,
|
|
} = yield subChangePromise;
|
|
equal(subChangeScope, scope,
|
|
'Should fire subscription change notifications with the correct scope');
|
|
equal(subChangePrincipal, principal,
|
|
'Should pass the principal as the subject of a change notification');
|
|
|
|
let {
|
|
data: subModifiedScope,
|
|
subject: subModifiedPrincipal,
|
|
} = yield subModifiedPromise;
|
|
equal(subModifiedScope, scope,
|
|
'Should fire subscription modified notifications with the correct scope');
|
|
equal(subModifiedPrincipal, principal,
|
|
'Should pass the principal as the subject of a modified notification');
|
|
});
|