iframe manager
This commit is contained in:
parent
3e542871c6
commit
e7dd85420c
105
src/ext/lib/video-data/IframeManager.ts
Normal file
105
src/ext/lib/video-data/IframeManager.ts
Normal file
@ -0,0 +1,105 @@
|
||||
import EventBus from '../EventBus';
|
||||
|
||||
|
||||
export type IframeData = {
|
||||
// internal data for comms
|
||||
tabId: string;
|
||||
frameId: string;
|
||||
|
||||
// data for UI
|
||||
tag?: string;
|
||||
host?: string;
|
||||
|
||||
// other data
|
||||
hasVideo?: boolean;
|
||||
hasDrm?: boolean;
|
||||
isPlaying?: boolean;
|
||||
isBigEnough?: boolean; // 🎶🎶 🎵 🎵 🎶 🎶 AAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHH AAAAAAAAIIIAAAAAIIAAAAAAIAAAAAAAAA
|
||||
}
|
||||
|
||||
export type IframeManagerConfiguration = {
|
||||
isIframe: boolean
|
||||
eventBus: EventBus,
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages list of iframes for the current tab.
|
||||
*/
|
||||
export default class IframeManager {
|
||||
isIframe: boolean;
|
||||
private iframeList: IframeData[] = [];
|
||||
private
|
||||
eventBus: EventBus;
|
||||
|
||||
constructor(config: IframeManagerConfiguration) {
|
||||
this.eventBus = config.eventBus;
|
||||
this.isIframe = config.isIframe;
|
||||
|
||||
if (this.isIframe) {
|
||||
window.addEventListener('beforeunload', this.destroy);
|
||||
this.eventBus.subscribe(
|
||||
'uw-frame-ping', {function: (cmd, context) => this.handleIframePing(context)}
|
||||
);
|
||||
this.eventBus.send(
|
||||
'uw-frame-register', {host: window.location.hostname}, {comms: {forwardTo: 'all-frames'}}
|
||||
);
|
||||
} else {
|
||||
this.eventBus.subscribe(
|
||||
'uw-frame-register', {function: (data, context) => this.handleIframeRegister(data, context)}
|
||||
);
|
||||
this.eventBus.subscribe(
|
||||
'uw-frame-destroyed', {function: (cmd, context) => this.handleFrameDestroyed(context)}
|
||||
);
|
||||
|
||||
// register all frames to re-register themselves
|
||||
this.eventBus.send(
|
||||
'uw-frame-ping', {}, {comms: {forwardTo: 'all-frames'}}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private destroy() {
|
||||
this.eventBus.send(
|
||||
'uw-frame-destroyed',
|
||||
{},
|
||||
{
|
||||
comms: {
|
||||
forwardTo: 'all-frames'
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
private handleIframePing(context) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles registration of iframes. If iframe with a given frameId exists, we update the existing frame.
|
||||
* @param data
|
||||
* @param context
|
||||
*/
|
||||
private handleIframeRegister(data, context) {
|
||||
const existingIndex = this.iframeList.findIndex(x => x.frameId === context.comms.sourceFrame.frameId);
|
||||
|
||||
if (existingIndex !== -1) {
|
||||
this.iframeList[existingIndex] = {
|
||||
...this.iframeList[existingIndex],
|
||||
...data
|
||||
}
|
||||
} else {
|
||||
this.iframeList.push({
|
||||
...data,
|
||||
...context.comms.sourceFrame
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private handleFrameDestroyed(context) {
|
||||
// tab IDs should be the same for all items, making frameId sufficiently unique to filter stuff
|
||||
this.iframeList = this.iframeList.filter(x => x.frameId !== context.comms.sourceFrame.frameId);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user