const internals = {
- isInCallState: false,
+ promisesSupported: !!(window.browser),
+ port: null,
icons: {
call: {
return internals.joinAudioCall();
},
- async joinAudioCall() {
+ onConnect(port) {
- internals.isInCallState = true;
- internals.setIcon('hangUp');
- const tabs = await browser.tabs.query({
- currentWindow: true,
- active: true
+ internals.port = port;
+ port.onDisconnect.addListener(internals.onDisconnect);
+ port.onMessage.addListener(internals.onMessage);
+ port.postMessage({
+ action: 'joinAudioCall',
+ data: {
+ 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.port = null;
+ internals.getRoot().browserAction.enable();
},
- createAudioElement(source) {
+ async joinAudioCall() {
+
+ internals.getRoot().browserAction.disable();
+ const activeTabs = await internals.getActiveTabs();
- const audioElement = document.createElement('audio');
- audioElement.src = source;
- audioElement.autoplay = 'autoplay';
- document.querySelector('body').appendChild(audioElement);
+ const execution = await internals.getRoot().tabs.executeScript(activeTabs[0].id, {
+ file: '/content_script.js'
+ });
+
+ if (!execution || !execution[0]) {
+ internals.onDisconnect();
+ }
+ }
+ ,
+
+ hangUp() {
+
+ 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);