Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var ExtensionMsgBridge = {
- callbacks: ["null"],
- listen_event:'ext_1',
- send_event:'ext_2',
- send_request: function (data, callback) { // analogue of chrome.extension.sendRequest
- var set_data = function (el, field, data) {
- if(el.setUserData) {
- el.setUserData(field, data, null);
- } else {
- el.dataset[field] = JSON.stringify(data);
- }
- }
- var get_data = function (el, field) {
- if(el.getUserData) {
- return el.getUserData(field);
- } else {
- return JSON.parse(el.dataset[field]);
- }
- }
- var request = null;
- request = document.createElement("div");
- set_data(request, "data", data);
- if(callback) {
- var callback_idx = ExtensionMsgBridge.callbacks.length;
- ExtensionMsgBridge.callbacks.push(function (response) {
- ExtensionMsgBridge.callbacks[callback_idx] = 'done';
- //alert('Before callback');
- return callback(response);
- });
- set_data(request, "callback", callback_idx);
- document.addEventListener(ExtensionMsgBridge.send_event+"-response", function (event) {
- var node = event.target,
- callback = ExtensionMsgBridge.callbacks[get_data(node, "callback")],
- response = get_data(node, "response");
- if (node.parentNode) node.parentNode.removeChild(node);
- document.removeEventListener(ExtensionMsgBridge.send_event+"-response", arguments.callee, false);
- return callback(response);
- }, false);
- }
- document.documentElement.appendChild(request);
- var sender = document.createEvent("HTMLEvents");
- sender.initEvent(ExtensionMsgBridge.send_event+"-query", true, false);
- return request.dispatchEvent(sender);
- },
- listen_request: function (callback) {
- var set_data = function (el, field, data) {
- if(el.setUserData) {
- el.setUserData(field, data, null);
- } else {
- el.dataset[field] = JSON.stringify(data);
- }
- }
- var get_data = function (el, field) {
- if(el.getUserData) {
- return el.getUserData(field);
- } else {
- return JSON.parse(el.dataset[field]);
- }
- }
- return document.addEventListener(ExtensionMsgBridge.listen_event+"-query", function (event) {
- var node = event.target,
- doc = node.ownerDocument;
- return callback(get_data(node, "data"), doc, function (data) {
- if(!get_data(node, "callback")) {
- if (node.parentNode) node.parentNode.removeChild(node);
- return
- }
- set_data(node, "response", data)
- var listener = doc.createEvent("HTMLEvents");
- listener.initEvent(ExtensionMsgBridge.listen_event+"-response", true, false);
- return node.dispatchEvent(listener);
- });
- }, false, true);
- },
- listen_handler: function (request, sender, callback) {
- console.log('on message '+ExtensionMsgBridge.listen_event, request,sender);
- callback({
- response: 'params:'+JSON.stringify(request)
- });
- }
- }
- // Set event id for extension content script side
- ExtensionMsgBridge.listen_event='ext_side2';
- ExtensionMsgBridge.send_event='ext_side1';
- ExtensionMsgBridge.listen_request(ExtensionMsgBridge.listen_handler);
- /*
- // Set event id for injected script side
- ExtensionMsgBridge.listen_event='ext_side1';
- ExtensionMsgBridge.send_event='ext_side2';
- ExtensionMsgBridge.listen_request(ExtensionMsgBridge.listen_handler);
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement