2009-09-08 8 views
0

Le code ci-dessous est simplifié par exempleAIR: Sécurité Sandbox Violation lors de l'utilisation des images à distance

Je développe une application AIR (en utilisant Flex) qui charge plusieurs de ses images à partir d'un serveur web distant. Les images montrent bien, cependant, chaque fois que je manipuler les conteneurs qui contiennent les images à distance chargées, je reçois des erreurs dans ma console:

*** Security Sandbox Violation *** 
SecurityDomain 'http://www.google.com/intl/en_ALL/images/logo.gif' tried to access incompatible context 'app:/sandbox_test.swf' 

Les images ne semblent pas être touchés, mais je n » J'aime avoir des erreurs affichées que je ne comprends pas. Voici une exemple d'application qui illustre le problème:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication width="500" height="500" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:HDividedBox width="100%" height="300" horizontalCenter="0" verticalCenter="0" backgroundColor="#000000" liveDragging="true"> 
     <mx:Image source="http://sstatic.net/so/img/logo.png"/> 
     <mx:Image source="http://www.google.com/intl/en_ALL/images/logo.gif"/> 
    </mx:HDividedBox> 
</mx:WindowedApplication> 

Si vous faites glisser à l'aide du chalutier sur la HDividedBox, l'erreur de sécurité apparaît. J'ai examiné certains éléments du sandbox Security/Security pour AIR, mais par défaut, AIR devrait avoir accès aux ressources en réseau (ce qui explique pourquoi les images sont chargées). L'utilisation de Security.allowDomain ("www.google.com") n'est pas une option dans AIR - elle déclenche juste une erreur SecurityError.

Est-ce que quelqu'un sait ce qui le cause, ou comment le réparer? (Ou peut-être que c'est juste un bug Flex/AIR?).

Aussi - est-ce que quelqu'un sait s'il y a un moyen de casser quand l'erreur se produit, donc je peux le tracer à l'action de racine le provoquant?

+0

Ha Avez-vous utilisé le débogueur pour déterminer quand l'erreur de sécurité se déclenche réellement? Est-ce pendant la phase de dessin? – ryanstewart

+0

Le débogueur ne se casse pas réellement lorsque les erreurs se déclenchent, ils impriment simplement sur la console. Il n'est pas clair comment je peux les tracer à leur source –

Répondre

0

Est-ce que ces images s'affichent lorsque vous n'utilisez pas Debug? Le problème est que le domaine n'a pas une configuration de fichier crossdomain.xml pour autoriser les images dans Flash.

http://www.google.com/crossdomain.xml:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <site-control permitted-cross-domain-policies="by-content-type" /> 
</cross-domain-policy> 

Vous devriez probablement saisir les images et les placer dans des actifs de votre application, ou sur un domaine que vous contrôlez et pouvez correctement ajouter un crossdomain.xml qui permettrait le contenu. Security.allowDomain ne va pas avoir l'effet que vous recherchez. This article a la meilleure explication de sécurité de crossdomain que j'ai lu.

Voir le commentaire de ryanstewart ci-dessous. Ce qui précède est de la foutaise pour une application AIR.

+1

Cela ne devrait pas importer avec AIR. Lorsque vous êtes sur le bureau, vous suivez un ensemble de règles différent. @Chris, votre application s'appelle-t-elle sandbox_test? Est-ce la raison pour laquelle le fichier app: /sandbox_test.swf est référencé? – ryanstewart

+0

d'oh, vrai, désolé pour la désinformation. –

+0

Ouais - l'application de test que j'ai faite s'appelle sandbox_test, juste pour m'assurer que le problème n'était pas quelque chose d'obscur avec ma vraie application. –

3

Ce problème de sandbox de sécurité est spécifique au fait de faire glisser des UIComponents contenant des composants Image. Les composants Image font référence aux images externes. J'ai regardé partout et chaque message que je rencontre dans le fil se termine sans réponse, ce qui signifie généralement que c'est un bug.

Ma solution de rechange bootleg? Une fois l'image téléchargée dans le composant Image, mettez-la en cache sous forme de bitmap et réaffectez la source des composants Image au bitmap.Ce résolu le problème pour moi:

private function authorImageLoadComplete(event:Event):void { 
    var bp:Bitmap = dupeImage(authorImage); 
    authorImage.source=bp; 

} 

private function dupeImage(source:Image):Bitmap { 
    var data:BitmapData = Bitmap(source.content).bitmapData; 
    var bitmap:Bitmap = new Bitmap(data); 
    return bitmap; 
} 

Ensuite, votre balise image dans votre UIComponent:

<mx:Image id="authorImage" complete="authorImageLoadComplete(event)"></mx:Image> 

Le meilleur de chance les gars

Questions connexes