Подтвердить что ты не робот

Underscore.js _.template вызывает ошибку из расширения Chrome

Если я использую underscore.js _. template() изнутри расширения Google Chrome я получаю следующую ошибку в консоли:

Неисправность Ошибка: генерация кода из строк, запрещенных для этого контекста

Есть ли способ преодолеть эту ошибку?

4b9b3361

Ответ 1

К сожалению, я не думаю, что вы можете использовать underscore.js _.template() из расширения chrome... по крайней мере, с новой версией manifest.json версии 2. То же самое справедливо и для попытки использовать плагин jQuery Template.

На странице Google Chrome Extension Политика безопасности контента:

Нет механизма для ослабления ограничения на выполнение встроенного JavaScript. В частности, установка политики script, которая включает в себя небезопасную строку, не будет иметь никакого эффекта. Это намеренно.

Я рассмотрю другие шаблонные модули, которые, надеюсь, не будут использовать объект new Function.

Ответ 2

Большое спасибо вкладчику списка Chromium, который указал, что для создания объекта Function в том, как это делает подчеркивание, для параметра manifest.json для content_security_policy требуется включить 'unsafe-eval'.

В качестве примера ваш manifest.json может быть

{
  "manifest_version": 2,
  ...
  "content_security_policy": "script-src 'self' 'unsafe-eval'",
  ...
}

а затем поведение подчеркивания будет работать, потому что эта политика позволяет это. Для получения дополнительной информации о формате см. Документацию Chrome по этой опции здесь.

Ответ 3

Я использую Underscore.js, потому что я хочу Backbone.js для моего расширения Chrome, я просто изменил механизм шаблона на Mustache ~, если у вас есть та же причина, вы также можете использовать Underscore.js для Backbone, просто не используйте используйте функцию _.template().

Ответ 5

Ограничения Manifest v2, как указано выше, запрещают использовать Eval, новые функции и встроенные скрипты - даже при игре с политикой безопасности контента: там нет способа для смягчения этой политики безопасности в расширениях v2.

Большинство библиотек шаблонов используют, в какой-то момент, evals. Одним из решений является переписать ваши расширения так, чтобы вся логика находилась в javascript и ничего в шаблоне; решение, такое как google jstemplate, должно в этом случае быть полезным.

Однако существует возможность делать Eval и новую функцию внутри изолированной iframe, например, со следующими строками в манифесте:

"sandbox": {
    "pages": [
      "page1.html",
      "directory/page2.html"
    ]
},

Страница с песочницей не будет иметь доступа к API расширения или приложения или к прямому доступу к страницам, отличным от песочницы (он может связываться с ними через postMessage()). Вы также можете ограничить права на песочницу специальным CSP

Вот теперь полный пример из команды Google Chrome в github eval в iframe о том, как обойти проблему, обмениваясь с изолированным iframe, а также краткое руководство по аналитике

Надеюсь, что какая-то библиотека будет отображаться с использованием этого механизма, чтобы обеспечить полную совместимость со стандартным использованием шаблонов, хотя я бы посоветовал удалить как можно больше логики из шаблонов по причинам производительности...

Благодаря Google существует много расширений, переписывающих в линейке: (

Ответ 6

Вы можете написать свой собственный мини-движок, используя конструкцию jQuery $('<element .../>').

Чистый способ:

function myElement(text) {
  var d = $('<div class="abc"/>');
  d.text(text);
  return d;
}

myElement('my text').appendTo(domParent);

Грязный способ:

var yourTemplate = '<div>${somevar}</div>';

function instTemplate(tmpl, text) {
  return $(tmpl.replace(/\$\{somevar\}/g, text));
}

instTemplate(yourTemplate, 'your text').appendTo(domParent);

например. довольно быстро переписать простые шаблоны jquery.tmpl, используя грязный метод, если вы знаете, что данные замены не являются вредными и т.д.