Не может заставить приложение GWT работать как приложение Chrome packaged, вероятно, из - за CSP

продолжайте получать ошибки CSP: "отказался выполнять встроенный скрипт, потому что он нарушает следующую директиву политики безопасности контента: "script-src 'self'"

проблема, вероятно, связана с HTML-файлами, генерируемыми GWT, которые содержат встроенные JS.

UPD: изменение на манифест версии 1 помогло, но это временное workaroud, так как Chrome 21 жалуется, что он больше не будет поддерживаться.

UPD2: <add-linker name="xsiframe" /> не помогает либо

4 ответов


GWT 2.5.1, наконец, исправил эту проблему. Примечания к выпуску, документирующие это, здесь:

https://developers.google.com/web-toolkit/release-notes#Release_Notes_2_5_1

и они утверждают, что:

" приложения, построенные с DirectInstallLinker, должны работать на странице, где встроенные скрипты запрещены (например, расширение Chrome)"

Это означает, что теперь можно использовать DirectInstallLinker для связывания вашего Chrome упакованного приложения в способ, удовлетворяющий новым требованиям безопасности манифеста версии 2 в отношении встроенных сценариев. То есть, используя DirectInstallLinker для связи вашего приложения с GWT 2.5.1, выбранным в качестве версии GWT, GWT не будет размещать какие-либо встроенные элементы скрипта в своем сгенерированном Javascript, и, таким образом, новое требование манифеста версии 2, чтобы не было встроенных скриптов, не будет нарушено.

я обнаружил, что SingleScriptLinker также работает для моего собственного приложения; однако выпуск 7685 предупреждает против использования SingleScriptLinker, потому что " это генерирует $doc.напишите строку, которая запрещена в упакованных приложениях."Я сам использую DirectInstallLinker.

вот Javadoc для DirectInstallLinker:

http://google-web-toolkit.googlecode.com/svn/javadoc/2.5/com/google/gwt/core/linker/DirectInstallLinker.html

чтобы использовать этот компоновщик, вы можете включить следующее в свой *.ГВт.xml-файл:

<define-linker name="dil" class="com.google.gwt.core.linker.DirectInstallLinker"/>
<add-linker name="dil" />

(dil может быть заменяется на все, что вы выберете, до тех пор, пока нет тире или других незаконных символов).

вы нужно выберите GWT 2.5.1 как ваша версия УГВ. Если вы используете более старую версию GWT в устаревшей версии Eclipse, такой как Ganymede (как и я), вам придется обновить по крайней мере до Helios, а затем импортировать проект в новую среду Eclipse. URL-адреса архива плагина Google для Eclipse, которые могут использоваться для последних трех версий Eclipse, могут быть найдено здесь:

https://developers.google.com/eclipse/docs/download

С выше, вы должны быть в состоянии установить

"manifest_version": 2

в манифесте.JSON-файл и не испытывает никаких ошибок из-за GWT-генерируемого встроенного Javascript. Это должно позволить вашему веб-приложению Chrome быть приемлемым для веб-магазина Chrome (который теперь требует манифеста версии 2 для любых новых приложений или обновлений для существующих приложений), пока нет других проблемы.


EDIT: новая ошибка GWT сообщила:http://code.google.com/p/google-web-toolkit/issues/detail?id=7685, см. также http://gwt-code-reviews.appspot.com/1838803/ что связано с этой ошибкой

другими словами, Похоже, что при исправлении вам просто придется использовать DirectInstallLinker (<add-linker name='direct_install'/>).

тем временем, IIUC, вам придется продлить DirectInstallLinker и:

  • переопределить getJsInstallLocation вернуть копию а installLocaltionIframe.js без $wnd часть
  • переопределить getModulePrefix добавлять var $wnd = $wnd || window.parent; для чего создается super.getModulePrefix

Я не знаю CSP достаточно, чтобы дать полный ответ, но компоновщик xsiframe "настраиваемый": создайте класс, который расширяет com.google.gwt.core.linker.CrossSiteIframeLinker и переопределяет соответствующие методы, а затем использует с <define-linker> и <add-linker> в своем *.gwt.xml.

например, getJsInstallLocation по умолчанию com/google/gwt/core/ext/linker/impl/installLocationIframe.js но com/google/gwt/core/ext/linker/impl/installLocationMainWindows.js альтернативный реализация.

аналогично (и, вероятно, более важно), getJsInstallScript по умолчанию com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js но есть и com/google/gwt/core/ext/linker/impl/installScriptDirect.js альтернативная реализация.

см http://code.google.com/p/google-web-toolkit/source/browse/trunk/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java#204, http://code.google.com/p/google-web-toolkit/source/browse/trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/ и http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/core/Core.gwt.xml


благодаря совету Томаса Бройера. Я создал этот Линкер GWT. Теперь мое приложение GWT отлично работает как приложение Chrome (протестировано на Chrome 32 и GWT 2.5.1).

открытый класс CSPCompatibleLinker расширяет DirectInstallLinker {

@Override
protected String getJsInstallLocation(LinkerContext context) {
    return "com/google/gwt/core/ext/linker/impl/installLocationMainWindow.js";
} 

}

Не забудьте объявить Компоновщик в свой*.ГВт.xml-файл:

<define-linker name="csp" class="com.sfeir.linker.CSPCompatibleLinker"/>
<add-linker name="csp" />

Манифест версии 2 не разрешает встроенные скрипты. Вы должны убедиться, что все скрипты связаны, а не JavaScript в HTML-элементы.