Расширение Chrome для помощи игрокам в поиске по форуму

Как игрок онлайн-игры 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%, что с ними делать.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *