Если я использую underscore.js _. template() изнутри расширения Google Chrome я получаю следующую ошибку в консоли:
Неисправность Ошибка: генерация кода из строк, запрещенных для этого контекста
Есть ли способ преодолеть эту ошибку?
Если я использую underscore.js _. template() изнутри расширения Google Chrome я получаю следующую ошибку в консоли:
Неисправность Ошибка: генерация кода из строк, запрещенных для этого контекста
Есть ли способ преодолеть эту ошибку?
К сожалению, я не думаю, что вы можете использовать underscore.js _.template() из расширения chrome... по крайней мере, с новой версией manifest.json версии 2. То же самое справедливо и для попытки использовать плагин jQuery Template.
На странице Google Chrome Extension Политика безопасности контента:
Нет механизма для ослабления ограничения на выполнение встроенного JavaScript. В частности, установка политики script, которая включает в себя небезопасную строку, не будет иметь никакого эффекта. Это намеренно.
Я рассмотрю другие шаблонные модули, которые, надеюсь, не будут использовать объект new Function.
Большое спасибо вкладчику списка Chromium, который указал, что для создания объекта Function
в том, как это делает подчеркивание, для параметра manifest.json
для content_security_policy
требуется включить 'unsafe-eval'.
В качестве примера ваш manifest.json
может быть
{
"manifest_version": 2,
...
"content_security_policy": "script-src 'self' 'unsafe-eval'",
...
}
а затем поведение подчеркивания будет работать, потому что эта политика позволяет это. Для получения дополнительной информации о формате см. Документацию Chrome по этой опции здесь.
Я использую Underscore.js
, потому что я хочу Backbone.js
для моего расширения Chrome, я просто изменил механизм шаблона на Mustache
~, если у вас есть та же причина, вы также можете использовать Underscore.js для Backbone, просто не используйте используйте функцию _.template()
.
Google только что выпустил новый документ, в котором обсуждается решение этой проблемы?
http://code.google.com/chrome/extensions/trunk/sandboxingEval.html
Ограничения 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 существует много расширений, переписывающих в линейке: (
Вы можете написать свой собственный мини-движок, используя конструкцию 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, используя грязный метод, если вы знаете, что данные замены не являются вредными и т.д.