2020-12-03 01:35:22 +01:00
|
|
|
if (process.env.CHANNEL !== 'stable'){
|
|
|
|
console.info("Loading: UI");
|
|
|
|
}
|
|
|
|
|
2020-12-03 00:34:50 +01:00
|
|
|
class UI {
|
|
|
|
constructor(
|
|
|
|
interfaceId,
|
|
|
|
uiConfig, // {component, parentElement?}
|
|
|
|
) {
|
|
|
|
this.interfaceId = interfaceId;
|
2020-12-03 01:35:22 +01:00
|
|
|
this.uiConfig = uiConfig;
|
2022-03-21 00:50:54 +01:00
|
|
|
this.lastProbeResponseTs = null;
|
|
|
|
this.uiURI = browser.runtime.getURL('/csui/csui.html');
|
|
|
|
this.extensionBase = browser.runtime.getURL('').replace(/\/$/, "");
|
2020-12-03 01:35:22 +01:00
|
|
|
|
2022-03-20 20:40:11 +01:00
|
|
|
console.log('init init');
|
|
|
|
|
2020-12-03 01:35:22 +01:00
|
|
|
this.init();
|
2020-12-03 00:34:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
async init() {
|
|
|
|
const random = Math.round(Math.random() * 69420);
|
2022-01-07 00:50:58 +01:00
|
|
|
const uwid = `uw-ultrawidify-${this.interfaceId}-root-${random}`
|
2020-12-03 00:34:50 +01:00
|
|
|
|
|
|
|
const rootDiv = document.createElement('div');
|
|
|
|
|
2020-12-15 00:26:19 +01:00
|
|
|
if (this.uiConfig.additionalStyle) {
|
|
|
|
rootDiv.setAttribute('style', this.uiConfig.additionalStyle);
|
|
|
|
}
|
2020-12-05 03:30:43 +01:00
|
|
|
rootDiv.setAttribute('id', uwid);
|
2020-12-12 00:38:51 +01:00
|
|
|
rootDiv.classList.add('uw-ultrawidify-container-root');
|
2020-12-04 02:02:25 +01:00
|
|
|
|
|
|
|
if (this.uiConfig?.parentElement) {
|
2020-12-03 00:34:50 +01:00
|
|
|
this.uiConfig.parentElement.appendChild(rootDiv);
|
|
|
|
} else {
|
|
|
|
document.body.appendChild(rootDiv);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.element = rootDiv;
|
|
|
|
|
2022-03-21 00:50:54 +01:00
|
|
|
// in onMouseMove, we currently can't access this because we didn't
|
|
|
|
// do things the most properly
|
|
|
|
const uiURI = this.uiURI;
|
|
|
|
|
|
|
|
const iframe = document.createElement('iframe');
|
|
|
|
iframe.setAttribute('src', uiURI);
|
|
|
|
iframe.style.width = "100%";
|
|
|
|
iframe.style.height = "100%";
|
|
|
|
iframe.style.position = "absolute";
|
|
|
|
iframe.style.zIndex = "1000";
|
|
|
|
iframe.style.border = 0;
|
|
|
|
iframe.style.pointerEvents = 'none';
|
|
|
|
|
|
|
|
// so we have a problem: we want iframe to be clickthrough everywhere except
|
|
|
|
// on our actual overlay. There's no nice way of doing that, so we need some
|
|
|
|
// extra javascript to deal with this
|
|
|
|
|
|
|
|
iframe.onload = function() {
|
|
|
|
|
|
|
|
function onMouseMove(event) {
|
|
|
|
let coords;
|
|
|
|
if (event.currentTarget === document) {
|
|
|
|
coords = {
|
|
|
|
x: event.pageX - iframe.offsetLeft,
|
|
|
|
y: event.pageY - iframe.offsetTop
|
2022-03-20 20:40:11 +01:00
|
|
|
}
|
2022-03-21 00:50:54 +01:00
|
|
|
} else {
|
|
|
|
coords = {
|
|
|
|
x: event.clientX,
|
|
|
|
y: event.clientY
|
2022-03-20 20:40:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-21 00:50:54 +01:00
|
|
|
|
|
|
|
// ask the iframe to check whether there's a clickable element
|
|
|
|
iframe.contentWindow.postMessage(
|
|
|
|
{
|
|
|
|
cmd: 'uwui-probe',
|
|
|
|
coords,
|
|
|
|
ts: +new Date() // this should be accurate enough for our purposes
|
|
|
|
},
|
|
|
|
uiURI
|
|
|
|
);
|
|
|
|
|
|
|
|
// iframe.style.pointerEvents = isClickable ? 'auto' : 'none';
|
2022-03-20 20:40:11 +01:00
|
|
|
}
|
2022-01-07 00:50:58 +01:00
|
|
|
|
2022-03-21 00:50:54 +01:00
|
|
|
document.addEventListener('mousemove', onMouseMove, true);
|
2020-12-04 02:02:25 +01:00
|
|
|
}
|
2021-10-26 23:13:11 +02:00
|
|
|
|
2022-03-21 00:50:54 +01:00
|
|
|
rootDiv.appendChild(iframe);
|
|
|
|
|
|
|
|
// subscribe to events coming back to us
|
|
|
|
window.addEventListener('message', (event) => this.handleMessage(event));
|
|
|
|
|
|
|
|
// set uiIframe for handleMessage
|
|
|
|
this.uiIframe = iframe;
|
2022-03-20 20:40:11 +01:00
|
|
|
}
|
2022-03-21 00:50:54 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles events received from the iframe.
|
|
|
|
* @param {*} event
|
|
|
|
*/
|
|
|
|
handleMessage(event) {
|
|
|
|
console.log('[main] received event:', event.origin, this.uiURI, this.extensionBase, event)
|
|
|
|
if (event.origin === this.extensionBase) {
|
2022-03-22 01:21:18 +01:00
|
|
|
if (event.data.action === 'uwui-clickable') {
|
2022-03-21 00:50:54 +01:00
|
|
|
if (event.data.cmd === 'uwui-clickable') {
|
|
|
|
if (event.data.ts < this.lastProbeResponseTs) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.lastProbeResponseTs = event.data.ts;
|
|
|
|
this.uiIframe.style.pointerEvents = event.data.clickable ? 'auto' : 'none';
|
|
|
|
}
|
|
|
|
}
|
2020-12-03 00:34:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Replaces ui config and re-inits the UI
|
2021-10-22 00:30:36 +02:00
|
|
|
* @param {*} newUiConfig
|
2020-12-03 00:34:50 +01:00
|
|
|
*/
|
|
|
|
replace(newUiConfig) {
|
|
|
|
this.element?.remove();
|
|
|
|
this.uiConfig = newUiConfig;
|
2022-01-07 00:50:58 +01:00
|
|
|
this.init();
|
2020-12-03 00:34:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
destroy() {
|
2020-12-04 02:02:25 +01:00
|
|
|
// this.comms?.destroy();
|
2020-12-03 00:34:50 +01:00
|
|
|
this.element?.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-03 01:35:22 +01:00
|
|
|
if (process.env.CHANNEL !== 'stable'){
|
|
|
|
console.info("UI.js loaded");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-12-03 01:16:57 +01:00
|
|
|
export default UI;
|