mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-09 04:39:03 +02:00
78 lines
2.2 KiB
JavaScript
78 lines
2.2 KiB
JavaScript
// Documentation of methods used here are at:
|
|
// https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Interaction_between_privileged_and_non-privileged_pages
|
|
|
|
var pktPanelMessaging = (function() {
|
|
|
|
function panelIdFromURL(url) {
|
|
var panelId = url.match(/panelId=([\w|\d|\.]*)&?/);
|
|
if (panelId && panelId.length > 1) {
|
|
return panelId[1];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function prefixedMessageId(messageId) {
|
|
return 'PKT_' + messageId;
|
|
}
|
|
|
|
function panelPrefixedMessageId(panelId, messageId) {
|
|
return prefixedMessageId(panelId + '_' + messageId);
|
|
}
|
|
|
|
function addMessageListener(panelId, messageId, callback) {
|
|
document.addEventListener(panelPrefixedMessageId(panelId, messageId), function(e) {
|
|
|
|
callback(JSON.parse(e.target.getAttribute("payload"))[0]);
|
|
|
|
// TODO: Figure out why e.target.parentNode is null
|
|
// e.target.parentNode.removeChild(e.target);
|
|
|
|
}, false);
|
|
|
|
}
|
|
|
|
function removeMessageListener(panelId, messageId, callback) {
|
|
document.removeEventListener(panelPrefixedMessageId(panelId, messageId), callback);
|
|
}
|
|
|
|
function sendMessage(panelId, messageId, payload, callback) {
|
|
// Payload needs to be an object in format:
|
|
// { panelId: panelId, data: {} }
|
|
var messagePayload = {
|
|
panelId: panelId,
|
|
data: (payload || {})
|
|
};
|
|
|
|
// Create a callback to listen for a response
|
|
if (callback) {
|
|
var messageResponseId = messageId + "Response";
|
|
var responseListener = function(responsePayload) {
|
|
callback(responsePayload);
|
|
removeMessageListener(panelId, messageResponseId, responseListener);
|
|
}
|
|
|
|
addMessageListener(panelId, messageResponseId, responseListener);
|
|
}
|
|
|
|
// Send message
|
|
var element = document.createElement("PKTMessageFromPanelElement");
|
|
element.setAttribute("payload", JSON.stringify([messagePayload]));
|
|
document.documentElement.appendChild(element);
|
|
|
|
var evt = document.createEvent("Events");
|
|
evt.initEvent(prefixedMessageId(messageId), true, false);
|
|
element.dispatchEvent(evt);
|
|
}
|
|
|
|
|
|
/**
|
|
* Public functions
|
|
*/
|
|
return {
|
|
panelIdFromURL: panelIdFromURL,
|
|
addMessageListener : addMessageListener,
|
|
removeMessageListener : removeMessageListener,
|
|
sendMessage: sendMessage
|
|
};
|
|
}());
|