請讓CSP錯誤:「拒絕,因爲它違反了以下內容安全策略指令執行內嵌腳本:‘腳本的src‘自我’’不能讓GWT應用工作作爲Chrome封裝應用程序,可能是由於CSP
問題可能是由於GWT生成包含內嵌JS HTML文件
UPD:更改體現版本1幫助,但這是暫時的workaroud,如Chrome瀏覽器21抱怨說,它將不再支持。
UPD2:<add-linker name="xsiframe" />
也沒有幫助
請讓CSP錯誤:「拒絕,因爲它違反了以下內容安全策略指令執行內嵌腳本:‘腳本的src‘自我’’不能讓GWT應用工作作爲Chrome封裝應用程序,可能是由於CSP
問題可能是由於GWT生成包含內嵌JS HTML文件
UPD:更改體現版本1幫助,但這是暫時的workaroud,如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 2.5.1作爲你的GWT版本,GWT不會將任何腳本元素內聯放置在其生成的Javascript中,因此新的清單版本2要求不存在內聯腳本將不會被違反。
I發現SingleScriptLinker似乎也適用於我自己的應用程序;但是,問題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版本(如Ganymede)中使用舊版本的GWT,則必須升級至少Helios,然後將您的項目導入到新的Eclipse環境中。可以使用最近3個的Eclipse版本的谷歌Eclipse插件歸檔的URL可以在這裏找到:
https://developers.google.com/eclipse/docs/download
通過以上的地方,你應該能夠設置
"manifest_version": 2
在您的manifest.json文件中,並且不會因爲GWT生成的內聯Javascript而遇到任何錯誤。這應該允許您的Chrome網絡應用程序爲Chrome網上應用店所接受(現在需要爲任何新應用程序提供清單版本2或用於展示應用程序的更新),只要沒有其他問題。
清單版本2不允許內聯腳本。您需要確保所有腳本都鏈接在一起,而不是HTML元素中的JavaScript。
編輯:新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
並覆蓋相應方法的類,然後在*.gwt.xml
中使用<define-linker>
和<add-linker>
。
例如,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
這將工作,只要你不需要跨網站XHR來自你的gwt代碼b/c沙盒頁面不允許這樣做。請參閱https://groups.google.com/a/chromium.org/forum/?fromgroups=#!msg/chromium-extensions/z7FSk_HEe40/RTKPQWKig3AJ – honzajde
感謝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" />
邁克·格雷斯,下面,是正確的,你理解這個問題。你可以破解GWT的後處理器,將內聯腳本標記轉換爲JS文件,但這很醜陋。相反,我現在只需要使用清單1(Chrome尚未棄用它),並推動GWT人員修復其代碼。 –
看起來像唯一的解決方案 –
谷歌有關於此主題的消息(Chrome的DevMode插件必須更新爲將版本2部署到Chrome網上應用店,並且它本身包含用於管理配置的GWT應用)。請參閱下面我編輯的答案。 –