不断收到 CSP 错误:“拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self'”
问题可能是由于 GWT 生成的 HTML 文件包含内联 JS。
UPD:更改为清单版本 1 有所帮助,但这是一个临时解决方法,因为 Chrome 21 抱怨它将不再受支持。
UPD2: <add-linker name="xsiframe" />
也无济于事
不断收到 CSP 错误:“拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self'”
问题可能是由于 GWT 生成的 HTML 文件包含内联 JS。
UPD:更改为清单版本 1 有所帮助,但这是一个临时解决方法,因为 Chrome 21 抱怨它将不再受支持。
UPD2: <add-linker name="xsiframe" />
也无济于事
GWT 2.5.1 终于解决了这个问题。记录这一点的发行说明在这里:
https://developers.google.com/web-toolkit/release-notes#Release_Notes_2_5_1
他们说:
“使用 DirectInstallLinker 构建的应用程序应该在禁止内联脚本的页面中运行(例如 Chrome 扩展程序)”
这意味着现在可以使用 DirectInstallLinker 以满足清单版本 2 关于内联脚本的新安全要求的方式链接您的 Chrome 打包应用程序。也就是说,通过使用 DirectInstallLinker 将您的应用程序与选择作为您的 GWT 版本的 GWT 2.5.1 链接,GWT 不会在其生成的 Javascript 中内嵌任何脚本元素,因此新的清单版本 2 要求没有内联脚本不会被侵犯。
我发现 SingleScriptLinker 似乎也适用于我自己的应用程序;但是,Issue 7685 警告不要使用 SingleScriptLinker,因为“这会生成一个 $doc.write 行,这在打包的应用程序中是被禁止的。” 我自己正在使用 DirectInstallLinker。
这是 DirectInstallLinker 的 Javadoc:
要使用此链接器,您可以在 *.gwt.xml 文件中包含以下内容:
<define-linker name="dil" class="com.google.gwt.core.linker.DirectInstallLinker"/>
<add-linker name="dil" />
(只要没有破折号或其他非法字符,dil 可以替换为您选择的任何内容)。
您需要选择 GWT 2.5.1 作为您的 GWT 版本。如果您在过时版本的 Eclipse 中使用旧版本的 GWT,例如 Ganymede(就像我一样),您必须至少升级到 Helios,然后将您的项目导入新的 Eclipse 环境。可用于最新三个 Eclipse 版本的 Google Plugin for Eclipse 的存档 URL 可在此处找到:
https://developers.google.com/eclipse/docs/download
有了上面的地方,你应该可以设置
"manifest_version": 2
在您的 manifest.json 文件中,并且不会因为 GWT 生成的内联 Javascript 而遇到任何错误。只要没有其他问题,这应该允许您的 Chrome Web 应用程序被 Chrome 网上应用店接受(现在任何新应用程序或现有应用程序的更新都需要清单版本 2)。
编辑:报告的新 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
的副本 ainstallLocaltionIframe.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
感谢 Thomas Broyer 的建议。我创建了这个 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"; }
}
不要忘记将链接器声明到您的*.gwt.xml 文件中:
<define-linker name="csp" class="com.sfeir.linker.CSPCompatibleLinker"/>
<add-linker name="csp" />
清单版本 2 不允许内联脚本。您需要确保所有脚本都被链接,并且 HTML 元素中没有 JavaScript。