blob: 82263936071dcf68661a8c338812691c7ca18451 [file]
import * as _DEFAULT_RULES from '../data/rules.json';
/**
* Default rules.
*/
export const DEFAULT_RULES: Rule[] = _DEFAULT_RULES as Rule[];
/**
* Retrieves default rules from remote rules file, fallback to existing DEFAULT_RULES
*/
export async function getDefaultRules() {
// try fetch from remote
const remoteRulesUrl =
'https://gerrit.googlesource.com/gerrit-fe-dev-helper/+/refs/heads/master/data/rules.json?format=TEXT';
try {
const response = await fetch(remoteRulesUrl);
const encodedText = await response.text();
return JSON.parse(atob(encodedText));
} catch (e) {
console.log(e);
}
// fallback to existing default rules
return DEFAULT_RULES;
}
/**
* Returns if it's a valid rule (syntax only).
*/
export function isValidRule(rule: Rule) {
return (
Object.values(Operator).includes(rule.operator) &&
((rule.operator === Operator.BLOCK && rule.target) ||
(rule.operator === Operator.REDIRECT &&
rule.target &&
rule.destination) ||
!!rule.destination)
);
}
/**
* Returns if it's a inject rule.
*/
export function isInjectRule(rule: Rule) {
return [
Operator.INJECT_JS_MODULE_PLUGIN,
Operator.INJECT_JS_PLUGIN,
Operator.INJECT_HTML_CODE,
Operator.INJECT_HTML_PLUGIN,
Operator.INJECT_JS_CODE,
Operator.INJECT_EXP,
].some(op => op === rule.operator);
}
/**
* Supported operators.
*/
export enum Operator {
BLOCK = 'block',
REDIRECT = 'redirect',
INJECT_HTML_PLUGIN = 'injectHtmlPlugin',
INJECT_HTML_CODE = 'injectHtmlCode',
INJECT_JS_PLUGIN = 'injectJSPlugin',
INJECT_JS_MODULE_PLUGIN = 'injectJSModule',
INJECT_JS_CODE = 'injectJSCode',
REMOVE_RESPONSE_HEADER = 'rRespHeader',
ADD_RESPONSE_HEADER = 'addRespHeader',
ADD_REQUEST_HEADER = 'addReqHeader',
INJECT_EXP = 'injectExp',
}
/**
* Rule type.
*/
export interface Rule {
disabled: boolean;
target: string;
operator: Operator;
destination: string;
}
/**
* Util to get url parameters
*/
export function getUrlParameter(param: string) {
const qs = window.location.search.substring(1);
const partials = qs.split('&');
const res = [];
for (let i = 0; i < partials.length; i++) {
const name = partials[i].split('=');
if (name[0] == param) {
res.push(name[1]);
}
}
return res;
}
// Note that this does not work from a content script. It does not have access
// to the `chrome.tabs` API.
export async function getActiveTab(): Promise<chrome.tabs.Tab | undefined> {
const activeTabs = await chrome.tabs.query({
active: true,
currentWindow: true,
});
const activeTab = activeTabs[0];
if (!activeTab?.id || !activeTab?.url) return undefined;
return activeTab;
}