Add content-script-side functions to messageBridge

This commit is contained in:
hensm
2019-02-15 03:28:28 +00:00
parent 98bd2f2ab3
commit b8d28db36d
10 changed files with 84 additions and 61 deletions

View File

@@ -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

View File

@@ -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

34
ext/src/shim/content.js Normal file
View File

@@ -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);
}
}
});

View File

@@ -0,0 +1,3 @@
"use strict";
window.wrappedJSObject.chrome = cloneInto({}, window);

View File

@@ -3,7 +3,7 @@
import cast from "./cast";
import media from "./media";
import { onMessage, sendMessage } from "./messageBridge";
import { onMessage } from "./messageBridge";
if (!window.chrome) {

View File

@@ -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

View File

@@ -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);
}