shellfox/background.js
Jaidyn Ann a41b7a70cf Execute configured command for URL, on button-hit
Now we don’t run a hardcoded command when the
address-bar button is pressed, but the command
configured for that URL.

Also, we only enable the address-bar button for
tabs whose URL is matched by some command.
2024-02-28 18:37:13 -06:00

74 lines
1.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let port = browser.runtime.connectNative("shellfox");
// Return the command-string associated with a URL, if any.
function getUrlCommand(url) {
let matchCommand = undefined;
let matchRegex = "";
try {
let savedCommands = JSON.parse(localStorage.getItem("commands"));
for (regexCommandPair of savedCommands) {
let regex = regexCommandPair[0];
let match = url.match(regex);
let compared = compareRegexComplexity(matchRegex, regex);
console.log(matchRegex, "v", regex, "=", compared);
if (match && (compared == 0 || compared == 1)) {
matchCommand = regexCommandPair[1];
matchRegex = regex;
}
}
} catch {};
return matchCommand;
}
// Execute the shell command associated with the given URL, if any.
function runUrlCommand(url) {
console.log("Executing…");
let command = getUrlCommand(url);
if (command && port) {
port.postMessage(command);
}
}
// Compare two regular expressions, returning which one is more specific.
// Returns -1 if a is more specific, 1 if b is, and 0 if they are equal.
// Its a simple (and unreliable) algorithm, for now — purely based on length.
function compareRegexComplexity(a, b) {
if (a && ((a && !b) || (a.length > b.length)))
return -1;
else if (b && ((b && !a) || (a.length < b.length)))
return 1
return 0;
}
port.onDisconnect.addListener((port) => {
console.log(port.error);
port = undefined;
});
browser.pageAction.onClicked.addListener((tab) => {
console.log("onClicked");
runUrlCommand(tab.url);
});
browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
console.log("onUpdated");
if (getUrlCommand(tab.url))
browser.pageAction.show(tabId);
else
browser.pageAction.hide(tabId);
});
browser.tabs.onActivated.addListener((activeInfo) => {
console.log("activated");
let url = browser.tabs.get(activeInfo.tabId).url;
});