From bee854dd003d08bb2d59cfaa17faeb1ad4ee4211 Mon Sep 17 00:00:00 2001 From: Gerben Date: Sat, 19 Oct 2019 17:17:54 +0530 Subject: [PATCH] Make work more reliably in Firefox --- app/scripts/background.js | 39 +++++++++++++++++++++++++++++++-------- package-lock.json | 5 +++++ package.json | 1 + 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index 93e5535..7633c3f 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -1,21 +1,44 @@ +import delay from 'delay'; + +async function tryUntilItWorks(func, delayBetweenTries = 1, maxTries = 10) { + for (let i = 0; i < maxTries; i++) { + try { + await func(); + return; + } catch (err) { + await delay(delayBetweenTries); + continue; + } + } +} + async function onHeadersReceived({ responseHeaders, url, tabId }) { const isAudio = responseHeaders.some(header => header.name === 'Content-Type' && header.value.startsWith('audio/') ); if (isAudio) { - browser.tabs.executeScript(tabId, { - runAt: 'document_end', - file: '/scripts/contentscript.js', - }); - browser.tabs.insertCSS(tabId, { + // Avoid any short glitch of sound (observed in Firefox) before our injected script executes. + await browser.tabs.update(tabId, { muted: true }); + + // Too quickly executing the script may fail (bug in Firefox), so we retry if necessary. + await tryUntilItWorks(() => browser.tabs.executeScript(tabId, { + runAt: 'document_end', + file: '/scripts/contentscript.js', + })); + + // Unmute again. + await browser.tabs.update(tabId, { muted: false }); + + await tryUntilItWorks(() => browser.tabs.insertCSS(tabId, { runAt: 'document_end', file: '/assets/main.css', - }); - browser.tabs.insertCSS(tabId, { + })); + + await tryUntilItWorks(() => browser.tabs.insertCSS(tabId, { runAt: 'document_end', file: '/assets/waveform-playlist.css', - }); + })); } } diff --git a/package-lock.json b/package-lock.json index 8a5af7c..c4ff48b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1957,6 +1957,11 @@ } } }, + "delay": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-4.3.0.tgz", + "integrity": "sha512-Lwaf3zVFDMBop1yDuFZ19F9WyGcZcGacsbdlZtWjQmM50tOcMntm1njF/Nb/Vjij3KaSvCF+sEYGKrrjObu2NA==" + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", diff --git a/package.json b/package.json index c35175e..95138db 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "webextension-toolbox": "latest" }, "dependencies": { + "delay": "^4.3.0", "waveform-playlist": "^3.0.4" } }