<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fla.la &#187; security</title>
	<atom:link href="http://fla.la/archives/tag/security/feed" rel="self" type="application/rss+xml" />
	<link>http://fla.la</link>
	<description>FLASH関連のネタを粛々とポストしていくのです。最近はUnion Platformに夢中</description>
	<lastBuildDate>Mon, 14 Dec 2009 04:46:45 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Loaderで読み込んだswfと読み出し元swf間のイベント伝達</title>
		<link>http://fla.la/archives/576</link>
		<comments>http://fla.la/archives/576#comments</comments>
		<pubDate>Mon, 14 Dec 2009 00:42:09 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[security]]></category>
		<category><![CDATA[Loader]]></category>

		<guid isPermaLink="false">http://fla.la/?p=576</guid>
		<description><![CDATA[Loaderに外部のswfを読み込んだ状態で、LoaderにMouseEvent.CLICKのイベントリスナーを設定しても反応しない、という現象に悩まされることが多々あります。 Loaderは、InteractiveObjectを継承しているので、MouseEventは受け取れるはずです。それに、Loaderにスタティックな画像(jpegやpngなど)を読み込んだ際には、LoaderにMouseEvent.CLICKのイベントリスナーを設定すれば、イベント拾えるんですよね。 これは以前、fla.la &#187; クロススクリプティングで紹介した ロード元swfファイルのDisplayObjectツリーと、ロードしたswfファイルのDisplayObjectツリー間のイベント伝達フロー が関係してきます。 そこでAdobe ActionScript 3.0 * クロススクリプトを読んでみますと、以下の記述があります。 親オブジェクトを所有する SWF ファイルは、ソースオブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。 ソースオブジェクトを所有する SWF ファイルは、親オブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。 つまり読み込んだexample.com/hoge.swfからexample.net/fugo.swfを読み込んで、イベント伝達を可能にするためには、お互いのドメインを引数にしたSecurity.allowDomain()を実行する必要があるということになります。 サンプルソース サンプルをwonderflに上げておきました。中央付近に表示されるキャラクターにMouseEvent.CLICKイベントのリスナーを登録していますが、クリックしても反応しません。 キャプチャーフェーズ、ターゲットフェーズ、バブリングフェーズすべてのフェーズでイベントが発生していないことがポイントです。 そこで、上部にある「Security.allowDomain()」というボタンをクリックしたあとで、キャラクターをクリックすると反応することが分かると思います。 Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 &#8211; wonderfl build flash online なお、http://asmple.com/work/avatar3.swfでは以下のSecurity.allowDomain()が記述してあります。 Security.allowDomain&#40;&#34;wonderfl.net&#34;&#41;; Security.allowDomain&#40;&#34;swf.wonderfl.net&#34;&#41;;]]></description>
			<content:encoded><![CDATA[<p>Loaderに外部のswfを読み込んだ状態で、LoaderにMouseEvent.CLICKのイベントリスナーを設定しても反応しない、という現象に悩まされることが多々あります。</p>
<p>Loaderは、InteractiveObjectを継承しているので、MouseEventは受け取れるはずです。それに、Loaderにスタティックな画像(jpegやpngなど)を読み込んだ際には、LoaderにMouseEvent.CLICKのイベントリスナーを設定すれば、イベント拾えるんですよね。</p>
<p>これは以前、<a href="http://fla.la/archives/145">fla.la  &raquo; クロススクリプティング</a>で紹介した</p>
<blockquote><p>ロード元swfファイルのDisplayObjectツリーと、ロードしたswfファイルのDisplayObjectツリー間のイベント伝達フロー</p></blockquote>
<p>が関係してきます。</p>
<p>そこで<a href="http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7c98.html">Adobe ActionScript 3.0 * クロススクリプト</a>を読んでみますと、以下の記述があります。</p>
<blockquote>
<ol>
<li>親オブジェクトを所有する SWF ファイルは、ソースオブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。</li>
<li>ソースオブジェクトを所有する SWF ファイルは、親オブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。</li>
</ol>
</blockquote>
<p>つまり読み込んだexample.com/hoge.swfからexample.net/fugo.swfを読み込んで、イベント伝達を可能にするためには、お互いのドメインを引数にしたSecurity.allowDomain()を実行する必要があるということになります。</p>
<h2>サンプルソース</h2>
<p>サンプルをwonderflに上げておきました。中央付近に表示されるキャラクターにMouseEvent.CLICKイベントのリスナーを登録していますが、クリックしても反応しません。</p>
<p>キャプチャーフェーズ、ターゲットフェーズ、バブリングフェーズすべてのフェーズでイベントが発生していないことがポイントです。</p>
<p>そこで、上部にある「Security.allowDomain()」というボタンをクリックしたあとで、キャラクターをクリックすると反応することが分かると思います。</p>
<div style="text-align:center;width:465px;"><iframe title="Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/cfcc2cb2078020bb10b3498a38bb1c9ed18cbd14" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/cfcc2cb2078020bb10b3498a38bb1c9ed18cbd14" title="Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 - wonderfl build flash online">Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 &#8211; wonderfl build flash online</a></div>
<p>なお、http://asmple.com/work/avatar3.swfでは以下のSecurity.allowDomain()が記述してあります。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #004993;">Security</span>.<span style="color: #004993;">allowDomain</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;wonderfl.net&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #004993;">Security</span>.<span style="color: #004993;">allowDomain</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;swf.wonderfl.net&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/576/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
