Как игрок онлайн-игры Pokéfarm Q, я делаю фанатское расширение, чтобы помочь игрокам искать в ветках форумов и кодах / пользовательских скриптах CSS. Чтобы я мог легко получать данные из созданного мной Pastebin, я добавил функцию, которая игнорирует заголовки CORS, когда пользователь посещает https://pokefarm.com а расширение браузера запрашивает страницу с pastebin.com.
Я основал код на гораздо более крупном расширении, позволяющем пользователям отключать CORS на определенных страницах с помощью расширения браузера, путем включения / выключения его в контекстном меню, но есть много ненужных дополнительных фрагментов кода, которые не нужно быть там. Может ли кто-нибудь помочь мне немного очистить мой код? Я сделал все, что мог, но я новичок в кодировании расширений Chrome (это первое приложение, которое я разработал сам), поэтому я не уверен, что сейчас лучший вариант.
(если это не совсем понятно, приведенный ниже код — это просто файл background.js, а не сценарий основного содержимого)
/* Source code based on (but not directly taken from) https://chrome.google.com/webstore/detail/cors-unblock/lfhmikememgdcahcdlaciloancbhjino */
/* CORS has to be unblocked so that PFQ, Pastebin, the PFQ CDN, and the extension can all work together. */
"use strict";
const prefs = {
enabled: true,
"overwrite-origin": true,
methods: ["GET", "PUT", "POST", "DELETE", "HEAD", "OPTIONS", "PATCH", "PROPFIND", "PROPPATCH", "MKCOL", "COPY", "MOVE", "LOCK"],
"remove-x-frame": true,
"allow-credentials": true,
"allow-headers-value": "*",
"allow-origin-value": "*",
"expose-headers-value": "*",
"allow-headers": true,
"unblock-initiator": true,
};
const redirects = {};
chrome.tabs.onRemoved.addListener((tabId) => delete redirects[tabId]);
const cors = {};
cors.onBeforeRedirect = (d) => {
if (d.type === "main_frame") {
return;
}
redirects[d.tabId] = redirects[d.tabId] || {};
redirects[d.tabId][d.requestId] = true;
};
cors.onHeadersReceived = (d) => {
if (d.type === "main_frame") {
return;
}
const { initiator, originUrl, responseHeaders, method, requestId, tabId } = d;
let origin = "";
const redirect = redirects[tabId] ? redirects[tabId][requestId] : false;
if (prefs["unblock-initiator"] && redirect !== true) {
try {
const o = new URL(initiator || originUrl);
origin = o.origin;
} catch (e) {
console.warn("cannot extract origin for initiator", initiator);
}
} else {
origin = "*";
}
if (redirects[tabId]) {
delete redirects[tabId][requestId];
}
if (prefs["overwrite-origin"] === true) {
const o = responseHeaders.find(({ name }) => name.toLowerCase() === "access-control-allow-origin");
if (o) {
o.value = origin || prefs["allow-origin-value"];
} else {
responseHeaders.push({
name: "Access-Control-Allow-Origin",
value: origin || prefs["allow-origin-value"],
});
}
}
if (prefs.methods.length > 3) {
// GET, POST, HEAD are mandatory
const o = responseHeaders.find(({ name }) => name.toLowerCase() === "access-control-allow-methods");
if (o) {
o.value = prefs.methods.join(", ");
} else {
responseHeaders.push({
name: "Access-Control-Allow-Methods",
value: prefs.methods.join(", "),
});
}
}
if (prefs["allow-credentials"] === true) {
const o = responseHeaders.find(({ name }) => name.toLowerCase() === "access-control-allow-credentials");
if (o) {
o.value = "true";
} else {
responseHeaders.push({
name: "Access-Control-Allow-Credentials",
value: "true",
});
}
}
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers
if (prefs["allow-headers"] === true) {
const o = responseHeaders.find(({ name }) => name.toLowerCase() === "access-control-allow-headers");
if (o) {
o.value = prefs["allow-headers-value"];
} else {
responseHeaders.push({
name: "Access-Control-Allow-Headers",
value: prefs["allow-headers-value"],
});
}
}
if (prefs["allow-headers"] === true) {
const o = responseHeaders.find(({ name }) => name.toLowerCase() === "access-control-expose-headers");
if (o) {
o.value = prefs["expose-headers-value"];
} else {
responseHeaders.push({
name: "Access-Control-Expose-Headers",
value: prefs["expose-headers-value"],
});
}
}
if (prefs["remove-x-frame"] === true) {
const i = responseHeaders.findIndex(({ name }) => name.toLowerCase() === "x-frame-options");
if (i !== -1) {
responseHeaders.splice(i, 1);
}
}
return {
responseHeaders,
};
};
cors.install = () => {
chrome.webRequest.onHeadersReceived.removeListener(cors.onHeadersReceived);
chrome.webRequest.onBeforeRedirect.removeListener(cors.onBeforeRedirect);
const extra = ["blocking", "responseHeaders"];
if (/Firefox/.test(navigator.userAgent) === false) {
extra.push("extraHeaders");
}
chrome.webRequest.onHeadersReceived.addListener(
cors.onHeadersReceived,
{
urls: ["*://*.pastebin.com/*", "*://*.pokefarm.com/*", "*://*.pfq-static.com/*"],
},
extra
);
chrome.webRequest.onBeforeRedirect.addListener(cors.onBeforeRedirect, {
urls: ["*://*.pastebin.com/*", "*://*.pokefarm.com/*", "*://*.pfq-static.com/*"],
});
};
cors.onCommand = () => {
cors.install();
};
chrome.storage.onChanged.addListener((ps) => {
Object.keys(ps).forEach((name) => (prefs[name] = ps[name].newValue));
cors.onCommand();
});
chrome.browserAction.onClicked.addListener(() =>
chrome.storage.local.set({
enabled: prefs.enabled === false,
})
);
/* init */
chrome.storage.local.get(prefs, (ps) => {
Object.assign(prefs, ps);
cors.onCommand();
});
Цель фонового скрипта — просто обойти CORS и политику безопасности контента, когда скрипт контента включен. https://pokefarm.com отправляет запрос в https://pastebin.com, но в коде, на котором я его основываю, было много параметров конфигурации, и я не уверен на 100%, что с ними делать.