Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2007-08-03さらりとDIS

MozReplでcomponentsからxulplanetのドキュメントを開く

| 16:54 |  MozReplでcomponentsからxulplanetのドキュメントを開く - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  MozReplでcomponentsからxulplanetのドキュメントを開く - Ci.nsIZIGOROu

function docForComponent(comp) {
    if (comp instanceof this.Ci.nsIJSCID) {
        comp = comp.toString();
    }

    if (!comp || !comp.match(/^@mozilla.org/)) {
        return;
    }

    var window = this.Cc["@mozilla.org/appshell/window-mediator;1"].getService(this.Ci.nsIWindowMediator).getMostRecentWindow("");
    var url = "http://www.xulplanet.com/references/xpcomref/comps/c_" + comp.replace("@mozilla.org", "").replace(/[\/\-\?\;\=]/g, "") + ".html";

    window.getBrowser().addTab(url);
}

そのオブジェクトがどんなインターフェース実装してるか

| 15:28 |  そのオブジェクトがどんなインターフェース実装してるか - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  そのオブジェクトがどんなインターフェース実装してるか - Ci.nsIZIGOROu

nsISupportsをデフォルトで除外する事にしました。(ぉ

function getInterfacesByObject(obj, excludeSupports) {
  if (!excludeSupports) {
    excludeSupports = true;
  }

  var ifaces = [];

  for (var iface in this.Ci) {
    if (obj instanceof this.Ci[iface]) {
      if (excludeSupports && iface == "nsISupports") {
        continue;
      }

      ifaces.push(this.Ci[iface]);
    }
  }

  return ifaces;
}

配列で返ってきます。

合わせ技としては、

repl> repl.getInterfacesByObject(Cc["@mozilla.org/scriptableInterfaceInfo;1"]).forEach(repl.docForInterface);

とかで、実装しているinterfaceのドキュメントをnsISupportsを除いて全て開かせるなんて事が出来ますよん。

でinitUrlで指定したスクリプトを再読み込みさせたい場合は、

repl> repl.loadInit();

でおkです。

オレオレMozRepl万歳。

MozReplでinterfaceからxulplanetのドキュメントを開く

| 15:16 |  MozReplでinterfaceからxulplanetのドキュメントを開く - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  MozReplでinterfaceからxulplanetのドキュメントを開く - Ci.nsIZIGOROu

function docForInterface(iface, method) {
  if (iface instanceof this.Ci.nsISupports) {
    iface = iface.toString();
  }

  var window = this.Cc["@mozilla.org/appshell/window-mediator;1"].getService(this.Ci.nsIWindowMediator).getMostRecentWindow("");
  var url = "http://www.xulplanet.com/references/xpcomref/ifaces/" + iface + ".html";

  if (method) {
    url += "#method_" + method;
  }

  window.getBrowser().addTab(url);
}

MozReplにブラウザの再起動と停止機能をつける

| 14:56 |  MozReplにブラウザの再起動と停止機能をつける - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  MozReplにブラウザの再起動と停止機能をつける - Ci.nsIZIGOROu

var browser = {
  startUpService: Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(Components.interfaces.nsIAppStartup),
  restart: function() {
    this.startUpService.quit(Components.interfaces.nsIAppStartup.eForceQuit | Components.interfaces.nsIAppStartup.eRestart); 
  },
  stop: function() {
    this.startUpService.quit(Components.interfaces.nsIAppStartup.eForceQuit); 
  }
}

としてinitUrlに指定しておくと、

repl> repl.browser.restart()

とか、

repl> repl.browser.stop()

とかで再起動と停止が出来るお!

MozReplの拡張の仕方

| 13:25 |  MozReplの拡張の仕方 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  MozReplの拡張の仕方 - Ci.nsIZIGOROu

例えば /home/zigorou/.mozrepl/init.js とかに、

function hoge() {
}

とか書いて、extensions.mozlab.mozrepl.initUrlに

file:///home/zigorou/.mozrepl/init.js

としてFirefoxを再起動すると、replオブジェクトにhogeって関数が追加されまうす。

brazilbrazil2007/08/03 21:49ぼくも同じようなとこやってました。
http://d.hatena.ne.jp/brazil/20070628/1182993179
http://d.hatena.ne.jp/brazil/20070618/1182168542

ZIGOROuZIGOROu2007/08/04 02:23nsIScriptableInterfaceInfoはちょうどbrazilさんとほぼ同時期にやってました。
でも実はその先があってメソッド、メソッドのパラメタとか掘り下げる事が出来たり、idlの定義そのものが取れたり中々面白いですね。

その辺りまとめてこうかなと。
なんせメモらないと忘れるのでw