Hebikuzure's Tech Memo

2012年1月30日

IE9 や IE10 でタブごとに IME の状態が分離される事について

Filed under: Internet Explorer — hebikuzure @ 8:10 PM

Internet Explorer 9 や Internet Explorer 10 ではタブごとに IME の状態が分離されており、一つのタブで変更したIME のモードは別のタブには引き継がれません。
これは以下のようにして確認する事ができます。
  1. 一つのタブを開いてそのページ内のフォーム(input type=”text” など)で IME をオン(ひらがなモードなどの日本語変換モード)にする
  2. 新しいタブを開き、同様にフォームのあるページに移動する
  3. 新しいタブのページ内のフォームにフォーカスする

この現象について、こちらのブログで Microsoft にフィードバックを行った結果について書かれています。このフィードバックに対して Microsoft の行った対処は、Windows 8 では IME の設定に “Let me set a different input language for each app window”(個々のアプリケーションのウィンドウごとに異なる IME の設定を許可する)という項目を追加し、IME の設定をログオン セッション全体で共通にできるようにする、という方法でした。
ただし前記のブログに書かれているように、この設定をオフにすると IE のタブ間で IME の状態が引き継がれるだけでなく、Windows で起動されているすべてのアプリケーションで IME の状態が共通になってしまいます。

(2011/1/31 追記:検証の結果、単純に LCIE だけが原因ではないと判明したので、以下の部分の説明は取り消します。)
どうしてこうなるのかと言えば、それは IE8 以降の Internet Explorer の動作モデルとして LCIE(Loosely-Coupled IE)が採用され、タブごとにプログラムのプロセスが分離されているからに他なりません。つまり IE9(や IE10)では、一つのウィンドウ内に複数のタブがあるので全体として一つのプログラムであるように見えますが、実際にはタブごとに同じ iexplore.exe(Internet Explorer の実行プログラム名)の別のプロセスが動作しているのであり、Windows 見れば同じプログラムが複数起動しているのと同じ状態になっています。そのため Windows 内で起動している個々のプログラムでは IME の状態も別々になるのと同じように、IE のタブ間でも IME の状態は別々になるのです。逆に、IE のタブ間で IME の状態を共通にしようと思うと、Windows 上のすべてのプログラムで IME の設定を共通にする必要がある訳です。

タブごとに iexplore.exe のプログラムが起動している様子は、タスク マネージャーの [プロセス] タブで観察できますし、さらに詳細には Process Explorer でも確認できます。

同じタブ ブラウザーでも Googel Chrome や Firefox、Opera ではこうした動作にはならず、同じウィンドウ内のタブ間では IME の状態は共通になります。これは Firefox や Opera ではタブごとにプロセスが分離されておらず全体で一つのプロセス(firefox.exe や opera.exe)となっており、Chrome ではタブごとに chrome.exe のプロセスが割り当てられるのですが LCIE のように分離が徹底されておらず、IME からは Chrome のウィンドウ全体に割り当てられている chrome.exe のプロセス一つが動作しているように見えるためです。(ここの説明はかなり簡略化しています)

(ここから 2011/1/31 追加)
このような動作となっている背景としては、IE8 以降の Internet Explorer の動作モデルとして LCIE(Loosely-Coupled IE)が採用され、タブごとにプログラムのプロセスが分離されている事があると思われます。IE9 (や IE10)では、一つのウィンドウ内に複数のタブがあるので全体として一つのプログラムであるように見えますが、実際にはタブごとに同じ iexplore.exe(Internet Explorer の実行プログラム名)の別のプロセスが動作しており、それを Internet Explorer 全体のウィンドウを管理しているプロセス(フレーム プロセスとも言います。これも実行ファイル名としては iexplore.exe)が束ねている形になります。そして IME の状態はそれぞれのタブのプロセスに紐づいているのではないかとの推測もできます。

タブごとに iexplore.exe のプログラムが起動している様子は、タスク マネージャーの [プロセス] タブで観察できますし、さらに詳細には Process Explorer でも確認できます。

このようなモデルにすると、一つのタブ内のページで深刻なエラー(例えばアドオンのクラッシュやスクリプトの無限ループ)が発生しても、そのタブのプロセスだけ再起動すればよく、他のタブやそこで開かれているページには影響を与えません。つまりブラウザー全体の動作を堅牢にし、エラー発生の際のユーザーへの影響を最小限にする事ができます。また再起動されたタブでもその影響を最小限にするため、タブで開いていたセッション情報(Cookie や一時ファイル、場合によってはフォームへの入力内容など)が復元されるよう、フレーム プロセスがそれぞれのタブのプロセスを監視し、必要な情報を保持しています。(Automatic Crash Recovery という機能です) タブごとの IME の状態についてはこの機能でも管理しているかもしれません。

そこで実験としてこちらのページに書かれている方法でタブ プロセスの分離を無効にし、タブ間での IME の挙動がどうなるか試してみました。その結果、TabProcGrowth 値を 0 にして Internet Explorer 9 のすべてのタブが一つの iexplore.exe で実行されるようにしても、タブ間で IME の状態は別々に保持されている事が確認できました。つまり各タブの IME の状態はタブごとのプロセスだけでなく IE のフレーム プロセスでも保持されており、タブ プロセスを分離しなくともタブごとに IME の状態が個別に保持される動作です。

なお同じタブ ブラウザーでも Googel Chrome や Firefox、Opera では Internet Explorer と異なり、同じウィンドウ内のタブ間では IME の状態は共通になります。これらのブラウザーでは個別のタブの情報として IME の状態を管理していないと思われます。

Windows 8 の “Let me set a different input language for each app window”(個々のアプリケーションのウィンドウごとに異なる IME の設定を許可する)という設定は、こうした個別のプログラムごとの IME の状態を無視し、Windows 全体(正確に言えば一つのログオン セッション全体)で一つだけの状態を共有するように強制する設定なのでしょう。
(ここまで 2011/1/31 追加)

タブごとに IME の状態が別々になるのか、共通になるのか、どちらの動作が好ましいのかについては議論があるでしょう。しかし Internet Explorer が目指している方向、もう少し広げて言うとモダン ブラウザーの志向を考えると、タブごとに IME の状態が別々に保持できる、今の IE の動作の方が良いのではないかと思います。ブラウザーは Web アプリケーションのプラットフォームである、という方向性を考えれば、ブラウザーのタブ一つ一つはそれぞれ別々の Web アプリケーションのフレームになります。そうすると、Windows 上の各アプリケーションのウィンドウごとに IME の状態が別々である方が良いのと同様、タブについても IME の状態は別々の方が良いでしょう。

具体的なシナリオで考えれば、次のように言えるでしょう。

  1. ブラウザーを起動して、SNS のサイト(Web アプリケーション)を開きます。ここでは投稿をしたいので IME を日本語入力モードにします
  2. 次に新しいタブでスプレッドシートの Web アプリケーション(例えば Excel Webapp や Google ドキュメントなど)を開いて、集計表にデータ入力をします。ここでは数値を連続して入力したいので、IME は英数入力モードにします
  3. さらに新しいタブを開き、ワードプロセッサのWeb アプリケーションを開きます。文書を作成するので IME を日本語入力モードにします

この状態で、SNS とスプレッドシートとワードプロセッサのタブを切り替えていく場合、IME の状態が共通になるのと別々に保持できるのと、どちらが使いやすいでしょうか。Windows 上の(ネイティブ)アプリケーションとの同一性という点からも、また実際の使い勝手からも、IME の状態が別々の方が便利であるのは明らかでしょう。

確かに一つの Internet Explorer のウィンドウ内で IME の状態が異なるのは、最初は若干の違和感があるかもしれません。またこうした動作は個々の好みもあるでしょうから一つの考え方を押しつけられたくない、という考え方ももちろんあるでしょう。ただ、上記のように今後のブラウザーの使われ方に沿って考えると、むしろ良い動作ではないかと思います。

(2011/1/31 追記) 個人的な感想としては、他のブラウザーとの操作感の共通化という視点も考え、「タブごと別々」/「タブ間共通」どちらの設定にもユーザーが任意に設定できると一番良いのではないかと思います。実装としては結構面倒ではないかとも思うので、やっぱりこれは難しいのかなあ。それと他のブラウザーも(前述のような理由で)IE と同じような動作になって行くのかもしれません。

皆さんのご意見があれば、ぜひコメントをください。

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

WordPress.com Blog.

%d人のブロガーが「いいね」をつけました。