X-0019 現在開いている各 XUL アプリのウィンドウを得る

window.opener を使う

あるウィンドウからダイアログを開き、そのダイアログから元のウィンドウを参照する場合には、 Web ページを操作するときの JavaScript と同様、 window.opener プロパティが利用できます。 opener で取得した XULWindow のオブジェクトには、そのウィンドウで定義された関数がメソッドとして登録されていますから、例えば Navigator ウィンドウで開いたダイアログから、元の Navigaotr に別のページを読み込ませる操作をするなら、 window.opener.loadURI('http://...') という具合に書けば OK です。

nsIWindowMediator を使う

WindowMediator とは?

「元ウィンドウ」以外のウィンドウやダイアログを参照するには、 Web ページではよく使われる window. ウィンドウ名 というアクセス方法は使えません。 XUL ではその代わりに WindowMediator を使うことになります。

// const windowManagerID = '@mozilla.org/rdf/datasource;1?name=window-mediator'; // NS6 などではこちら
const windowManagerID = '@mozilla.org/appshell/window-mediator;1'; // Mozilla 1.0 以降ではこちら
const windowManagerIF = Components.interfaces.nsIWindowMediator;
const windowManager   = Components.classes[windowManagerID].getService(windowManagerIF);

WindowMediator では、各ウィンドウをウィンドウタイプ名で識別して処理します。ウィンドウタイプは、 XUL の window/dialog/page などのルート要素に windowtype="navigator:browser" といった書式で自由に記述(定義)できます。例えば Mozilla 標準の各ウィンドウなら、 Navigaotr は navigator:browser 、 Composer は composer:html 、 Mail は mail:3pane となっています。

最近アクティブだったウィンドウを得る

WindowMediator には、そのタイプ名のウィンドウの中で最近アクティブだったウィンドウを返す getMostRecentWindow() というメソッドがあります。使い方は以下の通りです。

var target_window  = windowManager.getMostRecentWindow('navigator:browser');
var document_title = target_window.getBrowser().contentDocument.title;

タイプ名の代わりに null を渡すと、すべてのウィンドウの中で最近アクティブだったものを返します。

すべてのウィンドウを得る

指定のタイプ名のウィンドウすべてを配列として得る場合は、 getEnumerator() メソッドを使います。このメソッドの返り値は nsISimpleEnumerator の形なので、実際の各ウィンドウの Window オブジェクトを得るには、以下のような書き方をすることになります。

var targets = windowManager.getEnumerator('navigator:browser');
var target;
while (targets.hasMoreElements())
{
   target = targets.getNext();
   target = target.QueryInterface(Components.interfaces.nsIDOMWindowInternal);

   alert(target.getBrowser().contentDocument);
}

このメソッドも、 getMostRecentWindow() 同様、タイプ名の代わりに null を渡すことで、ウィンドウタイプ名に関係なくすべてのウィンドウを取得することができます。