X-Git-Url: https://git.r.bdr.sh/rbdr/junction/blobdiff_plain/ac259c8645783dcb92fc0eafff166769f5216aa9..7ca06df84c95382b897491f7460009d8b3ddc2fe:/extension/junction.js diff --git a/extension/junction.js b/extension/junction.js index 7de7c28..2c32053 100644 --- a/extension/junction.js +++ b/extension/junction.js @@ -1,6 +1,8 @@ const internals = { - isInCallState: false, + promisesSupported: !!(window.browser), + port: null, + currentUrl: null, icons: { call: { @@ -22,43 +24,105 @@ const internals = { return internals.joinAudioCall(); }, - async joinAudioCall() { - - internals.isInCallState = true; - internals.setIcon('hangUp'); - const tabs = await browser.tabs.query({ - currentWindow: true, - active: true + onConnect(port) { + + internals.port = port; + port.onDisconnect.addListener(internals.onDisconnect); + port.onMessage.addListener(internals.onMessage); + port.postMessage({ + action: 'joinAudioCall', + data: { + currentUrl: internals.currentUrl, + tada: internals.getRoot().runtime.getURL('sounds/tada.wav') + } }); - - internals.createAudioElement(browser.runtime.getURL('sounds/tada.wav')); + internals.getRoot().browserAction.enable(); + internals.setIcon('hangUp'); }, - hangUp() { + onMessage(message) { + + if (message.action === 'error') { + internals.getRoot().browserAction.setBadgeText({ text: 'x' }, () => {}); + } + }, - document.querySelectorAll('audio').forEach((audioElement) => audioElement.remove()); + onDisconnect() { + internals.getRoot().browserAction.setBadgeText({ text: '' }, () => {}); internals.setIcon('call'); - internals.isInCallState = false; + internals.currentUrl = null; + internals.port = null; + internals.getRoot().browserAction.enable(); }, - createAudioElement(source) { + async joinAudioCall() { + + internals.getRoot().browserAction.disable(); + const activeTabs = await internals.getActiveTabs(); + + internals.currentUrl = activeTabs[0].url; + const execution = await internals.getRoot().tabs.executeScript(activeTabs[0].id, { + file: '/build/content_script.js' + }, () => { + + if (internals.getRoot().runtime.lastError) { + internals.onDisconnect(); + } + }); + + if (execution && !execution[0]) { + internals.onDisconnect(); + } + } + , + + hangUp() { - const audioElement = document.createElement('audio'); - audioElement.src = source; - audioElement.autoplay = 'autoplay'; - document.querySelector('body').appendChild(audioElement); + internals.getRoot().browserAction.disable(); + internals.port.postMessage({ + action: 'hangUp' + }); }, isInCall() { - return internals.isInCallState; // this should be replaced with actually checking the built stuff + + return !!(internals.port); }, setIcon(iconSet) { - browser.browserAction.setIcon({ + internals.getRoot().browserAction.setIcon({ path: internals.icons[iconSet] }); - } + }, + + getRoot() { + + return window.browser || window.chrome; + }, + + // Chrome doesn't yet implement the promise based tabs.query :'( + + getActiveTabs() { + + const query = { + currentWindow: true, + active: true + }; + + if (internals.promisesSupported) { + return internals.getRoot().tabs.query(query); + } + + return new Promise((resolve, reject) => { + + internals.getRoot().tabs.query(query, (tabs) => { + + return resolve(tabs); + }); + }); + }, }; -browser.browserAction.onClicked.addListener(internals.onClick); +internals.getRoot().browserAction.onClicked.addListener(internals.onClick); +internals.getRoot().runtime.onConnect.addListener(internals.onConnect);