diff --git a/manifest.json b/manifest.json index f758fd91..149d45f3 100644 --- a/manifest.json +++ b/manifest.json @@ -47,7 +47,7 @@ "https://sponsor.ajay.app/*" ], "optional_permissions": [ - "https://*/*", + "*://*/*", "declarativeContent" ], "browser_action": { diff --git a/options/options.js b/options/options.js index 2424bae6..f4ace839 100644 --- a/options/options.js +++ b/options/options.js @@ -1,5 +1,10 @@ window.addEventListener('DOMContentLoaded', init); +var invidiousInstancesRegex = []; +for (const url of supportedInvidiousInstances) { + invidiousInstancesRegex.push("*://*." + url + "/*"); +} + async function init() { localizeHtmlPage(); @@ -65,7 +70,7 @@ async function init() { } // Don't wait on chrome - if (typeof(browser) == "undefined") { + if (isFirefox()) { await wait(() => checksLeft == 0, 1000, 50); } @@ -80,9 +85,12 @@ async function init() { * @param {string} option */ function invidiousInit(checkbox, option) { + let permissions = ["declarativeContent"]; + if (isFirefox()) permissions = []; + chrome.permissions.contains({ - origins: ["https://*.invidio.us/*", "https://*.invidiou.sh/*"], - permissions: ["declarativeContent"] + origins: invidiousInstancesRegex, + permissions: permissions }, function (result) { if (result != checkbox.checked) { setOptionValue(option, result); @@ -101,43 +109,66 @@ function invidiousInit(checkbox, option) { function invidiousOnClick(checkbox, option) { if (checkbox.checked) { // Request permission + let permissions = ["declarativeContent"]; + if (isFirefox()) permissions = []; + chrome.permissions.request({ - origins: ["https://*.invidio.us/*", "https://*.invidiou.sh/*"], - permissions: ["declarativeContent"] - }, function (granted) { + origins: invidiousInstancesRegex, + permissions: permissions + }, async function (granted) { if (granted) { - chrome.declarativeContent.onPageChanged.removeRules(["invidious"], function() { - // Add page rule - let rule = { - id: "invidious", - conditions: [ - new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { urlMatches: "https://*.invidio.us/*" } - }), - new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { urlMatches: "https://*.invidiou.sh/*" } - }) - ], - actions: [new chrome.declarativeContent.RequestContentScript({ - allFrames: true, - js: [ - "config.js", - "utils/previewBar.js", - "utils/skipNotice.js", - "utils.js", - "content.js", - "popup.js" - ], - css: [ - "content.css", - "./libs/Source+Sans+Pro.css", - "popup.css" - ] - })] - }; - - chrome.declarativeContent.onPageChanged.addRules([rule]); - }); + let js = [ + "config.js", + "utils/previewBar.js", + "utils/skipNotice.js", + "utils.js", + "content.js", + "popup.js" + ]; + let css = [ + "content.css", + "./libs/Source+Sans+Pro.css", + "popup.css" + ]; + + if (isFirefox()) { + let firefoxJS = []; + for (const file of js) { + firefoxJS.push({file}); + } + let firefoxCSS = []; + for (const file of css) { + firefoxCSS.push({file}); + } + + let registration = await browser.contentScripts.register({ + allFrames: true, + js: firefoxJS, + css: firefoxCSS, + matches: invidiousInstancesRegex + }); + } else { + chrome.declarativeContent.onPageChanged.removeRules(["invidious"], function() { + let conditions = []; + for (const regex of invidiousInstancesRegex) { + conditions.push(new chrome.declarativeContent.PageStateMatcher({ + pageUrl: { urlMatches: regex } + })); + } + // Add page rule + let rule = { + id: "invidious", + conditions, + actions: [new chrome.declarativeContent.RequestContentScript({ + allFrames: true, + js, + css + })] + }; + + chrome.declarativeContent.onPageChanged.addRules([rule]); + }); + } } else { setOptionValue(option, false); checkbox.checked = false; @@ -146,9 +177,14 @@ function invidiousOnClick(checkbox, option) { } }); } else { - chrome.declarativeContent.onPageChanged.removeRules(["invidious"]); + if (isFirefox()) { + // Nothing for now + } else { + chrome.declarativeContent.onPageChanged.removeRules(["invidious"]); + } + chrome.permissions.remove({ - origins: ["https://*.invidio.us/*"] + origins: invidiousInstancesRegex }); } } diff --git a/utils.js b/utils.js index abd8c65a..7b680efb 100644 --- a/utils.js +++ b/utils.js @@ -1,5 +1,5 @@ var onInvidious = false; -var supportedInvidiousInstances = ["invidio.us", "invidiou.sh"]; +var supportedInvidiousInstances = ["invidio.us", "invidiou.sh", "invidious.snopyta.org"]; // Function that can be used to wait for a condition before returning async function wait(condition, timeout = 5000, check = 100) { @@ -125,3 +125,10 @@ function getErrorMessage(statusCode) { return errorMessage; } + +/** + * Is this Firefox (web-extensions) + */ +function isFirefox() { + return typeof(browser) !== "undefined"; +}