Now browsing the archives for 6月, 2006.

ユーザ名とパスワードを入力するプロンプト

ユーザ名とパスワードを入力するプロンプトはわざわざ自前で作らなくても nsIPromptService で可能。なお、 promptUsernameAndPassword メソッドの6,7番目の引数を利用してチェックボックス付きのプロンプトにすることもできる。

var user = { value : "" }, pass = { value : "" };
var promptSvc = Cc["@mozilla.org/embedcomp/prompt-service;1"]
                .getService(Ci.nsIPromptService);
var ret = promptSvc.promptUsernameAndPassword(
  window, "Authorization", "Enter username and password.", 
  user, pass, null, {}
);
if (ret)
  alert("user:" + user.value + "
pass:" + pass.value);
else
  alert("canceled.");

リファレンス:
Interface Reference – nsIPromptService

TOP

パスワード管理

Webサービスを利用するXULアプリでは、たいていの場合、ログインするためのユーザ名やパスワードが付きものだ。入力したユーザ名やパスワードを記憶するために、 nsIPrefService などを利用して pref.js へ保存する?それは簡単だが好ましい方法ではない。
XULにはURIに関連付けてユーザ名やパスワードを管理する仕組みがきちんと提供されているのである。パスワードを保存したり削除したりするには nsIPasswordManager を、保存されたパスワードを問い合わせるには nsIPasswordManagerInternal を利用する。

const PM  = Cc["@mozilla.org/passwordmanager;1"].getService(Ci.nsIPasswordManager);
const PMI = Cc["@mozilla.org/passwordmanager;1"].getService(Ci.nsIPasswordManagerInternal);

例えば、 http://www.example.com に関連付けられたパスワードを問い合わせるには、以下のようにする。

var host = { value : "" }, user = { value : "" }, pass = { value : ""};
try {
  PMI.findPasswordEntry("http://www.example.com", null, null, host, user, pass);
}
catch (ex) {
  // 該当するユーザ名やパスワードが見つからない
}
alert("host:" + host.value + "
user:" + user.value + "
pass:" + pass.value);

http://www.example.com のユーザ名 foo のパスワード bar を保存するには、以下のようにする。どうやら同じユーザ名で別のパスワードを保存しようとしてもうまくいかないようなので、一度 removeUser で削除した後、 addUser で追加するという方法である。

try {
  PM.removeUser("http://www.example.com", "foo");
}
catch (ex) {
  // ユーザ名 foo が存在しない場合、例外発生
}
try {
  PM.addUser("http://www.example.com", "foo", "bar");
}
catch (ex) {
  // 何らかの例外
}

なお、Firefox では保存されたユーザ名やパスワードが ツール > オプション > プライバシー > パスワード > 保存されているパスワードを表示 でパスワードマネージャを開くことができる。

リファレンス:
Interface Reference – nsIPasswordManager
Interface Reference – nsIPasswordManagerInternal

TOP

タブに開いたchromeウィンドウからタブを閉じる

ブラウザタブに chrome:// のURLをロードして読み込まれた Window から、タブを閉じる方法。
単純に Window 内で window.close(); してやればタブは閉じられる。
しかし、タブが残りひとつであった場合、ウィンドウ自体も閉じられてしまう。
これを防ぐには、親のブラウザウィンドウを参照し、 cmd_close コマンドを実行すれば良い。
タブ内の Window から親のブラウザウィンドウを参照するには、 nsIWindowMediator を利用すれば良い。ただし、最後に使用したブラウザウィンドウが親のブラウザウィンドウであるという前提条件付きである。

var winMed = Components.classes['@mozilla.org/appshell/window-mediator;1'].
             getService(Components.interfaces.nsIWindowMediator); 
var browserWin = winMed.getMostRecentWindow("navigator:browser");
browserWin.document.getElementById("cmd_close").doCommand();

TOP