Dr_Elvis
@Dr_Elvis
В гугле забанен

Content-Security-Policy и manifest v3?

Привет!
Никак не могу разобраться с 3 версией манифеста.
Вроде как 3 версия теперь запрещает инжектить скрипты на страницу, но у меня 90% плагина построено на этом, чтобы облагородить сайт новыми функциями.
на манифесте версии 2 - всё работает, но поменяв на 3 выходит вот такая ошибка:
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-xh//iOp5YsjV4AHCfTPhZ7ybsMYdmYyvqiTjVw3FmHY='), or a nonce ('nonce-...') is required to enable inline execution.

Начал смотреть что за ошибка, но везде примеры под 2 версию манифеста, с вариантами:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
Content-Security-Policy: script-src 'sha256-xh//iOp5YsjV4AHCfTPhZ7ybsMYdmYyvqiTjVw3FmHY='

в 3 версии манифеста нужно по другому объявлять:
"content_security_policy": {
  "extension_pages": "...",
  "sandbox": "..."
}

Но где бы я не смотрел - пишут типо "просто измените вот на такую форму", но что куда не могу найти. пробовал по разному - всё тщетно, либо плагин при загрузке ругается на не верный манифест, либо ошибка, что выше, попросту остается.
ругается у меня на том месте где я создаю тег script, пихаю туда свои функции и инжекчу на html:
let PageScriptSpace = document.createElement('script');
InjectFunction = function(PageScriptSpace, func) {
   PageScriptSpace.innerHTML += func + ';';
}
InjectFunction(PageScriptSpace,  foo);
InjectFunction(PageScriptSpace,  bar);
h = document.querySelector('head');
h.appendChild(PageScriptSpace);

Поделитесь, пожалуйста, примерами.
  • Вопрос задан
  • 979 просмотров
Решения вопроса 1
Rst0
@Rst0
пример:
если я делаю ижект на страницу youtube,
то в манифест пишу
"web_accessible_resources": [
      {
         "resources": [ "inner.js", "test.css" ],
         "matches": [ "https://www.youtube.com/*", "https://m.youtube.com/*" ],
         "extension_ids": []
      }
   ],

   "host_permissions": [
         "https://www.youtube.com/*",
   ],
и он работает


const injectJS = document.createElement('script');
   injectJS.type='text/javascript';
   injectJS.src=chrome.runtime.getURL("inner.js");
   document.body.appendChild(injectJS);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы