Underscore.js _.template вызывает ошибку из расширения Chrome - PullRequest
17 голосов
/ 10 января 2012

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

Uncaught Error: генерация кода из строк, запрещенных для этого контекста

Есть ли способ обойти эту ошибку?

Ответы [ 6 ]

7 голосов
/ 12 января 2012

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

Например, ваш manifest.json может быть

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

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

5 голосов
/ 13 июля 2012

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

Из Политики безопасности содержания Google * Chrome Extension Страница:

Механизма для ослабления ограничения не существуетпротив выполнения встроенного JavaScript.В частности, установка политики сценариев, включающей unsafe-inline, не будет иметь никакого эффекта.Это сделано намеренно.

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

4 голосов
/ 02 ноября 2013

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

1 голос
/ 01 августа 2012

Google только что выпустил новый документ, обсуждающий решение этой проблемы?

http://code.google.com/chrome/extensions/trunk/sandboxingEval.html

0 голосов
/ 12 августа 2012

Вы можете написать свой собственный шаблонный мини-движок, используя конструкцию 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, используя грязный метод, если вы знаете, что заменяемые данные не вредны и т. Д.

0 голосов
/ 26 июля 2012

Ограничения 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, в линейке есть много переписанных расширений: (* ​​1024 *

...