子ドキュメント内のスクリプトから親サンドボックスブリッジにアクセスするには、スクリプトを実行する前にブリッジを設定する必要があります。新しいページの DOM が作成された後で、スクリプトが解析されるか DOM エレメントが追加される前に、ウィンドウ、フレームおよびインラインフレームのオブジェクトは、
dominitialize
イベントを送出します。
dominitialize
イベントを使用して、子ドキュメント内のすべてのスクリプトがアクセスできるページ構成シーケンスで、前もってブリッジを確立できます。
次の例は、子フレームから送出された
dominitialize
イベントに対応して親サンドボックスブリッジを作成する方法を示しています。
<html>
<head>
<script>
var bridgeInterface = {};
bridgeInterface.testProperty = "Bridge engaged";
function engageBridge(){
document.getElementById("sandbox").contentWindow.parentSandboxBridge = bridgeInterface;
}
</script>
</head>
<body>
<iframe id="sandbox"
src="http://www.example.com/air/child.html"
documentRoot="app:/"
sandboxRoot="http://www.example.com/air/"
ondominitialize="engageBridge()"/>
</body>
</html>
次の
child.html
ドキュメントは、子コンテンツから親サンドボックスブリッジにアクセスする方法を示しています。
<html>
<head>
<script>
document.write(window.parentSandboxBridge.testProperty);
</script>
</head>
<body></body>
</html>
フレームではなく、子ウィンドウ上で
dominitialize
イベントをリッスンするには、次のようにして、
window.open()
関数によって作成された新しい子ウィンドウオブジェクトにリスナーを追加する必要があります。
var childWindow = window.open();
childWindow.addEventListener("dominitialize", engageBridge());
childWindow.document.location = "http://www.example.com/air/child.html";
この場合、アプリケーションコンテンツを非アプリケーションサンドボックスにマップする方法はありません。このテクニックは、
child.html
がアプリケーションディレクトリの外部から読み込まれる場合にのみ有用です。ウィンドウ内のアプリケーションコンテンツを非アプリケーションサンドボックスにマップすることはできますが、フレームを使用して子ドキュメントを読み込んで目的のサンドボックスにマップする中間ページを最初に読み込む必要があります。
HTMLLoader クラスの
createRootWindow()
関数を使用してウィンドウを作成する場合、新しいウィンドウは
createRootWindow()
の呼び出し元のドキュメントの子ではありません。したがって、呼び出し元ウィンドウから、新しいウィンドウに読み込まれる非アプリケーションコンテンツへのサンドボックスブリッジを作成することはできません。その代わり、フレームを使用して子ドキュメントを読み込む新しいウィンドウ内の中間ページを読み込む必要があります。その後、新しいウィンドウの親ドキュメントから、フレームに読み込まれた子ドキュメントへのブリッジを確立できます。