2012-08-25 16 views
8

dan errores de CSP: "Se negó a ejecutar un script en línea porque no cumple con el siguiente contenido Directiva de Política de Seguridad: ' 'auto' script src'No se puede hacer el trabajo de aplicación GWT como Chrome empaquetado aplicación, probablemente debido a la CSP

El problema es probablemente debido a los archivos HTML generados por GWT que contienen JS línea

UPD:. El cambio a manifestar la versión 1 ayudó, pero esto es un workaroud temporal, ya que Chrome 21 se queja de que ya no será compatible

UPD2:<add-linker name="xsiframe" /> no ayuda tampoco

+1

Mike Grace, a continuación, es correcto y usted comprende el problema. Podría piratear un postprocesador para GWT para convertir etiquetas de guiones en línea a archivos JS, pero eso es feo. En cambio, me quedaría con el manifiesto 1 por ahora (Chrome aún no lo ha desaprobado) y presionar a la gente de GWT para que arregle su código. –

+0

Parece la única solución –

+0

. Hay noticias de Google sobre el tema (el complemento DevMode para Chrome debe actualizarse para manifestar la versión 2 para su implementación en Chrome Web Store, y contiene una aplicación GWT para administrar la configuración). Ver mi respuesta editada a continuación. –

Respuesta

9

GWT 2.5.1 ha fijado finalmente este problema. Las notas de la versión que documentan esta aquí:

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

y afirman que:

"Aplicaciones construidas con DirectInstallLinker debe trabajar en una página donde están prohibidas las secuencias de comandos en línea (por ejemplo,una extensión de Chrome) "

Esto significa que ahora es posible usar DirectInstallLinker para vincular su aplicación empaquetada de Chrome de manera que cumpla con los nuevos requisitos de seguridad de la versión 2 del manifiesto con respecto a los scripts en línea. Esto es, al usar DirectInstallLinker para vincular su aplicación con GWT 2.5.1 seleccionada como su versión de GWT, GWT no colocará ningún elemento de script en línea en su código JavaScript generado, y por lo tanto no se violará el nuevo requisito de manifiesto versión 2 de que no haya guiones en línea.

I descubrieron que SingleScriptLinker también parece funcionar para mi propia aplicación; sin embargo, el Issue 7685 advierte contra el uso de SingleScriptLinker porque "Esto genera una línea $ doc.write que está prohibida en las aplicaciones empaquetadas." Estoy usando DirectInstallLinker.

Aquí es el Javadoc para DirectInstallLinker:

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

Para utilizar este conector, se pueden incluir lo siguiente en su archivo * .gwt.xml:

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

(dil puede haber reemplazado por cualquier cosa que elija, siempre que no haya guiones u otros caracteres ilegales).

Deberá seleccionar GWT 2.5.1 como su versión de GWT. Si está utilizando una versión anterior de GWT en una versión desactualizada de Eclipse como Ganymede (como yo), tendrá que actualizar al menos a Helios y luego importar su proyecto a su nuevo entorno Eclipse. Las direcciones URL de archivo para el complemento de Google para Eclipse que pueden utilizarse para las últimas tres versiones de Eclipse se pueden encontrar aquí:

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

Con lo anterior en su lugar, usted debe ser capaz de establecer

"manifest_version": 2 

en su archivo manifest.json y no experimenta ningún error debido a Javascript en línea generado por GWT. Esto debería permitir que su aplicación web de Chrome sea aceptable para Chrome Web Store (que ahora requiere la versión 2 del manifiesto para cualquier aplicación nueva o para las actualizaciones de las aplicaciones actuales), siempre que no haya otros problemas.

+0

el proyecto del webstarter de GWT no funciona; al menos, el cuadro de texto y el botón no están disponibles. apareciendo ¿Tiene una muestra disponible públicamente que podamos ver? Sin embargo, Chrome Extension está trabajando con com.google.gwt.core.linker.SingleScriptLinker. – raj

+0

No, lo siento, no he usado el proyecto de webstarter. – Carl

+0

tiene un código de muestra que puedo ver en el que la aplicación empaquetada está extrayendo datos de otro servidor (RESTful u otro modo o alguna otra forma de CSP) – raj

0

La versión de manifiesto 2 no permite scripts en línea. Debe asegurarse de que todos los scripts estén vinculados en su lugar y no tengan JavaScript en los elementos HTML.

5

EDIT: nuevo error GWT informó: http://code.google.com/p/google-web-toolkit/issues/detail?id=7685, consulta http://gwt-code-reviews.appspot.com/1838803/ que está relacionado con este error

En otras palabras, parece que, cuando se fija, sólo tendrá que usar la DirectInstallLinker (<add-linker name='direct_install'/>)

Por el momento, IIUC, que tendría que extenderse DirectInstallLinker y:

  • anulación getJsInstallLocation para devolver una copia de un installLocaltionIframe.js sin la parte $wnd
  • anulación getModulePrefix anteponer var $wnd = $wnd || window.parent; a lo que está generada por super.getModulePrefix

No sé CSP lo suficiente como para dar una respuesta completa, pero el enlazador xsiframe es "personalizable": crea una clase que amplía com.google.gwt.core.linker.CrossSiteIframeLinker y anula los métodos apropiados, luego usa con <define-linker> y <add-linker> en tu *.gwt.xml.

Por ejemplo, getJsInstallLocation tiene como valor predeterminado com/google/gwt/core/ext/linker/impl/installLocationIframe.js pero hay una implementación alternativa com/google/gwt/core/ext/linker/impl/installLocationMainWindows.js.

De manera similar (y probablemente más importante), getJsInstallScript tiene como valor predeterminado com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js pero también hay una implementación alternativa com/google/gwt/core/ext/linker/impl/installScriptDirect.js.

Ver 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/ y http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/core/Core.gwt.xml

+0

Esto funcionará en la medida que no es necesario cruzada el sitio XHR de su código gwt páginas de espacio aislado de b/c no permiten esto. Consulte https://groups.google.com/a/chromium.org/forum/?fromgroups=#!msg/chromium-extensions/z7FSk_HEe40/RTKPQWKig3AJ – honzajde

2

Gracias a los consejos de Thomas Broyer. Creé este GWT Linker. Ahora mi aplicación GWT funciona perfectamente como una aplicación de Chrome (Probado en Chrome 32 y GWT 2.5.1).

CSPCompatibleLinker clase pública se extiende DirectInstallLinker {

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

}

No se olvide de declarar el enlazador en su archivo * .gwt.xml:

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