Почему выборка 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()