まだセキュリティサンドボックス侵害に怒られてるメモ

AS3ではロードした画像をデータとして扱うとサンドボックスエラーとなるのは有名。ロードするだけなら外部ドメインの画像でもクロスドメイン問題関係なくロードはできる。それをwidthやheightを変更するのはオッケー。ビットマップを操作するのはアウト。このあたりはにとよんさんのエントリが丁寧に解説されてて有名。

なるほど、とりあえずロードはオッケーなんやと思って loader インスタンス作っておなじみのロード方法をした後の INIT ハンドラで

private function loadedFace(e:Event):void {
	addChild(e.target.content);
}

とするとサンドボックスエラー。ムムムと思ってロードの手続きしている場所で

:
loader.load(urlRequest);
addChild(loader);
:

すると怒られずに画像が無事表示されてる。そういうもんなのか。この書き方じゃ何やってるかわかんないでしょうけど、後日詳しく調べるかもしれないのを忘れないためのメモです。

追記:
にとよんさんに「addChild(e.target)」ならいけるのではと教えていただくも、それだと”1118: 静的型 Object の値が、関連しない可能性が高い型 flash.display:DisplayObject に暗黙で型変換されています。”と怒られる。じゃあe.targetって何型だっけと思って getQualifiedClassName(e.target) で型を調べると、flash.display::LoaderInfo 型とのこと。じゃあってことでgetQualifiedClassName(e.target.content)とすると、なぜか出力されない(←意味分からん。まぁDisplayObjectなんだろうけども)。

追記2:
コメントいただいてしまったあとで恐縮なのですが、なんだか他の部分で躓いているような気がしないでもありません。今日拝見した flash で mixi アプリを作るときに便利なフレームワーク flixi を使わせていただいているのだけど、e.done の挙動がいまいち把握できていなかったり、複数画像を読み込むのにloader生成しまくったりと、まだ書き出したてのコードなので、もうちょっと調べてみます。むらけんさんのGroupLoader使うとビットマップ扱いでセキュリティサンドボックス侵害をくらったので、それではということでまずは下記のようなコードになり、これで駄目なら Thread ライブラリで書こうかという、いかにも途中経過の段階です。とりあえず現状はaddChild(loader)なら期待値どおりという結果です。

//e.doneがなくても何度も呼ばれることはない?ってかe.doneアクティブにすると中が動かなかった
private function onGetViewersPeople(e:flixiPeopleEvent):void {
	//if(e.done){
		friendsArray = [];
		charaArray = [];
		loaderArray = [];
		for (var i: int = 0; i < e.length; i++) {
			var Person: flixiPerson = e.getItemByIndex(i);
			friendsArray.push(Person);
			var charaMC:CharaMC = new CharaMC();
			addChild(charaMC);
			charaMC.x = (stage.stageWidth / e.length) * i;
			charaMC.y = 250;
			charaArray.push(charaMC);
			var loader:Loader = new Loader();
			var req:URLRequest = new URLRequest(Person.thumbnailURL);
					loader.contentLoaderInfo.addEventListener(Event.INIT, loadedFace);
			loader.load(req);
			loaderArray.push(loader);
			charaMC.faceMC.addChild(loader); //方法1
		}
	//}
}

private function loadedFace(e:Event):void {
	NickName_txt.text = getQualifiedClassName(e.target.content);
	//とりあえずステージに貼り付けようとするとこれがNG
	//addChild(e.target.content); //方法2
}

追記3:
さらにコメントをいただき、とにかく INIT ハンドラ内で Loader オブジェクト本体にアクセスすることはでき、それを addChild すれば表示はされることを確認できました。

private function loadedFace(e:Event):void {
	addChild(LoaderInfo(e.target).loader); //これでLoaderオブジェクトにアクセスできる。
}

で、LoaderInfo(e.target).loader.content とすると表示されないのはなんとなく期待通り。

LoaderInfo についてのドキュメント。loader.contentLoaderInfo なのに LoaderInfo > Loader ってのが、素人感覚からするとなんとなく不思議な気がする。


「まだセキュリティサンドボックス侵害に怒られてるメモ」への6件のフィードバック

  1. addChild(e.target); ならエラーにならないんとちゃいますかね

  2. >にとよんさん
    すいません。この辺りの知識も僕勉強不足なもんで、よく調べもしないままポストしてたりしてまして、お付き合いいただいて申し訳ないです。もうちょっと右往左往してみますー。

  3. addChild(LoaderInfo(e.target).loader);
    とかではどうでしょうか?

  4. kenさま
    おおー、いけました!(表示されました。)
    やはりセキュリティサンドボックス的にはLoaderをaddChildするのはOKでcontentはビットマップ扱いされてNGなんですね。
    ありがとうございます。

  5. private function init():void {
    loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeEventHandle);
    }

    private function completeEventHandle(event:Event):void {
    if (loader.content is Bitmap) {
    //img:Image
    img.data = loader.content;
    }
    }

    こんな感じでFlexのImageで画像を表示しています。

  6. ゆのじ様

    ソースまでありがとうございます。
    僕はFlex使いではないのですが、上記コードだとサンドボックス侵害にならないってことでしょうか。試す機会あれば使わせていただきますね。ご丁寧にありがとうございます。

コメントは停止中です。