Firefoxでのフルスクリーン時のwindow.openの挙動

かなり今更感があるんだけど、Firefox 21にて、フルスクリーンモード時にwindow.openが開かれた場合の挙動に変更を入れたのでそれについての解説。

まず、Firefox でのフルスクリーンモードは3種類ある。

  1. Windows, Linux, (あとは10.6までのOSXの)、アプリケーション自体のフルスクリーンモード
  2. OS X 10.7以降に投入された、OS Xのアプリケーションのフルスクリーンモード
  3. DOM Fullscreen APIを用いたフルスクリーンモード

従来はこのいずれの状態にあっても、window.openで新規ポップアップを開く場合には新規ウィンドウを開いていたんだけど、これだと2のOS Xのフルスクリーンモード時に、毎回遷移アニメーションを伴って新規ウィンドウを開いて著しくダルいので、Safariのようにちゃんと、フルスクリーンモード中にwindow.openでポップアップウィンドウが開かれる場合は新規タブで開くように変更を入れた( 803675 – Popup always should be opened in tab on fullscreen mode )(contentから呼び出したとき限定)。

これだけだとOS X以外のユーザーには全く関係ないように思えるんだけど、この変更は新しく隠し設定として browser.link.open_newwindow.disabled_in_fullscreen を追加する事で実現している。よって、これをtrueに設定すれば、OS Xのユーザー以外も変更された挙動を試す事が出来る。

ところで、全てのプラットフォームの殆どのGUIデスクトップ環境のウィンドウマネージャに共通するものとして、

  1. あるアプリのウィンドウAがフルスクリーン状態にある
  2. (アプリはなんでもいいけど)新規ウィンドウBが開かれる(ここではBにフォーカスがあたっている)
  3. フォーカスをウィンドウAに戻す
  4. ウィンドウBは背後に隠れてしまって、操作できなくなってしまう

という問題があると思っていて、WindowsだったらAlt+Tabで切り替えられるけど全てのプラットフォームで解決できる問題じゃないし、そもそもショートカット使わないといけないのはダサいし面倒くさい。

というわけで、このダルい問題を解決すべく、本当は全てのプラットフォームで今回の変更をデフォルトONにしたかったんだけど、変更に伴うリスクなどを考慮した結果、OS XでだけデフォルトONにしたという経緯がある(コード的にも、デフォルト設定値だけプラットフォーム事にプリプロセスした方が綺麗になるからだったりする)。

一通りのテストケースは追加してあるし、今の所リグレッションも無いので大丈夫だとは思うけど、何か問題ありましたら報告をお願いします。