Add messageRouter

This commit is contained in:
hensm
2018-07-17 16:56:56 +01:00
parent e98639a076
commit 27b5409535
3 changed files with 55 additions and 33 deletions

View File

@@ -1,5 +1,7 @@
"use strict";
import messageRouter from "./messageRouter";
const _ = browser.i18n.getMessage;
@@ -20,7 +22,6 @@ const SENDER_SCRIPT_FRAMEWORK_URL =
*/
browser.webRequest.onBeforeRequest.addListener(
async details => {
console.log(details);
switch (details.url) {
case SENDER_SCRIPT_URL:
// Content/Page script bridge
@@ -141,11 +142,9 @@ function initBridge (tabId, frameId) {
port.onMessage.addListener(message => {
// Forward shim: messages
// TODO: Integrate into messageRouter
if (message.subject.startsWith("shim:")) {
browser.tabs.sendMessage(tabId, message, {
frameId
});
return;
browser.tabs.sendMessage(tabId, message, { frameId });
}
});
}
@@ -205,38 +204,12 @@ async function openPopup (tabId) {
}
// Extension messages
browser.runtime.onMessage.addListener(async (message, sender, respond) => {
messageRouter.register("main", async (message, sender) => {
const tabId = sender.tab.id;
const { frameId } = sender.tab;
// Forward bridge: messages
if (message.subject.startsWith("bridge:")) {
bridgeMap.get(tabId).postMessage(message);
return;
}
// Forward shim: messages
if (message.subject.startsWith("shim:")) {
browser.tabs.sendMessage(popupOpenerTabId, message, { frameId });
return;
}
// Forward popup messages
if (message.subject.startsWith("popup:")) {
if (popupTabId) {
try {
browser.tabs.sendMessage(popupTabId, message);
} catch (err) {
// Popup is closed
}
}
return;
}
switch (message.subject) {
case "main:initialize":
initBridge(tabId);
initBridge(tabId, sender.tab.frameId);
break;
case "main:openPopup": {
@@ -245,3 +218,26 @@ browser.runtime.onMessage.addListener(async (message, sender, respond) => {
}
}
});
messageRouter.register("bridge", (message, sender) => {
bridgeMap.get(sender.tab.id).postMessage(message);
});
messageRouter.register("shim", (message, sender) => {
browser.tabs.sendMessage(popupOpenerTabId, message
, { frameId: sender.tab.frameId });
});
messageRouter.register("popup", (message, sender) => {
if (!popupTabId) return;
try {
browser.tabs.sendMessage(popupTabId, message);
} catch (err) {
// Popup is closed
}
});
browser.runtime.onMessage.addListener((message, sender) => {
messageRouter.handleMessage(message, sender);
});

25
ext/src/messageRouter.js Normal file
View File

@@ -0,0 +1,25 @@
"use strict";
const routeMap = new Map();
function register (routeName, senderCallback) {
routeMap.set(routeName, senderCallback);
}
function deregister (routeName) {
routeMap.delete(routeName);
}
function handleMessage (message, sender) {
const destination = message.subject.split(":")[0];
if (routeMap.has(destination)) {
routeMap.get(destination)(message, sender);
}
}
export default {
register
, deregister
, handleMessage
}

View File

@@ -17,6 +17,7 @@ module.exports = {
, "contentSetup" : `${include_path}/contentSetup.js`
, "mediaCast" : `${include_path}/mediaCast.js`
, "mirroringCast" : `${include_path}/mirroringCast.js`
, "messageRouter" : `${include_path}/messageRouter.js`
}
, output: {
filename: "[name].js"