2012-08-25 52 views
8

請讓CSP錯誤:「拒絕,因爲它違反了以下內容安全策略指令執行內嵌腳本:‘腳本的src‘自我’’不能讓GWT應用工作作爲Chrome封裝應用程序,可能是由於CSP

問題可能是由於GWT生成包含內嵌JS HTML文件

UPD:更改體現版本1幫助,但這是暫時的workaroud,如Chrome瀏覽器21抱怨說,它將不再支持。

UPD2:<add-linker name="xsiframe" />也沒有幫助

+1

邁克·格雷斯,下面,是正確的,你理解這個問題。你可以破解GWT的後處理器,將內聯腳本標記轉換爲JS文件,但這很醜陋。相反,我現在只需要使用清單1(Chrome尚未棄用它),並推動GWT人員修復其代碼。 –

+0

看起來像唯一的解決方案 –

+0

谷歌有關於此主題的消息(Chrome的DevMode插件必須更新爲將版本2部署到Chrome網上應用店,並且它本身包含用於管理配置的GWT應用)。請參閱下面我編輯的答案。 –

回答

9

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:

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

要使用此連接器,您可以在您的* .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或用於展示應用程序的更新),只要沒有其他問題。

+0

GWT webstarter項目不工作 - 至少文本框和Button不是出現。你有沒有公開的樣本,我們可以看看。儘管Chrome擴展可以使用com.google.gwt.core.linker.SingleScriptLinker。 – raj

+0

不,對不起,我沒有使用webstarter項目。 – Carl

+0

你有一個示例代碼,我可以看看打包的應用程序從另一個服務器(RESTful或其他形式的CSP)中抽取數據的位置 – raj

0

清單版本2不允許內聯腳本。您需要確保所有腳本都鏈接在一起,而不是HTML元素中的JavaScript。

5

編輯:新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#204http://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

+0

這將工作,只要你不需要跨網站XHR來自你的gwt代碼b/c沙盒頁面不允許這樣做。請參閱https://groups.google.com/a/chromium.org/forum/?fromgroups=#!msg/chromium-extensions/z7FSk_HEe40/RTKPQWKig3AJ – honzajde

2

感謝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" /> 
相關問題