Firefox上のFlash Playerで、保護モードが有効でもIMEが利用できるようにする方法
初回投稿日時: 2013年03月15日20時33分51秒
最終更新日時: 2013年03月19日14時26分00秒
カテゴリ: Firefox Flash Mozilla Core plugin Windows
SNS:
Tweet (list)
最初に断わっておきますが、これはユーザがどうこうする話ではなくて、Web開発者向けの話です。ただ、利用しているサイトでこの問題で困っていて、保護モードを切るのに抵抗がある方は、このエントリをそのサイトの運営者の方に報告してください。ひょっとすると対策をとってくれるかもしれません。
ではまず、この問題のおさらいですが、Windows版のFlash PlayerはFirefox上で動く場合にのみ、保護モードという、内部処理を権限が制限されたプロセスで動かすモードを有効にして動いてることは、これまで何度かここに書いてきました。このモードの最大の問題は、WindowsのIMEというのは、利用しているアプリの一部としてロードされ、動作するため、制限されたプロセス内でロードされてしまうと、変換エンジンが別プロセスの場合、そのプロセスと通信できなかったり(Google日本語入力のケース)、かな入力を行うためのカナロックを自動的にかけることができなかったり(Google日本語入力以外と、ATOK 2013で『自動カナロックの詳細設定』ダイアログで『ATOKの内部状態を優先する』にチェックを入れていない場合)、といった、IME自体にまで動作制限がかかってしまうことがその原因でした(この件に関しては、Windows版Flash Player 11.3と各IMEの動作確認表 (もちろん非公式)も参照してください)。
ユーザ側での対抗策として、これまでは保護モードを無効にすることを紹介していましたが、今回、テスト中にたまたま見つけた、Webサイト側でとれる対策を紹介します。その対策とは実にシンプルで、param
要素で、wmode
をopaque
か、transparent
に指定し、Flash Playerをwindowlessモードで動かすことです(windowedモードと、windowlessモードの違いについては、Windows版Firefoxのwindowed modeとwindowless modeそれぞれのプラグインの構造を参照してください)。
以下、実例です。Flashコンテンツを作るツールを持っていないので、bugzilla-jpに添付されていたswfファイルを拝借してきました。実際に、Webコンテンツを作られている方は、wmode
を指定するparam
要素を挿入するかどうかは、UA名にFirefoxが含まれているかどうか、Windows版かどうか、この二点を確認した上で挿入した方が良いでしょう。一般的に、windowlessモードは各ブラウザの実装のバラツキが大きいためです。
- wmode指定なし (windowedモード)
- wmode opaque (windowlessモード)
- wmode transparent (windowlessモード)
なぜこれで、IMEに関する互換問題が一掃されるのか、その理由は簡単です。
windowedモードでは、Flash Player自身がネイティブウインドウをFirefoxの上に保護モードで作り、このウインドウがフォーカスを持ち、入力されたメッセージを保護モードで処理します。このため、IMEは保護モード下で動作し、上述の制限を受けることになります。
これに対し、windowlessモードでは、Flash Playerのプロセスは自分自身でウインドウを生成しません。Flashの内容が、Firefoxのウインドウ上に、直接描画されるモードだからです。このため、IMEのイベントを受け取るのはFirefox自身のウインドウになります。これはつまり、IMEは保護モードの外、Firefoxのプロセス内で動作します。このため、通常の権限でIMEが動作することになります。Firefoxは、受け取ったIMEのイベントを、内部処理専用のDOMイベントを利用して、フォーカスを持ったwindowlessプラグインのプロセスへ渡します。これにより、IMEがFlash上でも使えるのです。
ただし、一つだけ、このwindowlessモードには欠点があります。それは、on-the-spotでIME経由で入力できないということです。つまり、未確定文字列が、点滅するキャレットの位置に描画されません。これは、Windowsでは、アプリ自身が未確定文字列を描画する場合や、候補ウインドウ位置を指定する時にはWindowsのAPIを通じて、動作中のIMEのコンテキストにアクセスしなければいけないのですが、別プロセスのコンテキストにアクセスすることはセキュリティ上、できないため、このようなことになります。
この件に関しては、そのうちに、プラグインの描画領域のすぐ下にでも表示されてマシになるように、対策はとりたいとは考えています。