"No se pueden cargar lienzos contaminados" Problema de dominio cruzado con texturas WebGL

He aprendido mucho en las últimas 48 horas sobre las políticas de dominio cruzado, pero aparentemente no es suficiente.

Siguiendo desdeesta pregunta. Mi juego HTML5 es compatible con el inicio de sesión de Facebook. Estoy tratando de descargar fotos de perfil de los amigos de las personas. En la versión HTML5 de mi juego, aparece el siguiente error en Chrome.

detailMessage: "com.google.gwt.core.client.JavaScriptException: (SecurityError) ↵ stack: Error: Error al ejecutar 'texImage2D' en 'WebGLRenderingContext': los lienzos contaminados no se pueden cargar.

Según tengo entendido, este error ocurre porque estoy tratando de cargar una imagen de un dominio diferente, pero esto se puede solucionar con unAcceso-Control-Permitir-Origen encabezado, como se detalla enesta pregunta.

La URL que intento descargar es

https://graph.facebook.com/1387819034852828/picture?width=150&height=150

Al mirar la pestaña de red en Chrome, puedo ver que esto tiene el requisitocontrol de acceso-permitir-origen encabezado y responde con una redirección 302 a una nueva URL. Esa URL varía, supongo que depende del equilibrio de carga, pero aquí hay una URL de ejemplo.

https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xap1/v/t1.0-1/c0.0.160.160/p160x160/11046398_1413754142259317_606640341449680402_n.jpg?oh=6738b578bc13c2ef7e2e4e2e4e2e7e2e5e2e5e2e5e2e5e2efcf3efcfc2gda= 1445979187_2b0bf0ad3272047d64c7bfc2dbc09a29

Esta URL también tiene elcontrol de acceso-permitir-origen encabezamiento. Entonces no entiendo por qué esto está fallando.

Siendo Facebook, y el hecho de que miles de aplicaciones, juegos y sitios web muestran imágenes de perfil de los usuarios, supongo que esto es posible. Soy consciente de que puedo rebotar a través de mi propio servidor, pero no estoy seguro de por qué debería hacerlo.

Responder

Finalmente conseguí cargar imágenes de dominio cruzado trabajando en libgdx con el siguiente código (que es bastante hacky y estoy seguro de que se puede mejorar). Todavía no he logrado que funcione con el AssetDownloader. Espero resolverlo eventualmente.

public void downloadPixmap(final String url, final DownloadPixmapResponse response) {
    final RootPanel root = RootPanel.get("embed-html");
    final Image img = new Image(url);
    img.getElement().setAttribute("crossOrigin", "anonymous");
    img.addLoadHandler(new LoadHandler() {

        @Override
        public void onLoad(LoadEvent event) {
            HtmlLauncher.application.getPreloader().images.put(url, ImageElement.as(img.getElement()));
            response.downloadComplete(new Pixmap(Gdx.files.internal(url)));
            root.remove(img);
        }
    });
    root.add(img);
}

interface DownloadPixmapResponse {
    void downloadComplete(Pixmap pixmap);

    void downloadFailed(Throwable e);
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta