Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2008-05-19chanserv

ファイル関連の関数追加した

| 16:36 |  ファイル関連の関数追加した - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  ファイル関連の関数追加した - Ci.nsIZIGOROu

function file(path) {
  var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  file.initWithPath(path);
  return file;
}

function url(aURL) {
  var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  var url = ios.newURI(aURL, null, null);
  return url;
}

function slurp(path) {
  var file = this.file(path);
  var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);

  fstream.init(file, -1, 0, 0);
  sstream.init(fstream);

  var data = "";
  var str = sstream.read(4096);

  while (str.length > 0) {
	data += str;
	str = sstream.read(4096);
  }

  sstream.close();
  fstream.close();

  return data;
}

あとresourceに簡単に追加出来る関数はこんなん、

function createResource(alias, filepath) {
  var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  var resProtocol = ioService.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
  var aliasFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  aliasFile.initWithPath(filepath);

  resProtocol.setSubstitution(alias, ioService.newFileURI(aliasFile));
}

ChristopherChristopher2012/09/28 18:11There is a critical shortage of infrotmiave articles like this.

bcskfetxmwbcskfetxmw2012/09/29 05:20wPzYXA <a href="http://mskjgsyfulye.com/">mskjgsyfulye</a>

xoicravirjxoicravirj2012/09/30 01:09R8uDa7 , [url=http://gbqpulptaobp.com/]gbqpulptaobp[/url], [link=http://yzjkswqqoywo.com/]yzjkswqqoywo[/link], http://jvhkpyeexcvu.com/

ysjvlscewysjvlscew2012/09/30 11:32PNyyAc <a href="http://kwjpltbwouwo.com/">kwjpltbwouwo</a>

yelvcsfuymjyelvcsfuymj2012/10/02 02:50LQci7N , [url=http://onwtzvmvqkct.com/]onwtzvmvqkct[/url], [link=http://pwzbknltpxfr.com/]pwzbknltpxfr[/link], http://chfaxyypvvmi.com/

2008-03-12グリス

今の拡張スクリプトを晒す

| 15:28 |  今の拡張スクリプトを晒す - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  今の拡張スクリプトを晒す - Ci.nsIZIGOROu

/**
 * browser startup service utility
 */
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); 
  }
}

/**
 * Open document for component from xulplanet.com
 */
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);
}

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

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

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

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

function getInterfaceInfoByInterface(iface) {
  if (iface instanceof this.Ci.nsISupports) {
    iface = iface.toString();
  }

  var iinfo = this.Cc["@mozilla.org/scriptableInterfaceInfo;1"].createInstance(this.Ci.nsIScriptableInterfaceInfo);
  iinfo.initWithName(iface);

  return iinfo;
}

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;
}

2007-12-06

re:MozReplの使い方がいまひとつよくわからない。

| 18:24 |  re:MozReplの使い方がいまひとつよくわからない。 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  re:MozReplの使い方がいまひとつよくわからない。 - Ci.nsIZIGOROu

聞いてくれればいいのにw

準備編

rlwrap, socatなどのコマンドラインツールと共に使うのが必須。

$ rlwrap telnet localhost 4242

そうしないでcmd.exeからtelnetとかやると、

repl> repl.home()[object ChromeWindow] MozReplの使い方がいまひとつよくわからない。

みたいになる。

せっかちな使い方

せっかちな人向けに言えば、

repl.inspect(repl);

プロパティがもりっと取れます。

メソッド名で推測するw *1

*1:あるいはrepl.search.toSource()とかね。

smellmansmellman2007/12/07 20:58meadow付属のtelnetを勧めてる俺ってマニアックだよね><

ZIGOROuZIGOROu2007/12/09 01:17んなこたーないですw
ってありましたね、そういうの。

Emacs連携もあるですよ>mozrepl

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