Я пытаюсь обновить расширение Chrome до версии Manifest v3. Я использую модель JSTensorflow, и она выдает эту ошибку:
Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'".
Я знаю, что Manifest v3 не допускает «unsafe-eval», так как я могу решить эту проблему?
Мой манифест.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": [ "*://*/*" ]
}]
}
Спасибо за вашу помощь!
Здесь мы узнаем, что хром запрещает любой внешний ресурс или любой скрипт, который включает eval()
использование чего-то, что называется Content Security Policy
.
Я также запускаю проект с той же идеей, что и ваша, и просто столкнулся с той же проблемой. На этой странице также упоминаются некоторые обходные пути:
Использование «библиотеки шаблонов» (библиотека, соответствующая правилам)
Доступ к удаленному контенту (отправка запросов на внешний сервер, который выполняет там обработку)
Насколько я знаю, не существует tensorflow.js, который соответствует требованиям, поэтому № 2 может быть единственным ответом здесь.
Я только что узнал, как это сделать.
Вы можете использовать «unsafe-eval» и другие действия, которые не разрешены, если вы используете их в среде «песочницы». Как сказано в https://developer.chrome.com/docs/extensions/mv3/manifest/песочница/ :
A sandboxed page will not have access to extension APIs, or direct access to non-sandboxed pages (it may communicate with them via postMessage()).
A sandboxed page is not subject to the Content Security Policy (CSP) used by the rest of the extension (it has its own separate CSP value). This means that, for example, it can use inline script and eval.
Я создал HTML-страницу с именем sandbox.html и вставил ее на страницу, которую я хотел обработать как iframe, со встроенными в нее сценариями. Затем данные для обработки принимаются и возвращаются в Content Scripts через window.postMessage().
Вот пример такой реализации: https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/apps/samples/песочница.
Эта страница также может быть полезна: https://developer.chrome.com/docs/extensions/mv3/sandboxingEval/