From 321e8d6ce3e1d6fd0ebaeb887acd19e8fee19646 Mon Sep 17 00:00:00 2001 From: hensm Date: Tue, 2 Jul 2019 05:11:57 +0100 Subject: [PATCH] Partial selector media type handling --- ext/src/main.ts | 97 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 31 deletions(-) diff --git a/ext/src/main.ts b/ext/src/main.ts index 078a39a..eef2ad2 100755 --- a/ext/src/main.ts +++ b/ext/src/main.ts @@ -417,6 +417,28 @@ let mirrorCastTabId: number; let mirrorCastFrameId: number; +async function loadMirrorCastSender ( + tabId: number + , frameId: number + , selectedMedia: ReceiverSelectorMediaType) { + + mirrorCastTabId = tabId; + mirrorCastFrameId = frameId; + + await browser.tabs.executeScript(tabId, { + code: ` + window.selectedMedia = ${selectedMedia}; + ` + , frameId + }); + + await browser.tabs.executeScript(tabId, { + file: "senders/mirroringCast.js" + , frameId + }); +} + + browser.menus.onClicked.addListener(async (info, tab) => { if (info.menuItemId === mirrorCastMenuId || info.menuItemId === mediaCastMenuId) { @@ -425,25 +447,9 @@ browser.menus.onClicked.addListener(async (info, tab) => { switch (info.menuItemId) { case mirrorCastMenuId: { - mirrorCastTabId = tab.id; - mirrorCastFrameId = frameId; - - await browser.tabs.executeScript(tab.id, { - code: ` - window.selectedMedia = ${info.pageUrl - ? ReceiverSelectorMediaType.Tab - : ReceiverSelectorMediaType.Screen}; - ` - , frameId - }); - - // Load mirroring sender app - await browser.tabs.executeScript(tab.id, { - file: "senders/mirroringCast.js" - , frameId - }); - - break; + await loadMirrorCastSender(tab.id, frameId, info.pageUrl + ? ReceiverSelectorMediaType.Tab + : ReceiverSelectorMediaType.Screen); } case mediaCastMenuId: { @@ -621,6 +627,16 @@ async function onConnectShim (port: browser.runtime.Port) { return; } + const tabId = port.sender.tab.id; + const frameId = port.sender.frameId; + const shimId = `${tabId}:${frameId}`; + + // Disconnect existing shim + if (shimMap.has(shimId)) { + shimMap.get(shimId).port.disconnect(); + shimMap.delete(shimId); + } + const { os } = await browser.runtime.getPlatformInfo(); @@ -628,9 +644,38 @@ async function onConnectShim (port: browser.runtime.Port) { ? ReceiverSelectorType.NativeMac : ReceiverSelectorType.Popup); + + // Media type for initial opener sender + let openerMediaType: ReceiverSelectorMediaType; + function onReceiverSelectorSelected ( ev: ReceiverSelectorSelectedEvent) { + /** + * If the media type returned from the selector has been + * changed, we need to cancel the current sender and switch + * it out for the right one. + * + * TODO: Seamlessly connect selector to the new sender + */ + if (ev.detail.mediaType !== openerMediaType) { + onReceiverSelectorCancelled(); + + switch (ev.detail.mediaType) { + case ReceiverSelectorMediaType.App: { + // TODO: Keep track of page apps + break; + } + + case ReceiverSelectorMediaType.Screen: + case ReceiverSelectorMediaType.Tab: { + loadMirrorCastSender(tabId, frameId, ev.detail.mediaType); + break; + } + } + } + + port.postMessage({ subject: "shim:/selectReceiverEnd" , data: ev.detail @@ -667,17 +712,6 @@ async function onConnectShim (port: browser.runtime.Port) { }); - const tabId = port.sender.tab.id; - const frameId = port.sender.frameId; - const shimId = `${tabId}:${frameId}`; - - // Disconnect existing shim - if (shimMap.has(shimId)) { - shimMap.get(shimId).port.disconnect(); - shimMap.delete(shimId); - } - - const applicationName = await options.get("bridgeApplicationName"); // Spawn bridge app instance @@ -744,9 +778,10 @@ async function onConnectShim (port: browser.runtime.Port) { } case "main:/selectReceiverBegin": { + openerMediaType = message.data.defaultMediaType; receiverSelector.open( Array.from(statusBridgeReceivers.values()) - , message.data.defaultMediaType); + , openerMediaType); break; }