1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const { jetpackID } = require('@packaging');
const { when } = require('./unload');
// TODO: Create a bug report and remove this workaround once it's fixed.
// Only function needs defined in the context of the message manager window
// can be registered via `addMessageListener`.
function listener(callee) {
return function listener() { return callee.apply(this, arguments); };
}
function messageListener(scope, callee) {
return scope ? scope.eval('(' + listener + ')')(callee) : callee
}
exports.channel = function channel(scope, messageManager, address, raw) {
address = jetpackID + ':' + address
return {
input: function input(next, stop) {
let listener = messageListener(scope, function onMessage(message) {
if (false === next(raw ? message : message.json) && listener) {
messageManager.removeMessageListener(address, listener);
listener = null;
}
});
messageManager.addMessageListener(address, listener);
// Bug 724433: do not leak `listener` on addon disabling
when(function () {
if (listener) {
messageManager.removeMessageListener(address, listener);
listener = null;
}
});
},
output: function output(data) {
messageManager.sendAsyncMessage(address, data);
},
sync: !messageManager.sendSyncMessage ? null : function sync(data) {
messageManager.sendSyncMessage(address, data);
}
};
};
|