Почему выборка UserScript перехватывает больше запросов, чем выборка веб-расширения?

У меня это в TamperMonkey что я хотел бы преобразовать в расширение

      let original_fetch = unsafeWindow.fetch;
unsafeWindow.fetch = async (url, init) => {
    let response = await original_fetch(url, init)
    let respo = response.clone();
    // console.log(url)
    if (url.includes("SomeString")) {
        respo.json().then((info) => {
            if (info.step === "lobby") {
                setTimeout(doSomething(info.data), 300);      
            }
        });
    }
    return response;
};

В моем расширении я ввел этот код с помощью script элемент:

      let channel = "customChannel";
const oldFetch = window.fetch;

window.fetch = function () {
    return new Promise((resolve, reject) => {
        oldFetch
            .apply(this, arguments)
            .then(async (response) => {
                const json = await response.clone().json();

                const detail = {
                    json,
                    fetch: {
                        url: response.url,
                        status: response.status,
                    },
                };

                window.dispatchEvent(new CustomEvent(channel, { detail }));

                resolve(response);
            })
            .catch((error) => {
                reject(error);
            });
    });
};

Все работает нормально за исключением того, что UserScript получает больше запросов, чем расширение.

Может кто-нибудь объяснить, почему и как я могу это исправить?

1 ответ

Решение

Обновление: я пропустил, что код был введен с использованием элемента сценария, поэтому следующий ответ относится к разнице с внедрением сценария содержимого .


Они выполняются в другом контексте / объеме.

Скрипты содержимого WebExtension вводятся в content контекст.

Использование в пользовательском скрипте приведет к запуску контекста in, который совпадает с собственным JavaScript веб-страницы (есть некоторая разница в мышлении менеджеров пользовательских скриптов).

Без unsafeWindow, если вы запустите, он будет чем-то похож на скрипт содержимого WebExtension (опять же, есть некоторая разница между менеджерами пользовательских скриптов).

В WebExtension, если вы хотите запустить fetch в page контекст, вы можете использовать window.wrappedJSObject например window.wrappedJSObject.fecth()

Другие вопросы по тегам