77 lines
2.0 KiB
JavaScript
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);
|
|
}
|
|
} |