Files
2026-01-20 21:53:59 +03:30

77 lines
2.0 KiB
JavaScript

// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/commands/onCommand
// https://developer.chrome.com/docs/extensions/reference/commands/#event-onCommand
// Chrome commands returns command, tab
// https://bugzilla.mozilla.org/show_bug.cgi?id=1843866
// Add tab parameter to commands.onCommand (fixed in Firefox 126)
import {App} from './app.js';
import {Proxy} from './proxy.js';
import {OnRequest} from './on-request.js';
// ---------- Commands (Side Effect) ------------------------
class Commands {
static {
// commands is not supported on Android
browser.commands?.onCommand.addListener((...e) => this.process(...e));
}
static async process(name, tab) {
// firefox only Tab Proxy
const tabProxy = ['setTabProxy', 'unsetTabProxy'].includes(name);
if (!App.firefox && tabProxy) { return; }
const pref = await browser.storage.local.get();
// only Tab Proxy allowed for storage.managed
if (pref.managed && !tabProxy) { return; }
const host = pref.commands[name];
let proxy;
switch (name) {
case 'proxyByPatterns':
this.set(pref, 'pattern');
break;
case 'disable':
this.set(pref, 'disable');
break;
case 'setProxy':
host && this.set(pref, host);
break;
case 'includeHost':
case 'excludeHost':
if (!host) { break; }
proxy = this.findProxy(pref, host);
proxy && Proxy.includeHost(pref, proxy, tab, name);
break;
case 'setTabProxy':
if (!host) { break; }
proxy = this.findProxy(pref, host);
proxy && OnRequest.setTabProxy(tab, proxy);
break;
case 'unsetTabProxy':
OnRequest.setTabProxy(tab);
break;
}
}
static findProxy(pref, host) {
return host && pref.data.find(i => i.active && host === `${i.hostname}:${i.port}`);
}
static set(pref, mode) {
pref.mode = mode;
// save mode
browser.storage.local.set({mode});
// set proxy without menus update
Proxy.set(pref, true);
}
}