aboutsummaryrefslogtreecommitdiff
path: root/tools/addon-sdk-1.7/packages/api-utils/lib/channel.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/addon-sdk-1.7/packages/api-utils/lib/channel.js')
-rw-r--r--tools/addon-sdk-1.7/packages/api-utils/lib/channel.js46
1 files changed, 46 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.7/packages/api-utils/lib/channel.js b/tools/addon-sdk-1.7/packages/api-utils/lib/channel.js
new file mode 100644
index 0000000..a888af8
--- /dev/null
+++ b/tools/addon-sdk-1.7/packages/api-utils/lib/channel.js
@@ -0,0 +1,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);
+ }
+ };
+};
+