コンテンツのロード

Flash Player 9 以降、Adobe AIR 1.0 以降

Flash Player および AIR のコンテンツは、様々なタイプのコンテンツをロードできます。以下に例を示します。

  • SWF ファイル

  • イメージ

  • サウンド

  • ビデオ

  • HTML ファイル(AIR のみ)

  • JavaScript(AIR のみ)

Loader クラスを使用した SWF ファイルとイメージのロード

SWF ファイルおよびイメージ(JPG、GIF、または PNG ファイル)をロードするには、Loader クラスを使用します。 local-with-filesystem サンドボックス以外にある SWF ファイルは、任意のネットワークドメインから SWF ファイルおよびイメージをロードできます。 ローカルサンドボックス内にある SWF ファイルだけが、SWF ファイルとイメージをローカルファイルシステムからロードできます。 しかし、local-with-networking サンドボックス内のファイルは、local-trusted サンドボックスまたは local-with-networking サンドボックス内のローカル SWF ファイルしかロードできません。 local-with-networking サンドボックス内の SWF ファイルは、SWF ファイル以外のローカルコンテンツ(イメージなど)をロードしますが、ロードしたコンテンツの中のデータにはアクセスできません。

信頼できないソース(Loader オブジェクトのルート SWF ファイルのドメイン以外のドメインなど)から SWF ファイルをロードするとき、次のコードに示すように、Loader オブジェクトのマスクを定義して、ロードされたコンテンツ(Loader オブジェクトの子)がそのマスクの外部にあるステージの一部分に描画されないようにすることができます。

import flash.display.*; 
import flash.net.URLRequest; 
var rect:Shape = new Shape(); 
rect.graphics.beginFill(0xFFFFFF); 
rect.graphics.drawRect(0, 0, 100, 100); 
addChild(rect); 
var ldr:Loader = new Loader(); 
ldr.mask = rect; 
var url:String = "http://www.unknown.example.com/content.swf"; 
var urlReq:URLRequest = new URLRequest(url); 
ldr.load(urlReq); 
addChild(ldr);

Loader オブジェクトの load() メソッドを呼び出す場合、LoaderContext オブジェクトである context パラメーターを指定できます。LoaderContext クラスには、ロードされたコンテンツの使用方法のコンテキストを定義できる次の 3 つのプロパティが含まれています。

  • checkPolicyFile:このプロパティは、SWF ファイルではなくイメージファイルをロードする場合にのみ使用します。Loader オブジェクトを含んでいるファイルのドメイン以外のドメインのイメージファイルに対して、このプロパティを指定します。 このプロパティを true に設定した場合、Loader は元のサーバーで URL ポリシーファイルをチェックします(Web サイトのコントロール(ポリシーファイル)を参照)。サーバーが Loader ドメインに許可を与えた場合、Loader ドメイン内にある SWF ファイルの ActionScript は、ロードされたイメージ内のデータにアクセスできます。 つまり、Loader.content プロパティを使用して、ロードされたイメージを表す Bitmap オブジェクトへの参照を取得するか、BitmapData.draw() メソッドを使用して、ロードされたイメージのピクセルにアクセスできます。

  • securityDomain:このプロパティは、イメージではなく SWF ファイルをロードする場合にのみ使用します。Loader オブジェクトを含むファイルのドメイン以外のドメインの SWF ファイルに対してこのプロパティを指定します。 現時点で securityDomain プロパティに指定できる値は、null(デフォルト)と SecurityDomain.currentDomain の 2 つだけです。SecurityDomain.currentDomain を指定した場合、これはロードされた SWF ファイルを、ロードする側の SWF ファイルのサンドボックスへ読み込むよう要求します。つまり、ロードされた SWF ファイルが、ロードする側の SWF ファイル自体のサーバーからロードされたかのように動作します。これが許可されるのは、ロードされた SWF ファイルのサーバー上に URL ポリシーファイルがあり、ロードする側の SWF ファイルのドメインによるアクセスを許可している場合だけです。要求されたポリシーファイルが検出された場合、ロードする側とロードされる側は、同じサンドボックス内にあるので、ロードが開始された後、自由にお互いをスクリプトすることができます。 サンドボックスの読み込みは、ほとんどの場合、通常のロードを実行した後、ロードされた SWF ファイルで Security.allowDomain() メソッドを呼び出す操作に置き換えることができます。後者の方法の方が使いやすい場合もあります。なぜなら、ロードされた SWF ファイルはそれ自体の自然なサンドボックス内に入り、それ自体の実際のサーバー上にあるリソースにアクセスできるからです。

  • applicationDomain:ActionScript 1.0 や 2.0 で記述されたイメージまたは SWF ファイルではなく、ActionScript 3.0 で記述された SWF ファイルをロードする場合にのみ、このプロパティを使用します。ファイルをロードするときに、ファイルを特定のアプリケーションドメインに配置するよう指定できます。デフォルトでは、ファイルは新しいアプリケーションドメイン(ロードする側の SWF ファイルのアプリケーションドメインの子)に配置されます。アプリケーションドメインはセキュリティドメインのサブユニットです。したがって、ターゲットアプリケーションドメインを指定できるのは、ロード対象の SWF ファイルがユーザー自身のセキュリティドメイン内にある場合だけです。その理由は、その SWF ファイルがユーザー自身のサーバー内にあるか、securityDomain プロパティを使用してセキュリティドメインに正しく読み込まれた SWF ファイルだからです。アプリケーションドメインを指定しても、ロードされた SWF ファイルが別のセキュリティドメインにある場合、applicationDomain で指定したドメインは無視されます。詳しくは、アプリケーションドメインの操作を参照してください。

詳しくは、ロードコンテキストの指定を参照してください。

Loader オブジェクトの重要なプロパティの 1 つに、contentLoaderInfo プロパティがあります。これは LoaderInfo オブジェクトです。他のほとんどのオブジェクトと異なり、LoaderInfo オブジェクトはロードする側の SWF ファイルとロードされたコンテンツの間で共有され、常に双方からアクセスできます。 ロードされたコンテンツが SWF ファイルである場合、その SWF ファイルは DisplayObject.loaderInfo プロパティを通じて LoaderInfo オブジェクトにアクセスできます。LoaderInfo オブジェクトには、ロードの進行状況、ロードする側とロードされる側の URL、ロードする側とロードされる側の信頼関係、およびその他の情報が含まれています。 詳しくは、ロードの進行状況の監視を参照してください。

サウンドとビデオのロード

すべてのコンテンツ(local-with-filesystem サンドボックス内のコンテンツを除く)で、Sound.load()NetConnection.connect() および NetStream.play() メソッドを使用して、ネットワークからサウンドおよびビデオをロードできます。

ローカルファイルシステムからメディアをロードできるのは、local-with-filesystem サンドボックスおよび AIR アプリケーションサンドボックス内にあるコンテンツのみです。また、ロードされたこれらのファイル内のデータにアクセスできるのは、local-with-filesystem サンドボックス、AIR アプリケーションサンドボックスまたは local-trusted サンドボックス内にあるコンテンツのみです。

それ以外にも、ロードされたメディアのデータへのアクセスには制限があります。 詳しくは、ロードされたメディアへのデータとしてのアクセスを参照してください。

テキストフィールドに <img > タグを使用した SWF ファイルとイメージのロード

SWF ファイルおよびビットマップをテキストフィールドにロードするには、次のコードに示すように、<img> タグを使用します。

<img src = 'filename.jpg' id = 'instanceName' >

この方法でロードされたコンテンツには、次のコードのように TextField インスタンスの getImageReference() メソッドを使用してアクセスします。

var loadedObject:DisplayObject = myTextField.getImageReference('instanceName');

ただし、この方法でロードされた SWF ファイルとイメージは、オリジンに対応するサンドボックスに置かれます。

テキストフィールド内の <img> タグを使用してイメージファイルをロードする場合、イメージ内のデータへのアクセスは、URL ポリシーファイルによって許可できます。次のコードのように、checkPolicyFile 属性を <img> タグに追加してポリシーファイルをチェックします。

<img src = 'filename.jpg' checkPolicyFile = 'true' id = 'instanceName' >

テキストフィールドに <img> タグを使用した SWF をロードする場合、Security.allowDomain() メソッドを呼び出して、その SWF ファイルのデータへのアクセスを許可できます。

SWF 内に埋め込んだ Bitmap クラスを使用せず、テキストフィールド内の <img> タグを使用して外部ファイルをロードする場合、Loader オブジェクトは TextField オブジェクトの子として自動的に作成され、外部ファイルは、ActionScript 内の Loader オブジェクトを使用してファイルをロードする場合とまったく同じように、Loader にロードされます。その場合、getImageReference() メソッドは、自動的に作成された Loader を返します。この Loader オブジェクトは、呼び出しコードと同じセキュリティサンドボックス内に置かれているため、このオブジェクトにアクセスする場合にはセキュリティチェックは不要です。

しかし、ロードされたメディアにアクセスするために Loader オブジェクトの content プロパティを参照する場合は、セキュリティルールが適用されます。コンテンツがイメージの場合は、URL ポリシーファイルを実装する必要があり、コンテンツが SWF ファイルの場合は、SWF ファイル内のコードを使用して allowDomain() メソッドを呼び出す必要があります。

Adobe AIR

アプリケーションサンドボックスでは、フィッシング攻撃を回避するために、テキストフィールド内の <img> タグは無視されます。また、アプリケーションサンドボックス内で実行するコードでは、Security クラスの allowDomain() メソッドを呼び出せません。

RTMP サーバーを使用して送信されたコンテンツ

Flash Media Server は、RTMP(Real-Time Media Protocol)を使用してデータ、オーディオ、およびビデオを提供します。 このメディアをロードするには、NetConnection クラスの connect() メソッドを使用して、RTMP URL をパラメーターとして渡します。Flash Media Server は、要求元ファイルのドメインに基づいて、接続を制限し、コンテンツがダウンロードされないようにすることができます。 詳しくは、www.adobe.com/go/learn_fms_docs_jp でオンラインの Flash Media Server ドキュメントを参照してください。

BitmapData.draw() メソッドおよび SoundMixer.computeSpectrum() メソッドを使用して RTMP ストリームからランタイムグラフィックとサウンドデータを抽出するには、サーバーでアクセスを許可する必要があります。Flash Media Server にある特定のディレクトリへのアクセスを許可するには、サーバーサイド ActionScript の Client.videoSampleAccess プロパティおよび Client.audioSampleAccess プロパティを使用します。詳しくは、『サーバーサイド ActionScript 言語リファレンス』を参照してください。