Construyendo una extensión de Chrome de muestra, su único propósito es envolver/reemplazar fetch y XMLHttpRequest .
Fue fácil con Manifest V2 , pero parece complicado con Manifest V3 .
El reemplazo se logra usando chrome.scripting.executeScript , que se activa inmediatamente desde un script de contenido de inicio de document_start , que envía un mensaje al trabajador en background , que a su vez usa chrome.scripting.executeScript en la pestaña de llamada.
Todo toma de 500ms a 1500ms ms, lo que generalmente pierde muchas solicitudes iniciales de fetch / XMLHttpRequest , lo cual es inaceptable para mi caso de uso: necesito controlar todas las solicitudes.
¿Es posible retrasar los scripts en la pestaña original hasta que finalice el reemplazo? ¿Estoy haciendo algo mal aquí? ¿Alguna otra solución para garantizar un reemplazo antes de que se realicen las solicitudes?
(usando https://www.msnbc.com/ en este ejemplo, pero probé muchos otros sitios web)
manifiesto.json:
{ "name": "v3ChangeFetchExample", "description": "v3ChangeFetchExample", "version": "1.0", "manifest_version": 3, "background": { "service_worker": "background.js" }, "permissions": ["tabs", "scripting"], "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'" }, "content_scripts": [ { "all_frames": true, "js": ["script.js"], "matches": ["https://www.msnbc.com/*"], "run_at": "document_start" } ], "host_permissions": ["https://www.msnbc.com/*"] }fondo.js:
const replaceFetch = async function (message) { fetch = {}; XMLHttpRequest = {}; console.error(`Took ${Date.now() - message}ms`); }; chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { chrome.scripting.executeScript({ world: "MAIN", target: { tabId: sender.tab.id, allFrames: true }, func: replaceFetch, args: [message], }); sendResponse(true); });secuencia de comandos.js:
(function () { chrome.runtime.sendMessage(Date.now()); })(); Editar: Acabo de encontrar esto en la documentación de chrome.scripting.executeScript :
Inyecta un script en un contexto de destino. El script se ejecutará en document_idle.
Esto arroja algo de luz sobre el tema. Entonces, tal vez la pregunta debería ser: ¿Es posible ejecutar un script en document_start y no document_idle usando Manifest V3 ?