この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2008年12月)

2008年12月17日

Bug 6302 [Win] windowlessのFlashでIMEが利用できない #2
初回投稿日時: 2008年12月17日05時25分59秒
最終更新日時: 2008年12月17日05時27分52秒
カテゴリ: Mozilla Core バグ修正
SNS: (list)

数ヶ月かかってようやく修正完了しました。

Windows版のGeckoはwindowlessプラグインに対して特定のネイティブイベントのみを仲介しています。なぜ全てのネイティブイベントを送信していないかと言うとパフォーマンスの問題や設計上の問題があるからです。

このバグの原因はどちらかというと後者の問題でした。Geckoのwidgetはネイティブイベントを元に、コンテンツがXPレベルで処理するためのGeckoイベントを生成します。プラグインのインスタンスをlayoutで管理しているnsObjectFrameはそのXPイベントに保存されているネイティブイベントをNPEventでwindowlessプラグインに渡しています。このため、Geckoが必要としていなかったイベントはwindowlessプラグインに送信されていなかった、ということが分かるかと思います。そう、解決策は送信していない必要とされているネイティブイベントを全て送信するだけです。実に単純な話でした。

ですが、実装は単純にはいきません。まず、IME関連のイベントは以前からGeckoイベントが存在していますが、これをそのまま流用する訳には行きません。Geckoイベントとネイティブイベントが1対1の関係には無いからです。また、それ以外のイベントもwindowlessプラグインがフォーカスを持っていない時にはこれらのイベントを送信する必要はありませんし、副作用の方が恐いので安全な方法を考えなくてはいけませんでした。

そのためにまず、新しいプラグイン専用のイベントを定義し、これを利用することで他のコンテンツがフォーカスを持っている場合の挙動に影響が出ないようにしています。そして、エディタ以外ではIMEは利用できないことを利用し、プラグインがフォーカスを持っている時には全てのネイティブなIMEイベントをそのまま新しいイベントで送信するようにしています。

ですが、Adobeとの調整に手間取ったこともあり、Fx3.1b2に修正が間に合わなかったので、NPEventの仕様をおおっぴらに変える訳にはいきません。そこで、Flash Playerの場合にのみ、新しいNPEventを生成するようにして、Flash Player以外でregressionが出ることを防止しています(Fx3.1後にこの制限を外して仕様書を変更予定)。

これでプラグイン側がwindowlessモードであっても本格的に対応することが可能となりました。Flash Player以外でも新しいイベントを送信して欲しいプラグインがある場合、そのベンダ側からリクエストがあればすぐにGecko側は対応できるようになっています。ですが、この新しいイベントをハンドリングする必要があるため、プラグイン側のアップデートも当然必要です。このため、実際にFlash PlayerのwindowlessモードでIMEを利用するには、新仕様のGeckoと、これに対応したFlash Playerの両方が必要になります。前者はFx3.1がその最初のリリースバージョンになる予定です。後者は既にAdobeからテスト用にもらったインターナルビルドでは実現されていますが、正式リリースの予定はまだ聞いていません。

ちなみに、windowlessモードは上記のメカニズムから分かるように、パフォーマンスには難があるのでWebサイトの開発者がこのモードを入力フォームに利用することは推奨しません(そもそもアクセシビリティの問題が大きすぎますが、その問題がなくてもです)。CSSとの親和性が高いのはwindowlessモードですので、windowlessモードを使わないといけない理由(CSSを利用したメニューと重なる場合や、半透明にしたい場合等)がある場合のみ利用すべきモードでしょう。

関連するかもしれないエントリ

bug 6302を含むエントリ

Bug 6302 [Win] windowlessのFlashでIMEが利用できない