mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-12 18:39:58 +00:00
Re-use open popup when requesting a new session
This commit is contained in:
@@ -364,14 +364,16 @@ function initBridge (tabId, frameId) {
|
|||||||
|
|
||||||
|
|
||||||
let popupTabId;
|
let popupTabId;
|
||||||
|
let popupWinId;
|
||||||
let popupOpenerTabId;
|
let popupOpenerTabId;
|
||||||
|
let popupOpenerFrameId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates popup window for cast destination selection.
|
* Creates popup window for cast destination selection.
|
||||||
* Refocusing other browser windows causes the popup window
|
* Refocusing other browser windows causes the popup window
|
||||||
* to close and returns an API error (TODO).
|
* to close and returns an API error (TODO).
|
||||||
*/
|
*/
|
||||||
async function openPopup (tabId) {
|
async function openPopup (tabId, frameId) {
|
||||||
const width = 350;
|
const width = 350;
|
||||||
const height = 200;
|
const height = 200;
|
||||||
|
|
||||||
@@ -396,7 +398,9 @@ async function openPopup (tabId) {
|
|||||||
|
|
||||||
// Store popup details for message forwarding
|
// Store popup details for message forwarding
|
||||||
popupTabId = popup.tabs[0].id;
|
popupTabId = popup.tabs[0].id;
|
||||||
|
popupWinId = popup.id;
|
||||||
popupOpenerTabId = tabId;
|
popupOpenerTabId = tabId;
|
||||||
|
popupOpenerFrameId = frameId;
|
||||||
|
|
||||||
// Size/position not set correctly on creation (bug?)
|
// Size/position not set correctly on creation (bug?)
|
||||||
await browser.windows.update(popup.id, {
|
await browser.windows.update(popup.id, {
|
||||||
@@ -416,6 +420,20 @@ async function openPopup (tabId) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Track popup close
|
||||||
|
browser.windows.onRemoved.addListener(id => {
|
||||||
|
if (id === popupWinId) {
|
||||||
|
messageRouter.handleMessage({
|
||||||
|
subject: "shim:popupClosed"
|
||||||
|
});
|
||||||
|
|
||||||
|
popupTabId = null;
|
||||||
|
popupWinId = null;
|
||||||
|
popupOpenerTabId = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
messageRouter.register("main", async (message, sender) => {
|
messageRouter.register("main", async (message, sender) => {
|
||||||
const tabId = sender && sender.tab.id;
|
const tabId = sender && sender.tab.id;
|
||||||
@@ -424,19 +442,36 @@ messageRouter.register("main", async (message, sender) => {
|
|||||||
case "main:initialize": {
|
case "main:initialize": {
|
||||||
const bridgeInfo = await getBridgeInfo();
|
const bridgeInfo = await getBridgeInfo();
|
||||||
if (bridgeInfo && bridgeInfo.isVersionCompatible) {
|
if (bridgeInfo && bridgeInfo.isVersionCompatible) {
|
||||||
initBridge(tabId, sender.tab.frameId);
|
initBridge(tabId, sender.frameId);
|
||||||
}
|
}
|
||||||
|
|
||||||
browser.tabs.sendMessage(sender.tab.id, {
|
browser.tabs.sendMessage(sender.tab.id, {
|
||||||
subject: "shim:initialized"
|
subject: "shim:initialized"
|
||||||
, data: bridgeInfo
|
, data: bridgeInfo
|
||||||
}, { frameId: sender.tab.frameId });
|
}, { frameId: sender.frameId });
|
||||||
|
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
case "main:openPopup": {
|
case "main:openPopup": {
|
||||||
await openPopup(tabId);
|
// If popup already open, reassign opener tab to new shim
|
||||||
|
if (popupWinId) {
|
||||||
|
|
||||||
|
// Notify shim that existing popup is gone
|
||||||
|
messageRouter.handleMessage({
|
||||||
|
subject: "shim:popupClosed"
|
||||||
|
});
|
||||||
|
|
||||||
|
popupOpenerTabId = tabId;
|
||||||
|
popupOpenerFrameId = sender.frameId;
|
||||||
|
|
||||||
|
// Notify shim to re-populate receiver list
|
||||||
|
messageRouter.handleMessage({
|
||||||
|
subject: "shim:popupReady"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
await openPopup(tabId, sender.frameId);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -449,7 +484,7 @@ messageRouter.register("bridge", (message, sender) => {
|
|||||||
|
|
||||||
messageRouter.register("shim", (message, sender) => {
|
messageRouter.register("shim", (message, sender) => {
|
||||||
browser.tabs.sendMessage(popupOpenerTabId, message
|
browser.tabs.sendMessage(popupOpenerTabId, message
|
||||||
, { frameId: sender.tab.frameId });
|
, { frameId: popupOpenerFrameId })
|
||||||
});
|
});
|
||||||
|
|
||||||
messageRouter.register("popup", (message, sender) => {
|
messageRouter.register("popup", (message, sender) => {
|
||||||
|
|||||||
@@ -126,12 +126,21 @@ cast.requestSession = (
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Already requesting session
|
||||||
|
if (state.sessionRequestInProgress) {
|
||||||
|
errorCallback(new Error_(ErrorCode.INVALID_PARAMETER
|
||||||
|
, "Session request already in progress."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// No available receivers
|
// No available receivers
|
||||||
if (!state.receiverList.length) {
|
if (!state.receiverList.length) {
|
||||||
errorCallback(new Error_(ErrorCode.RECEIVER_UNAVAILABLE));
|
errorCallback(new Error_(ErrorCode.RECEIVER_UNAVAILABLE));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.sessionRequestInProgress = true;
|
||||||
|
|
||||||
sessionSuccessCallback = successCallback;
|
sessionSuccessCallback = successCallback;
|
||||||
sessionErrorCallback = errorCallback;
|
sessionErrorCallback = errorCallback;
|
||||||
|
|
||||||
@@ -218,6 +227,7 @@ onMessage(message => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
state.apiConfig.sessionListener(session);
|
state.apiConfig.sessionListener(session);
|
||||||
|
state.sessionRequestInProgress = false;
|
||||||
sessionSuccessCallback(session, message.data.selectedMedia);
|
sessionSuccessCallback(session, message.data.selectedMedia);
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
@@ -256,6 +266,17 @@ onMessage(message => {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Popup closed before session established.
|
||||||
|
*/
|
||||||
|
case "shim:popupClosed": {
|
||||||
|
if (state.sessionRequestInProgress) {
|
||||||
|
state.sessionRequestInProgress = false;
|
||||||
|
sessionErrorCallback(new Error_(ErrorCode.CANCEL));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ const state = {
|
|||||||
apiConfig: null
|
apiConfig: null
|
||||||
, receiverList: []
|
, receiverList: []
|
||||||
, sessionList: []
|
, sessionList: []
|
||||||
|
, sessionRequestInProgress: false
|
||||||
};
|
};
|
||||||
|
|
||||||
export default state;
|
export default state;
|
||||||
|
|||||||
Reference in New Issue
Block a user