一方で、スクリプト側から wasavi を制御する場面を考えると、まずスクリプトを実行させる場所になる iframe(以下スクリプトフレーム)で最初に wasavi オブジェクトを定義し、それを通してアクセスさせる。
アクセスの手段は
- run: コマンド列の送信
- rows: 任意の行の読み書き
- options: オプションの読み書き
- registers: レジスタの読み書き
- marks: マークの読み書き
あたりがあればいいと思う。
ところで面倒なことがある: スクリプトフレームは wasavi 本体とは異なるドメイン上の文書として存在させたい。これはスクリプトから wasavi の DOM とかを直接いじられたくないからなのだが、そうするとスクリプトと wasavi とのやりとりはクロスドメインメッセージングを通して行うことになる。つまり非同期ということになる。うーん。これはちょっといまいちなんじゃないか。複数回コマンドを発行するだけでも
wasavi.run('Ihello, world\u001b', function () {
wasavi.run('0cwbye\u001b');
});
みたいなネストしまくりコールバック地獄になってしまう。Deferred 的なライブラリを用意するのもちょっと根本的な解決とはいえない。それよりも同期式のほうがずっと単純でわかりやすい。generators が各ブラウザに実装されればなんとかなるんだけど。harmony に generators って入ってるんだっけ? 調べたら function* foo () {…} みたいな形で作るようになってるのか。早く実装されないかなー。
で、それを待ってもいられないので、仕方ないのでスクリプトフレームも wasavi と同じドメインの文書ということにして、もう window.parent 使って直接読み書きするしかないかもしれない。とりあえず元の window.parent はスクリプト上の wasavi オブジェクト内に閉じ込めて、スクリプトからは隠す的なことはすると思う。他に親フレームにアクセスする手段ってあったかな。多分なんかある。