diff options
author | teramako | 2008-05-26 16:12:31 +0000 |
---|---|---|
committer | teramako | 2008-05-26 16:12:31 +0000 |
commit | 1c391fe327749d6a7dd6b9ce9d276603e44151eb (patch) | |
tree | 19b9f19a28d7d95895a2c2dbdea8d1da384ac38b /xpcom_inspector.js | |
parent | b0b935c56e525c68f9dfc31b6c32830f7e76e95f (diff) | |
download | vimperator-plugins-1c391fe327749d6a7dd6b9ce9d276603e44151eb.tar.bz2 |
new add
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@12482 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'xpcom_inspector.js')
-rw-r--r-- | xpcom_inspector.js | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/xpcom_inspector.js b/xpcom_inspector.js new file mode 100644 index 0000000..f5ea1bd --- /dev/null +++ b/xpcom_inspector.js @@ -0,0 +1,201 @@ +// ==VimperatorPlugin== +// @name XPCOM List +// @description list XPCOM Components (for developer) +// @description-ja XPCOMコンポーネントを表示(開発者用) +// ==/VimperatorPlugin== +// +// クラスとインターフェースの組み合わせを表示するためのプラグイン +// +// :lscc {class} {interface} +// +// タブ補完で遊んでください +// 第一引数はComponents.classesから正規表現にひっかかるものを補完 +// 第に引数はComponents.interfacesから(ry +// +// 完全なクラスとインターフェースを入力して実行すると、 +// createInstance or getService して使えそうなメソッドやメンバーを表示します +// +// 未補完でも大丈夫。適当に使えそうな組み合わせを表示してくれます +// +// 注意:あまりに組み合わせの多いクラスとインターフェースを表示しようとするとFirefox,Thunderbirdごと落ちます(ぉ +// (だれか直してー) +// +liberator.XPCOM = (function(){ +const Cc = Components.classes; +const Ci = Components.interfaces; + +function XPClass(class){ //{{{ + this.name = class; + var _interface; + this.__defineGetter__('interface',function(){ + if (_interface) return _interface; + _interface = {}; + var cl; + try { + cl = Cc[this.name].createInstance(); + } catch(e){ + try { + cl = Cc[this.name].getService(); + } catch(ex){ + liberator.log(this.name); + liberator.log(e); + return _interface; + } + } + for (var i in Ci){ + if (i == 'nsISupports' || i == 'IDispatch') continue; + var obj; + try { + obj = cl.QueryInterface(Ci[i]); + } catch(e){ + continue; + } + if (obj){ + _interface[i] = new XPInterface(this.name, i); + } + } + return _interface; + }); +} //}}} +XPClass.prototype = { //{{{ + get number(){ + return Cc[this.name].number; + }, + has: function(filter){ + var flag = false; + if (filter instanceof RegExp){ + for (var i in this.interface){ + if(flag = filter.test(i)) break; + } + } else { + flag = (interface in this.interface); + } + return flag; + }, + toString: function(){ + return this.name; + } +}; //}}} +function XPInterface(c, i){ //{{{ + this.interface = Ci[i]; + this.class = Cc[c]; +} //}}} +XPInterface.prototype = { //{{{ + get number() this.interface.number, + get name() this.interface.name, + get classNumber() this.class.number, + get className() this.class.name, + toString: function() this.name + ' of ' + this.className, + create: function(){ + var instance; + try { + instance = this.class.createInstance(this.interface); + } catch(e){ + try { + instance = this.class.getService(this.interface); + }catch(e) {} + } + return instance; + } +}; //}}} +function toKey(str){ + return str.replace(/[^\d\w](.)/g, function(m,p)p.toUpperCase()); +} +var tree = {}; +for (var c in Cc){ + var key = toKey(c); + tree[key] = new XPClass(c); + tree[c] = tree[key]; +} +// ---------------------------------------------- +// Commands +// ---------------------------------------------- +liberator.commands.addUserCommand(['lscc'], 'List XPCOM class', + function(arg){ + if (!arg){ + liberator.echoerr('No arguments'); + return; + } + var args = liberator.commands.parseArgs(arg).args; + if (args.length == 1){ + liberator.echo(liberator.XPCOM.listClass(args[0], null, true), true); + } else if (args[1] in Ci){ + var instance = tree[toKey(args[0])].interface[args[1]].create(); + echo(liberator.util.objectToString(instance,true) ,true); + } else { + liberator.echo(liberator.XPCOM.listClass(args[0], args[1], true), true); + } + },{ + completer: function(filter){ + if (!filter) return; + var args = liberator.commands.parseArgs(filter).args; + var list = []; + var position = 0; + if (args.length == 1){ + var reg = new RegExp(args[0],'i'); + for (var c in Cc){ + if (reg.test(c)) list.push([Cc[c].name, Cc[c].number]); + } + } else if (args.length == 2 && args[0] in Cc){ + var reg = new RegExp(args[1],'i'); + for (var i in tree[toKey(args[0])].interface){ + if (reg.test(i)) list.push([Ci[i].name, Ci[i].number]); + } + position = args[0].length + 1; + } + return [position, list]; + } + } +); +var manager = { + get all() tree, + toKey: function(class){ + return toKey(class); + }, + toHTML: function(list){ + var str = ['<dl>']; + list.forEach(function(o){ + str.push('<dt>' + o.name + ' ' + o.number + '</td>'); + if (o.interface){ + for (var i in o.interface){ + str.push('<dd>' + o.interface[i].name + ' ' + o.interface[i].number + '</dd>'); + } + } else { + for (var member in o){ + str.push('<dd>' + member + ': ' + o[member] + '</dd>'); + } + } + }); + str.push('</dl>'); + return str.join(''); + }, + listClass: function(cFilter, iFilter, format){ + var list = []; + if (!cFilter) return null; + cReg = new RegExp(cFilter,'i'); + iReg = new RegExp((iFilter ? iFilter : '.*'),'i'); + for (var c in tree){ + if (cReg.test(tree[c].name) && tree[c].has(iReg)){ + list.push(tree[c]); + } + } + if (format) return this.toHTML(list); + + return list; + }, + listInterface: function(iFilter, format){ + var list = []; + if (!iFilter) return null; + iReg = new RegExp(iFilter,'i'); + for (var i in Ci){ + if (iReg.test(i)) list.push(Ci[i]); + } + if (format) return this.toHTML(list); + + return list; + } +}; +return manager; +})(); + +// vim: sw=4 ts=4 sts=0 fdm=marker: |