diff --git a/extension/extension.js b/extension/extension.js --- a/extension/extension.js +++ b/extension/extension.js @@ -730,6 +730,10 @@ sendPortMessage("settings", "openKRunnerSettings"); }); +addRuntimeCallback("settings", "subsystemStatus", (message, sender, action, sendReply) => { + sendReply(subsystemStatus); +}); + chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { // TODO check sender for privilege diff --git a/extension/options.css b/extension/options.css --- a/extension/options.css +++ b/extension/options.css @@ -14,6 +14,10 @@ display: none; } +.not-supported { + display: none !important; +} + .tabbar { display: block; padding: 0; diff --git a/extension/options.js b/extension/options.js --- a/extension/options.js +++ b/extension/options.js @@ -79,6 +79,14 @@ }); } +function subsystemStatus() { + return new Promise((resolve, reject) => { + sendMessage("subsystemStatus", null, (reply) => { + resolve(reply); + }); + }); +} + function saveSettings(cb) { var settings = {}; @@ -158,6 +166,28 @@ mprisEx.disabled = !mpris.checked; }); + subsystemStatus().then((status) => { + document.querySelectorAll("[data-requires-extension]").forEach((item) => { + let requiredExtension = item.dataset.requiresExtension; + let requiredMinimumVersion = Number(item.dataset.requiresExtensionVersionMinimum); + + if (requiredExtension && !status.hasOwnProperty(requiredExtension)) { + console.log("Extension", requiredExtension, "is not supported by this version of the host"); + item.classList.add("not-supported", "by-host"); + return; // continue + } + + if (requiredMinimumVersion && !isNaN(requiredMinimumVersion)) { + let runningVersion = status[requiredExtension].version; + if (runningVersion < requiredMinimumVersion) { + console.log("Extension", requiredExtension, "of version", requiredMinimumVersion, "is required but only", runningVersion, "is present in the host"); + item.classList.add("not-supported", "by-host"); + return; // continue + } + } + }); + }); + // auto save when changing any setting // TODO can we do that on closing, or does it not matter how often we do chrome storage sync thing? document.querySelectorAll("input[type=checkbox]").forEach(function (item) {