Now browsing the archives for 1月, 2008.

nsIPopupBoxObject::setConsumeRollupEvent

ポップアップを開いた状態でポップアップの外側のどこかをクリックしたときの挙動は、ウィジェットやプラットフォームに依存する。わかりやすい例として、コンテントエリア内で右クリックメニューを開き、そのままページ内のどこかのハイパーリンクをクリックすると、

プラットフォーム 挙動
Windows ポップアップが閉じ、リンク先へ遷移する
Linux ポップアップが閉じるだけ
Mac ポップアップが閉じるだけ

これに対して、検索バーの検索エンジンのドロップダウンリストを開いた状態で、コンテントエリア内のハイパーリンクをクリックしたときの挙動は、プラットフォームによらずドロップダウンリストが閉じるだけで、リンク先へは遷移しない。

このように、ポップアップの外側をクリックしたときにポップアップを自動で閉じる(ロールアップする)だけで、実際にクリックした何かに対するクリックイベントが発生しないような挙動のことを、「クリックの横取り」と呼ぶ。クリック横取りに関する動作仕様の詳細は、 nsMenuPopupFrame::ConsumeOutsideClicks のソース内に記載されており、通常は以下のルールに従った挙動となる。

ウィジェットの種類 ポップアップの親要素 挙動
メニュー <menu> か <popupset> Windows: クリックの横取りなし
Linux / Mac: クリックの横取りあり
オートコンプリート <textbox type=”autocomplete”> プラットフォームによらず、クリックの横取りなし
コンボボックス <menulist> プラットフォームによらず、クリックの横取りあり

Firefox 3 では新たに追加された nsIPopupBoxObject::setConsumeRollupEvent メソッドを使って、クリックの横取りの動作仕様を無理やり変更できるようになった。このメソッドの引数は3種類あり、0(デフォルト、ウィジェット・プラットフォーム依存)、1(クリックの横取りを強制的にありにする)、2(クリックの横取りを強制的になしにする)の3種類が指定可能である。実際に試すために以下の手順を試す。

  1. テストケースを開く
  2. [ROLLUP_DEFAULT] ボタンをクリックしてポップアップを開く
  3. ポップアップを開いたまま [TEST] ボタンをクリックする
  4. [ROLLUP_CONSUME] ボタンについても同様に手順2~3を繰り返す
  5. [ROLLUP_CONSUME] ボタンについても同様に手順2~3を繰り返す

すると、 Windows + Firefox 3.0b3pre では期待通り以下の結果が得られたものの、 Linux / Mac + Firefox 3.0b3pre では期待に反した結果となった。

最初に押下するボタン プラットフォーム [TEST] ボタン押下後の挙動
[ROLLUP_DEFAULT] Windows ポップアップが閉じるだけ
Linux ポップアップが閉じるだけ
Mac ポップアップが閉じるだけ
[ROLLUP_CONSUME] Windows ポップアップが閉じるだけ
Linux ポップアップが閉じるだけ
Mac ポップアップが閉じるだけ
[ROLLUP_NO_CONSUME] Windows ポップアップが閉じてダイアログが表示
Linux ポップアップが閉じるだけ
Mac ポップアップが閉じるだけ

どうやら Linux / Mac では nsIPopupBoxObject#setConsumeRollupEvent の引数に ROLLUP_NO_CONSUME を渡したときの効果が何も無いようなので、 Bugzilla へバグを立ててみた。ここまで自分が述べたことに確信を持っているわけではないので、有識者の判断を待つこととする。

Bug 411903 – nsIPopupBoxObject#setConsumeRollupEvent has no effect on Linux

関連記事

Firefox 3 でのポップアップ仕様変更
nsIPopupBoxObject::enableRollup
nsIPopupBoxObject::enableKeyboardNavigator

TOP

XULPlanet の未来

入門者のためのチュートリアル、各種オブジェクトやXPCOMのリファレンスとして長らく重要な役目を果たしてきた XULPlanet であるが、ここにきて転換期を迎えているようだ。

チュートリアルの内容はすでに MDC へ移行しており、 XULPlanet の内容はもはや古くなってしまっている。チュートリアルの作者でもある Neil Deakin 曰く、今後唯一期待できることは Firefox 3 リリース後に XPCOM リファレンスの内容を一括アップデートする程度であるとのこと。 XULPlanet を生き返らせるための何か新しい道を模索するか、あるいはすべてのコンテンツを削除して単なる MDC へのリダイレクトへとするか、問われている。

個人的にはチュートリアルには大変お世話になったし、 XPCOM のメソッドの使い方とかは未だに XULPlanet で検索することがあるので、完全に無くなってしまうのは惜しい気がする。

TOP

JavaScript コードモジュール

Using JavaScript code modules – MDC の和訳が完了した。
「JavaScript コードモジュール」とは、 Firefox 3 の JavaScript 製 XPCOM で頻繁に見かける以下のようなやつのことです。

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

上記の例のように共通で使用するユーティリティ的な関数群をモジュール化して、色々な場所からインポートして利用することができるだけでなく、あらゆる JavaScript のスコープで共有可能なシングルトンのオブジェクトとしての利用も可能です。今までは同様のことを実現するためには JavaScript 製 XPCOM の定義が必要であり、若干敷居が高かった。

まあ Firefox 3 以降ということで実践投入はだいぶ先のことになりそうだが、 JavaScript コードモジュールによって拡張機能の実装方式の自由度が高まることは間違いないでしょう。

TOP