Почему Caja sanitization htmloutput скрипта Google Apps терпит неудачу в определенных строках

Я пытаюсь подготовить образцы кода GAS для встраивания в Google Sites и другие веб-сайты. Я использую HtmlService.createHtmlOutput и HtmlService.createTemplateFromFile() и template.evaluate().getContent() для обслуживания html-версии содержимого скрипта приложений Google. Все работает нормально, как описано в этом сообщении.

Теперь я хотел бы улучшить код с помощью prettyify.js. Я использую версию, встроенную в caja и это почти работает. Однако определенные имена методов в коде, подвергаемом предварительному уточнению, вызывают ошибку из htmlservice.

Отключение созданных гостевыми объектами объектов не поддерживается. Ожидайте функцию, а не строку: pln

В частности, этот текст успешно преттифицирован,

function xisItHtml (e) {
  return ( e.parameter.hasOwnPropertu('template')) ;
}

тогда как это выдает ошибку

function xisItHtml (e) {
  return ( e.parameter.hasOwnProperty('template')) ;
}

Кажется, что определенные методы (странно, потому что ни один из этих кодов не выполняется, а просто преттифицируется) вызывают жалобы санитарии caja.

Код в шаблоне именно такой

$(document).ready(function () {
 // any jQueryness can happen here...
  try { 
    prettyPrint();
  }
  catch(err) {
    alert("failed prettification " + err);
  }
});

Я в значительной степени озадачен. есть идеи?


person bruce    schedule 07.11.2012    source источник
comment
и рабочий пример, и тот, который выдает ошибку, выглядят одинаково   -  person mhawksey    schedule 07.11.2012
comment
Тот, который работает, имеет неправильное написание hasOwnProperty. Если вы пишете правильно, это не удается. Может быть, есть какая-то проверка кода, вводимого в тело html?   -  person bruce    schedule 07.11.2012
comment
Мартин. Если вы скопируете свой пример caja в HTML-шаблон GAS и выполните его, пример 1 будет работать. Остальные 2 нет.   -  person bruce    schedule 07.11.2012


Ответы (2)


Таким образом, кажется, что происходит сбой, когда вы вставляете предварительно подготовленный фрагмент текста, содержащий .toString() или .hasOwnProperty(), в htmloutput в GAS. Я не смог найти другого текста, вызывающего проблемы, но их может быть больше. Мой хак заключался в том, чтобы просто изменить текст перед преттификацией и вернуть его позже.

$(document).ready(function () {
   // any jQueryness can happen here...
    var thingsThatScrewUp = [ 'toString', 'hasOwnProperty'],t;

    $('.pretty').each( function(i,elem) {
       var c = $(elem).text() ;
       // disguise
       for (var i = 0 ; i < thingsThatScrewUp.length ; i++ ) {
        c = c.replace(new RegExp("." + thingsThatScrewUp[i], 'g'),".sandw_" + i + "_ch");
       }
       try {
         t = prettyPrintOne(c);
       }
       catch (err) {
        $('#report').html(err + c);
       }
       // undisguise
       for (var i = 0 ; i < thingsThatScrewUp.length ; i++ ) {
         t = t.replace(new RegExp("sandw_" + i + "_ch", 'g'),thingsThatScrewUp[i]);
       }
       $(elem).html("<pre class='code pretty prettyprint'>" + t + "</pre>");
      });
      $('#working').html('Module:');
  });

Вот Работающий версия

person bruce    schedule 07.11.2012

Это может быть то, как вы называете красивого. Вот пример, который правильно отображается в Детская площадка Каха

person mhawksey    schedule 07.11.2012
comment
Вот работающий скрипт . google.com/a/macros/mcpher.com/s/, а вот тот, который не script.google.com/a/macros/mcpher.com/s/ . Единственная разница заключается в написании текста. код находится здесь script.google.com/d/ - person bruce; 07.11.2012
comment
Я предполагаю, что это проблема скрипта приложений, потому что, хотя мой пример компилируется нормально на игровой площадке caja, я получаю ту же ошибку, что и вы, когда код примера публикуется как веб-приложение script.google.com/macros/s/ - person mhawksey; 07.11.2012