From b8d28db36dd7f12666c6c58c86c000143c063520 Mon Sep 17 00:00:00 2001 From: hensm Date: Fri, 15 Feb 2019 03:28:28 +0000 Subject: [PATCH] Add content-script-side functions to messageBridge --- ext/src/content.js | 38 --------------------------- ext/src/main.js | 6 ++--- ext/src/shim/cast/classes/Session.js | 4 +-- ext/src/shim/cast/index.js | 10 +++---- ext/src/shim/content.js | 34 ++++++++++++++++++++++++ ext/src/{ => shim}/contentSetup.js | 0 ext/src/shim/index.js | 2 +- ext/src/shim/media/classes/Media.js | 4 +-- ext/src/shim/messageBridge.js | 39 +++++++++++++++++++++++----- ext/webpack.config.js | 8 +++--- 10 files changed, 84 insertions(+), 61 deletions(-) delete mode 100644 ext/src/content.js create mode 100644 ext/src/shim/content.js rename ext/src/{ => shim}/contentSetup.js (100%) diff --git a/ext/src/content.js b/ext/src/content.js deleted file mode 100644 index 5c1de1d..0000000 --- a/ext/src/content.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; - -const backgroundPort = browser.runtime.connect({ - name: "shim" -}); - -backgroundPort.onMessage.addListener(message => { - const event = new CustomEvent("__castMessage", { - detail: JSON.stringify(message) - }); - document.dispatchEvent(event); -}); - -let popupPort; -browser.runtime.onConnect.addListener(port => { - if (port.name === "popup") { - popupPort = port; - } - - port.onMessage.addListener(message => { - const event = new CustomEvent("__castMessage", { - detail: JSON.stringify(message) - }); - document.dispatchEvent(event); - }) -}); - -document.addEventListener("__castMessageResponse", ev => { - const [ destination ] = ev.detail.subject.split(":/"); - if (destination === "popup") { - if (popupPort) { - popupPort.postMessage(ev.detail); - } - return; - } - - backgroundPort.postMessage(ev.detail); -}); diff --git a/ext/src/main.js b/ext/src/main.js index 413ca48..0b0ccfc 100755 --- a/ext/src/main.js +++ b/ext/src/main.js @@ -122,7 +122,7 @@ browser.webRequest.onBeforeRequest.addListener( case SENDER_SCRIPT_URL: // Content/Page script bridge await browser.tabs.executeScript(details.tabId, { - file: "content.js" + file: "shim/content.js" , frameId: details.frameId , runAt: "document_start" }); @@ -257,7 +257,7 @@ browser.runtime.onMessage.addListener(message => { // Defines window.chrome for site compatibility browser.contentScripts.register({ allFrames: true - , js: [{ file: "contentSetup.js" }] + , js: [{ file: "shim/contentSetup.js" }] , matches: [ "" ] , runAt: "document_start" }); @@ -276,7 +276,7 @@ browser.menus.onClicked.addListener(async (info, tab) => { // Load cast setup script await browser.tabs.executeScript(tab.id, { - file: "content.js" + file: "shim/content.js" , frameId }); diff --git a/ext/src/shim/cast/classes/Session.js b/ext/src/shim/cast/classes/Session.js index 554fdd6..7bb6ce4 100755 --- a/ext/src/shim/cast/classes/Session.js +++ b/ext/src/shim/cast/classes/Session.js @@ -8,7 +8,7 @@ import { SessionStatus , ErrorCode , VolumeControlType } from "../enums"; -import { onMessage, sendMessage } from "../../messageBridge"; +import { onMessage, sendMessageResponse } from "../../messageBridge"; import uuid from "uuid/v1"; @@ -182,7 +182,7 @@ export default class Session { } _sendMessage (subject, data = {}) { - sendMessage({ + sendMessageResponse({ subject , data , _id: this._id diff --git a/ext/src/shim/cast/index.js b/ext/src/shim/cast/index.js index d9b50fc..c7385cd 100755 --- a/ext/src/shim/cast/index.js +++ b/ext/src/shim/cast/index.js @@ -28,7 +28,7 @@ import { requestSession as requestSessionTimeout } from "../timeout"; import state from "../state"; -import { onMessage, sendMessage } from "../messageBridge"; +import { onMessage, sendMessageResponse } from "../messageBridge"; const cast = { @@ -90,7 +90,7 @@ cast.initialize = ( state.apiConfig = apiConfig; - sendMessage({ + sendMessageResponse({ subject: "bridge:/discover" }); @@ -145,7 +145,7 @@ cast.requestSession = ( sessionErrorCallback = errorCallback; // Open destination chooser - sendMessage({ + sendMessageResponse({ subject: "main:/openPopup" }); }; @@ -223,7 +223,7 @@ onMessage(message => { , [] // appImages , selectedReceiver // receiver , (session) => { - sendMessage({ + sendMessageResponse({ subject: "popup:/close" }); @@ -257,7 +257,7 @@ onMessage(message => { * chooser. */ case "shim:/popupReady": { - sendMessage({ + sendMessageResponse({ subject: "popup:/populateReceiverList" , data: { receivers: state.receiverList diff --git a/ext/src/shim/content.js b/ext/src/shim/content.js new file mode 100644 index 0000000..0a7fb94 --- /dev/null +++ b/ext/src/shim/content.js @@ -0,0 +1,34 @@ +"use strict"; + +import { onMessageResponse, sendMessage } from "./messageBridge"; + + +const backgroundPort = browser.runtime.connect({ + name: "shim" +}); +backgroundPort.onMessage.addListener(sendMessage); + +let popupPort; +browser.runtime.onConnect.addListener(port => { + if (port.name === "popup") { + popupPort = port; + } + port.onMessage.addListener(sendMessage) +}); + +onMessageResponse(message => { + const [ destination ] = message.subject.split(":/"); + switch (destination) { + case "popup": { + if (popupPort) { + popupPort.postMessage(message); + } + + break; + }; + + default: { + backgroundPort.postMessage(message); + } + } +}); diff --git a/ext/src/contentSetup.js b/ext/src/shim/contentSetup.js similarity index 100% rename from ext/src/contentSetup.js rename to ext/src/shim/contentSetup.js diff --git a/ext/src/shim/index.js b/ext/src/shim/index.js index 9ddc1ae..c7f275d 100755 --- a/ext/src/shim/index.js +++ b/ext/src/shim/index.js @@ -3,7 +3,7 @@ import cast from "./cast"; import media from "./media"; -import { onMessage, sendMessage } from "./messageBridge"; +import { onMessage } from "./messageBridge"; if (!window.chrome) { diff --git a/ext/src/shim/media/classes/Media.js b/ext/src/shim/media/classes/Media.js index ffcf818..6b1ee9c 100644 --- a/ext/src/shim/media/classes/Media.js +++ b/ext/src/shim/media/classes/Media.js @@ -10,7 +10,7 @@ import { PlayerState import _Error from "../../cast/classes/Error"; import { ErrorCode } from "../../cast/enums"; -import { onMessage, sendMessage } from "../../messageBridge"; +import { onMessage, sendMessageResponse } from "../../messageBridge"; import uuid from "uuid/v1"; @@ -93,7 +93,7 @@ export default class Media { } _sendMessage (subject, data) { - sendMessage({ + sendMessageResponse({ subject , data , _id: this._id diff --git a/ext/src/shim/messageBridge.js b/ext/src/shim/messageBridge.js index 596ce61..eb43319 100644 --- a/ext/src/shim/messageBridge.js +++ b/ext/src/shim/messageBridge.js @@ -1,15 +1,40 @@ "use strict"; export function onMessage (listener) { - document.addEventListener("__castMessage", ev => { - listener(JSON.parse(ev.detail)); - }); + document.addEventListener("__castMessage", ev => { + listener(JSON.parse(ev.detail)); + + /** + * TODO: + * Figure out a way to handle and stop propagation of this + * event to hide it from page scripts. + * Currently the event handler is set after the page loads the + * cast API, allowing pages set handlers before this script, + * intercept the event, and cancel it. + */ + ev.stopPropagation(); + }, true); +} + +export function sendMessageResponse (message) { + const event = new CustomEvent("__castMessageResponse", { + detail: JSON.stringify(message) + }); + + document.dispatchEvent(event); +} + + +export function onMessageResponse (listener) { + document.addEventListener("__castMessageResponse", ev => { + listener(JSON.parse(ev.detail)); + }, true); } export function sendMessage (message) { - const event = new CustomEvent("__castMessageResponse", { - detail: message - }); + const event = new CustomEvent("__castMessage", { + detail: JSON.stringify(message) + }); - document.dispatchEvent(event); + document.dispatchEvent(event); } diff --git a/ext/webpack.config.js b/ext/webpack.config.js index 84582ea..9f49355 100755 --- a/ext/webpack.config.js +++ b/ext/webpack.config.js @@ -9,13 +9,15 @@ module.exports = (env) => ({ "main" : `${env.includePath}/main.js` , "popup/bundle" : `${env.includePath}/popup/index.jsx` , "options/bundle" : `${env.includePath}/options/index.jsx` - , "shim/bundle" : `${env.includePath}/shim/index.js` , "updater/bundle" : `${env.includePath}/updater/index.jsx` - , "content" : `${env.includePath}/content.js` - , "contentSetup" : `${env.includePath}/contentSetup.js` , "mediaCast" : `${env.includePath}/mediaCast.js` , "mirroringCast" : `${env.includePath}/mirroringCast.js` , "compat/youtube" : `${env.includePath}/compat/youtube.js` + + // Shim entries + , "shim/bundle" : `${env.includePath}/shim/index.js` + , "shim/content" : `${env.includePath}/shim/content.js` + , "shim/contentSetup" : `${env.includePath}/shim/contentSetup.js` } , output: { filename: "[name].js"