Estoy intentando actualizar mi extensión de Chrome a Manifest v3. Uso un modelo JSTensorflow y aparece este error:
Error de evaluación no capturado: se negó a evaluar una cadena como JavaScript porque 'unsafe-eval' no es una fuente de script permitida en la siguiente directiva de Política de seguridad de contenido: "script-src 'self'".
Sé que Manifest v3 no permite la "evaluación insegura", entonces, ¿cómo puedo solucionar este problema?
Mi manifiesto.json:
{ "name": "Recipick DEVELOPMENT", "description": "Pick the recipe from a website", "version": "1.0.0", "manifest_version": 3, "background": { "service_worker": "background.js", "type": "module" }, "action": { "default_title": "Recipick", "default_icon": "/images/icon_1.png" }, "permissions": [ "activeTab", "clipboardWrite", "sessions", "scripting", "storage", "tabs" ], "host_permissions": [ "*://*/*" ], "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'" }, "web_accessible_resources": [{ "resources": [ "*.gif" ], "matches": [ "*://*/*" ] }] }¡Gracias por tu ayuda!
Acabo de descubrir cómo hacerlo.
Puede usar 'unsafe-eval' y otras acciones no permitidas si las usa en un entorno Sandbox. Como se dice en https://developer.chrome.com/docs/extensions/mv3/manifest/sandbox/ :
Una página en zona de pruebas no tendrá acceso a las API de extensión ni acceso directo a páginas que no estén en zona de pruebas (puede comunicarse con ellas a través de postMessage()).
Una página de espacio aislado no está sujeta a la Política de seguridad de contenido (CSP) utilizada por el resto de la extensión (tiene su propio valor de CSP independiente). Esto significa que, por ejemplo, puede usar secuencias de comandos en línea y eval.
Creé una página HTML llamada sandbox.html y la inserté en la página que quería procesar como iframe, con los scripts incrustados en ella. Luego, los datos que se procesarán allí se reciben y se devuelven a los scripts de contenido/fondo a través de window.postMessage() (en este caso, window.parent.postMessage() , ya que es un iframe).
Aquí hay un ejemplo de esta implementación: https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/apps/samples/sandbox .
Esta página también puede ser útil: https://developer.chrome.com/docs/extensions/mv3/sandboxingEval/
Aquí aprendemos que Chrome prohíbe cualquier recurso externo o cualquier secuencia de comandos que incluya eval() usando algo llamado Content Security Policy .
También estoy ejecutando un proyecto con la misma idea que el tuyo y me encontré con el mismo problema. También menciona en esa página algunas soluciones incluyen:
Usando una 'biblioteca de plantillas' (una biblioteca que cumple con las reglas)
Acceder a contenido remoto (Enviar solicitudes a un servidor externo que realiza el procesamiento allí)
Por lo que sé, no hay tensorflow.js que cumpla, por lo que el n. ° 2 podría ser la única respuesta aquí.