Включить "новую функцию" в Web Worker с CSP

У меня проблемы с получением new Function работать в веб-работнике. У меня есть HTML-страница, которая порождает веб-работника. Этот веб-работник выполняет код через new Function(str), Я пытаюсь использовать это в упакованном приложении Chrome, для которого требуется страница, использующая eval-подобный код для явного перечисления в манифесте в виде изолированной страницы.

Теперь есть два варианта:

  • Сделайте список страницы, которая будет помещена в песочницу Если я сделаю это, я могу использовать new Function, но я не могу порождать Web Worker, потому что я не могу делать никаких запросов (у изолированной страницы есть уникальное происхождение). new Worker(...) бросает SECURITY_ERR,
    • new Function работает в песочнице
    • new Worker не удается в песочнице из-за уникального происхождения
  • Не перечисляйте страницу, которая будет помещена в песочницу. Если я это сделаю, я могу создать веб-работника, но работник не сможет использовать new Function потому что это не песочница. new Function(...) бросает EvalError жаловаться на его использование.
    • new Function не в песочнице из-за eval-лайк
    • new Worker работает в песочнице

Мой CSP выглядит следующим образом:

sandbox allow-scripts script-src 'self' 'unsafe-eval'; object-src 'self'

Что я могу сделать, чтобы получить new Function работа в веб-работнике?

1 ответ

Решение

Есть методика, называемая встроенными работниками, я бы предложил использовать это.

  • Создайте объект Blob, который содержит исходный код для работника
  • Преобразуйте его в "dataurl"
  • Создайте работника с этим dataurl

Это описано с помощью примера кода на сайте HTML5-камней в их учебном руководстве по WebWorkers. Таким образом, вы можете перечислить сайт как "песочницу", но поскольку нет необходимости выполнять внешние запросы, он должен работать и в режиме "песочницы".