こんにちは、いろんな意味でlevel0なkijimaです。


Flash Player 10 のファイルアップロード仕様変更(セキュリティ関連)

akihiro kamijoさんの書かれた上記エントリーでも取り上げられていますが、FlashPlayer10のセキュリティ関連の変更によって、FileReferenceクラスを使用した動作に影響が出るようです。

特に注目したのは主な変更点の一つ目部分。

FileReference.browse() は ユーザのマウスかキーボードの操作に対するイベントハンドラ内で呼び出す

これがどういうことかというと、要はユーザーのマウスとキーボード操作と紐付いていないタイミングでのダイアログ表示を禁止する、というようなものですね。

実際にボタン操作など以外の場所でFileReference.browse()やdownload()を試してみると、下記のエラーダイアログが表示されます。

SecurityError: Error #2176: ポップアップウィンドウを表示するなどの特定のアクションは、 例えばマウスをクリックしたりボタンを押したりして、 ユーザによる相互作用が発生した場合にのみ呼び出されます。


※エラーログを表示させるにはデバッガ版FlashPlayer10をインストールしてください。
Adobe Flash Player Support Center


FlashPlayer10検証にはFlashSwitcherが便利

ここであえて話を脱線させますが、FlashPlayer10の動作検証には、FireFoxのアドオン「FlashSwitcher」が欠かせません。自分はFlashPlayer9と10のリリース版とデバッガ版両方を追加して、チェック時に切り替えています。

当然ながら普通のユーザーはデバッガ版FlashPlayerなんてものはインストールしていないので、エラーログさえ表示されず、ただ何も動かなくなる、という状況になってしまうことが容易に予測できます。はい、これはやばいですね。


さて、話を戻してここからは開発中、実際に遭ったケースでお話しします。

それは、「ボタンをクリックすると、画面をキャプチャしてサーバー経由でローカルに保存する」という動作内での出来事でした。処理ごとに流れを追うと、こんな感じになります。


1) ユーザーがステージ上のボタンをクリックする。
2) 画面をビットマップデータとしてキャプチャする。
3) データを JPEGバイナリデータに変換し(※)、サーバーに送信。DBに保存。
4) その戻り値として返すURLに保存された画像(先程キャプチャした画面)をローカルにダウンロードする。


※JPEGバイナリデータする方法はここに詳しく掲載されています。
Adobe - デベロッパーセンター : JPEG ファイルアップローダの構築


3) の処理、サーバー上のphpにURLRequestでリクエストして、リスナーがEvent.COMPLETEしたタイミング(ユーザーのマウス操作を離れたタイミング)でfileReference.download()メソッドを呼び出していたことが原因で、上記の#2176エラーにひっかかってしまいました。


ではどう対処したかというと、

今回は4) にあたる「指定のURLからローカルに画像をダウンロードする」部分はExternalInterface.callを用いて、JavaScript側の指定の関数を呼び出し(URLを引数に指定して)、まるっとJS側に任せて、zipファイルにしてダウンロードさせることにしました。


果たしてこの方法が良い解決法なのかバッドノウハウなのか。時間もなかったので、対処法がどうも付け焼き刃感なのが否めないですが、現状ではとりあえずエラーも出ないようなのでひとまず解決ということにしておきます…。

引き続き、当level0ブログではFlashPlayer10対応について調査していきます!

HTML5飯