AIRでタブブラウザとか無理

Flexの学習がてら、タブブラウザを作ってみようとして断念したというお話。

HTMLコンポーネントを使えば楽勝かと思ったのだけれど、入力されたURLが無効だった場合に、例外なりエラーイベントなりを吐く機能がHTMLコンポーネントにない。
HTMLHostのupdateStatusメソッドを使えばチェックできるのだろうかと試してみたけど、できなかった。

ならばと、URLへのアクセスはURLLoaderで行い、取得したページデータをHTMLコンポーネントのhtmlTextにセットすることに。
これならエラーイベントはもちろん、progressイベントも取れて嬉しいし。

でもお次は、そうして表示したWebページの中のリンクがクリックされたときのページ遷移をコントロールできない。
こちらとしては、HTMLLoaderのデフォルトのページ遷移機能をOFFにして、URLLoaderを噛ませる自前の機能で処理したいわけだけど、デフォルトの機能をOFFにする方法が分からない。

まぁ、アクロバティックな方法として、HTMLLoaderにはtarget=”_blank”なリンクはページ遷移しない仕様があるので、ページ内のすべてのリンクをtarget=”_blank”に書き換えてやれば、デフォルトの機能をOFFにできる。
どうせタブブラウザするのだから、target=”_blank”の指定は書き換えて問題ないわけだし。

この方法で進めれば・・・と思ったのだけど、待てよと。
フレーム内でのページ遷移やら、フォーム送信でのページ遷移やら、JavaScriptでのページ遷移やら、いろいろ考慮しなきゃいけないことがあるなぁと思ったら、面倒くさくなっちゃった。

ちょうどSafari 4のニュースを目にもして、「AIRでタブブラウザ作ったところで、どうせ・・・」みたいな気持にもなってしまったことだし。

それにしても。
どうしてHTMLコンポーネント(あるいはHTMLLoader)がhttpStatusやioErrorイベントを吐くように設計しなかったんだろう。
えらい人の考えることは分からん。

せめてもの、ノウハウをひとつ。
HTMLコンポーネントで自前のHTMLLoaderを使いたいとき。
普通にHTMLコンポーネントのインスタンスを生成して、htmlLoaderやhtmlLoaderFactoryプロパティに値をセットしても上手くいかなかった。

そこで、まずHTMLコンポーネントのサブクラスを作って、そのコンストラクタのsuper()後で
htmlLoaderFactory = new ClassFactory(MyHTMLLoader);
としたら上手くいった。

Leave a Reply