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);
としたら上手くいった。
Filed under: Flash/AIR/Flex



