diff --git a/ext/src/background/receiverSelector/ReceiverSelector.ts b/ext/src/background/ReceiverSelector.ts similarity index 84% rename from ext/src/background/receiverSelector/ReceiverSelector.ts rename to ext/src/background/ReceiverSelector.ts index 618986d..acc4ce2 100644 --- a/ext/src/background/receiverSelector/ReceiverSelector.ts +++ b/ext/src/background/ReceiverSelector.ts @@ -1,35 +1,45 @@ "use strict"; -import logger from "../../lib/logger"; -import messaging, { Port, Message } from "../../messaging"; -import options from "../../lib/options"; - -import { TypedEventTarget } from "../../lib/TypedEventTarget"; -import { ReceiverDevice } from "../../types"; -import { SessionRequest } from "../../cast/sdk/classes"; +import logger from "../lib/logger"; +import messaging, { Port, Message } from "../messaging"; +import options from "../lib/options"; +import { TypedEventTarget } from "../lib/TypedEventTarget"; +import { SessionRequest } from "../cast/sdk/classes"; import { - ReceiverSelectionCast, - ReceiverSelectionStop, + ReceiverDevice, + ReceiverSelectionActionType, ReceiverSelectorMediaType -} from "./index"; +} from "../types"; const POPUP_URL = browser.runtime.getURL("ui/popup/index.html"); -export interface PageInfo { +/** Info about sender page context. */ +export interface ReceiverSelectorPageInfo { url: string; tabId: number; frameId: number; sessionRequest?: SessionRequest; } +export interface ReceiverSelectionCast { + actionType: ReceiverSelectionActionType.Cast; + receiverDevice: ReceiverDevice; + mediaType: ReceiverSelectorMediaType; + filePath?: string; +} +export interface ReceiverSelectionStop { + actionType: ReceiverSelectionActionType.Stop; + receiverDevice: ReceiverDevice; +} +export type ReceiverSelection = ReceiverSelectionCast | ReceiverSelectionStop; + interface ReceiverSelectorEvents { selected: ReceiverSelectionCast; error: string; cancelled: void; stop: ReceiverSelectionStop; } - /** * Manages the receiver selector popup window and communication with the * extension page hosted within. @@ -38,7 +48,7 @@ export default class ReceiverSelector extends TypedEventTarget(); public async init() { @@ -38,7 +39,7 @@ export default new (class CastManager { }); // Forward receiver eventes to cast instances - receiverDevices.addEventListener("receiverDeviceUp", ev => { + deviceManager.addEventListener("receiverDeviceUp", ev => { for (const instance of this.activeInstances) { instance.contentPort.postMessage({ subject: "cast:receiverDeviceUp", @@ -46,7 +47,7 @@ export default new (class CastManager { }); } }); - receiverDevices.addEventListener("receiverDeviceDown", ev => { + deviceManager.addEventListener("receiverDeviceDown", ev => { for (const instance of this.activeInstances) { instance.contentPort.postMessage({ subject: "cast:receiverDeviceDown", @@ -202,7 +203,7 @@ export default new (class CastManager { case "main:initializeCast": { instance.appId = message.data.appId; - for (const receiverDevice of receiverDevices.getDevices()) { + for (const receiverDevice of deviceManager.getDevices()) { instance.contentPort.postMessage({ subject: "cast:receiverDeviceUp", data: { receiverDevice } @@ -224,12 +225,11 @@ export default new (class CastManager { } try { - const selection = - await ReceiverSelectorManager.getSelection( - instance.contentTabId, - instance.contentFrameId, - { sessionRequest: message.data.sessionRequest } - ); + const selection = await selectorManager.getSelection( + instance.contentTabId, + instance.contentFrameId, + { sessionRequest: message.data.sessionRequest } + ); // Handle cancellation if (!selection) { @@ -297,7 +297,7 @@ export default new (class CastManager { * same one that caused the session creation. */ case "main:closeReceiverSelector": { - const selector = await ReceiverSelectorManager.getSelector(); + const selector = await selectorManager.getSelector(); const shouldClose = await options.get( "receiverSelectorWaitForConnection" ); @@ -366,7 +366,7 @@ export default new (class CastManager { case ReceiverSelectorMediaType.File: { const fileUrl = new URL(`file://${opts.selection.filePath}`); - const { init } = await import("./senders/media"); + const { init } = await import("../cast/senders/media"); init({ mediaUrl: fileUrl.href, diff --git a/ext/src/background/receiverDevices.ts b/ext/src/background/deviceManager.ts similarity index 100% rename from ext/src/background/receiverDevices.ts rename to ext/src/background/deviceManager.ts diff --git a/ext/src/background/menus.ts b/ext/src/background/menus.ts index 960476b..eb0a37a 100644 --- a/ext/src/background/menus.ts +++ b/ext/src/background/menus.ts @@ -2,17 +2,17 @@ import logger from "../lib/logger"; import options from "../lib/options"; - import { stringify } from "../lib/utils"; import { - ReceiverSelection, ReceiverSelectionActionType, ReceiverSelectorMediaType -} from "./receiverSelector"; +} from "../types"; -import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager"; -import CastManager from "../cast/CastManager"; +import { ReceiverSelection } from "./ReceiverSelector"; + +import selectorManager from "./selectorManager"; +import castManager from "./castManager"; const _ = browser.i18n.getMessage; @@ -142,7 +142,7 @@ async function onMenuClicked( let selection: Nullable = null; try { - selection = await ReceiverSelectorManager.getSelection( + selection = await selectorManager.getSelection( tab.id, info.frameId, { withMediaSender: castMediaMenuClicked } @@ -160,7 +160,7 @@ async function onMenuClicked( } if (castMenuClicked) { - CastManager.loadSender({ + castManager.loadSender({ tabId: tab.id, frameId: info.frameId, selection @@ -187,7 +187,7 @@ async function onMenuClicked( }); } else { // Handle other responses - CastManager.loadSender({ + castManager.loadSender({ tabId: tab.id, frameId: info.frameId, selection diff --git a/ext/src/background/receiverSelector/index.ts b/ext/src/background/receiverSelector/index.ts deleted file mode 100644 index 441377c..0000000 --- a/ext/src/background/receiverSelector/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; - -import { ReceiverDevice } from "../../types"; - -export enum ReceiverSelectorMediaType { - None = 0, - App = 1, - Tab = 2, - Screen = 4, - File = 8 -} - -export enum ReceiverSelectionActionType { - Cast = 1, - Stop = 2 -} - -export interface ReceiverSelectionCast { - actionType: ReceiverSelectionActionType.Cast; - receiverDevice: ReceiverDevice; - mediaType: ReceiverSelectorMediaType; - filePath?: string; -} -export interface ReceiverSelectionStop { - actionType: ReceiverSelectionActionType.Stop; - receiverDevice: ReceiverDevice; -} - -export type ReceiverSelection = ReceiverSelectionCast | ReceiverSelectionStop; diff --git a/ext/src/background/receiverSelector/ReceiverSelectorManager.ts b/ext/src/background/selectorManager.ts similarity index 83% rename from ext/src/background/receiverSelector/ReceiverSelectorManager.ts rename to ext/src/background/selectorManager.ts index dde986f..25b001d 100644 --- a/ext/src/background/receiverSelector/ReceiverSelectorManager.ts +++ b/ext/src/background/selectorManager.ts @@ -1,23 +1,24 @@ "use strict"; -import options from "../../lib/options"; -import logger from "../../lib/logger"; +import options from "../lib/options"; +import logger from "../lib/logger"; -import CastManager from "../../cast/CastManager"; -import { SessionRequest } from "../../cast/sdk/classes"; -import receiverDevices from "../receiverDevices"; +import { getMediaTypesForPageUrl } from "../lib/utils"; +import { SessionRequest } from "../cast/sdk/classes"; -import { getMediaTypesForPageUrl } from "../../lib/utils"; +import castManager from "./castManager"; +import deviceManager from "./deviceManager"; + +import ReceiverSelector, { + ReceiverSelection, + ReceiverSelectionCast, + ReceiverSelectionStop +} from "./ReceiverSelector"; import { - ReceiverSelection, ReceiverSelectionActionType, - ReceiverSelectionCast, - ReceiverSelectionStop, ReceiverSelectorMediaType -} from "./index"; - -import ReceiverSelector from "./ReceiverSelector"; +} from "../types"; let sharedSelector: ReceiverSelector; async function getSelector() { @@ -46,12 +47,12 @@ async function getSelection( contextTabId: number, contextFrameId = 0, selectionOpts?: { - sessionRequest: SessionRequest; + sessionRequest?: SessionRequest; withMediaSender?: boolean; } ): Promise { return new Promise(async (resolve, reject) => { - let castInstance = CastManager.getInstance( + let castInstance = castManager.getInstance( contextTabId, contextFrameId ); @@ -112,15 +113,12 @@ async function getSelection( sharedSelector = new ReceiverSelector(); function onReceiverChange() { - sharedSelector.update(receiverDevices.getDevices()); + sharedSelector.update(deviceManager.getDevices()); } - receiverDevices.addEventListener("receiverDeviceUp", onReceiverChange); - receiverDevices.addEventListener( - "receiverDeviceDown", - onReceiverChange - ); - receiverDevices.addEventListener( + deviceManager.addEventListener("receiverDeviceUp", onReceiverChange); + deviceManager.addEventListener("receiverDeviceDown", onReceiverChange); + deviceManager.addEventListener( "receiverDeviceUpdated", onReceiverChange ); @@ -139,7 +137,7 @@ async function getSelection( function onSelectorStop(ev: CustomEvent) { logger.info("Stopping receiver app...", ev.detail); - receiverDevices.stopReceiverApp(ev.detail.receiverDevice.id); + deviceManager.stopReceiverApp(ev.detail.receiverDevice.id); removeListeners(); resolve({ @@ -172,25 +170,25 @@ async function getSelection( ); sharedSelector.removeEventListener("error", onSelectorError); - receiverDevices.removeEventListener( + deviceManager.removeEventListener( "receiverDeviceUp", onReceiverChange ); - receiverDevices.removeEventListener( + deviceManager.removeEventListener( "receiverDeviceDown", onReceiverChange ); - receiverDevices.removeEventListener( + deviceManager.removeEventListener( "receiverDeviceUpdated", onReceiverChange ); } // Ensure status manager is initialized - await receiverDevices.init(); + await deviceManager.init(); sharedSelector.open({ - receiverDevices: receiverDevices.getDevices(), + receiverDevices: deviceManager.getDevices(), defaultMediaType, availableMediaTypes, appId: castInstance?.appId, diff --git a/ext/src/cast/content.ts b/ext/src/cast/content.ts index 650bc99..98b2110 100644 --- a/ext/src/cast/content.ts +++ b/ext/src/cast/content.ts @@ -32,7 +32,7 @@ Reflect.defineProperty(HTMLScriptElement.prototype.wrappedJSObject, "src", { enumerable: true, get: desc?.get, - set: exportFunction(function setFunc(this: HTMLScriptElement, value) { + set: exportFunction(function (this: HTMLScriptElement, value: string) { if (CAST_SCRIPT_URLS.includes(value)) { return desc?.set?.call(this, CAST_LOADER_SCRIPT_URL); } diff --git a/ext/src/cast/export.ts b/ext/src/cast/export.ts index 171f1ea..c5895cc 100644 --- a/ext/src/cast/export.ts +++ b/ext/src/cast/export.ts @@ -48,11 +48,13 @@ export function ensureInit(): Promise> { * URL. */ if (window.location.protocol === "moz-extension:") { - const { default: CastManager } = await import("./CastManager"); + const { default: castManager } = await import( + "../background/castManager" + ); // port2 will post bridge messages to port 1 - await CastManager.init(); - await CastManager.createInstance(channel.port2); + await castManager.init(); + await castManager.createInstance(channel.port2); // bridge -> cast instance channel.port1.onmessage = ev => { diff --git a/ext/src/cast/sdk/index.ts b/ext/src/cast/sdk/index.ts index 803ac3d..478634d 100644 --- a/ext/src/cast/sdk/index.ts +++ b/ext/src/cast/sdk/index.ts @@ -2,10 +2,7 @@ import logger from "../../lib/logger"; -import { - ReceiverDevice, - ReceiverDeviceCapabilities as ReceiverDeviceCapabilities -} from "../../types"; +import { ReceiverDevice, ReceiverDeviceCapabilities } from "../../types"; import { ErrorCallback, SuccessCallback } from "../types"; import eventMessaging from "../eventMessaging"; diff --git a/ext/src/cast/senders/mirroring.ts b/ext/src/cast/senders/mirroring.ts index 23cf3b1..a9f2e23 100644 --- a/ext/src/cast/senders/mirroring.ts +++ b/ext/src/cast/senders/mirroring.ts @@ -3,8 +3,7 @@ import options from "../../lib/options"; import cast, { ensureInit } from "../export"; -import { ReceiverSelectorMediaType } from "../../background/receiverSelector"; -import { ReceiverDevice } from "../../types"; +import { ReceiverDevice, ReceiverSelectorMediaType } from "../../types"; import type Session from "../sdk/Session"; diff --git a/ext/src/lib/utils.ts b/ext/src/lib/utils.ts index 39c3993..0cfde5d 100644 --- a/ext/src/lib/utils.ts +++ b/ext/src/lib/utils.ts @@ -1,6 +1,6 @@ "use strict"; -import { ReceiverSelectorMediaType } from "../background/receiverSelector"; +import { ReceiverSelectorMediaType } from "../types"; export function getNextEllipsis(ellipsis: string): string { if (ellipsis === "") return "."; diff --git a/ext/src/messaging.ts b/ext/src/messaging.ts index 66c5ada..7429b12 100644 --- a/ext/src/messaging.ts +++ b/ext/src/messaging.ts @@ -3,7 +3,6 @@ import { TypedPort } from "./lib/TypedPort"; import { BridgeInfo } from "./lib/bridge"; -import { ReceiverSelectorMediaType } from "./background/receiverSelector"; import { ReceiverSelection, ReceiverSelectionCast, @@ -19,7 +18,7 @@ import { } from "./cast/sdk/types"; import { SessionRequest } from "./cast/sdk/classes"; -import { ReceiverDevice } from "./types"; +import { ReceiverDevice, ReceiverSelectorMediaType } from "./types"; /** * Messages are JSON objects with a `subject` string key and a diff --git a/ext/src/types.ts b/ext/src/types.ts index f4f4d01..21695fa 100644 --- a/ext/src/types.ts +++ b/ext/src/types.ts @@ -20,3 +20,15 @@ export interface ReceiverDevice { port: number; status?: ReceiverStatus; } + +export enum ReceiverSelectorMediaType { + None = 0, + App = 1, + Tab = 2, + Screen = 4, + File = 8 +} +export enum ReceiverSelectionActionType { + Cast = 1, + Stop = 2 +} diff --git a/ext/src/ui/popup/index.tsx b/ext/src/ui/popup/index.tsx index 0a5f324..cc1dc7b 100755 --- a/ext/src/ui/popup/index.tsx +++ b/ext/src/ui/popup/index.tsx @@ -11,14 +11,15 @@ import messaging, { Message, Port } from "../../messaging"; import { getNextEllipsis } from "../../lib/utils"; import { RemoteMatchPattern } from "../../lib/matchPattern"; -import { ReceiverDevice, ReceiverDeviceCapabilities } from "../../types"; -import { Capability } from "../../cast/sdk/enums"; - import { + ReceiverDevice, + ReceiverDeviceCapabilities, ReceiverSelectionActionType, ReceiverSelectorMediaType -} from "../../background/receiverSelector"; -import { PageInfo } from "../../background/receiverSelector/ReceiverSelector"; +} from "../../types"; + +import { ReceiverSelectorPageInfo } from "../../background/ReceiverSelector"; +import { Capability } from "../../cast/sdk/enums"; const _ = browser.i18n.getMessage; @@ -73,7 +74,7 @@ interface PopupAppState { filePath?: string; appId?: string; - pageInfo?: PageInfo; + pageInfo?: ReceiverSelectorPageInfo; mirroringEnabled: boolean; userAgentWhitelistEnabled: boolean; @@ -405,7 +406,10 @@ class PopupApp extends Component { ); } - private async onAddToWhitelist(app: KnownApp, pageInfo: PageInfo) { + private async onAddToWhitelist( + app: KnownApp, + pageInfo: ReceiverSelectorPageInfo + ) { if (!app.matches) { return; }