如果会阅读E文文档,那么阅读一下
这个,
这个和
这个是很有帮助的。
在上一篇 日志的基础上,加一个XPCOM应该不是很难的事情。
在firefox3.0之后,引入了方便javascript XPCOM编写的XPCOMUtils,在MDC的
教程上有两个版本的示例代码。本着一切从简的原则,区区把不用XPCOMUtils的
版本照抄了一个。。
编写HelloWorld.idl:
再来就是运行命令行编译:
{sdk_dir}/bin/xpidl -m typelib -w -v -I {sdk_dir}/idl -e HelloWorld.xpt HelloWorld.idl
在此区区强烈建议把.idl文件.xpt文件和.js目前都放在myapp/components目录下,这样可以省却很多麻烦。
好,区区编写HelloWorld.js实现这个XPCOM:
首个版本代码参见 http://developer.mozilla.org/en/docs/How_to_Build_an_XPCOM_Component_in_Javascript
基本上只是contract_id不同。
剧情预告就是,区区这样编写的.js无法启用,xulrunner和firefox3.0(是D,火狐也可当xulrunner用)通通报错说找不到class。
然后在把main.xul的windows tag的内容改成:
接着就是在main.js中加入函数:
反复试了多遍之后,我总结觉得不用XPCOMUtils实现的代码太长(许多时候错误都与代码长度成正比),加入
翻看了几个其它官方的xpcom都用XPCOMUtils了,所以痛下决心写了第二个HelloWorld.js:
代码目前都正确了,但是要让main.xul运行起来有期望的行为,还得注意下面几个事情:
1.要变更一下application的BuildID,不然XPCOM不会重注册
2.要认真查看代码中的语法错误,或者拼写错误。(区区花了半小时才发现自己错把最后一下HelloWorld写成Helloworld)
3.如果还是运行不起来,在尝试各种xulrunner的调试和跟踪方法。如以-console来启动xulrunner
注意:在这个XPCOM实现中,区区试用了wrappedJSObject技巧,这个技巧好处是不用重新编译IDL和typelib就可以让XPCOM拥有新的接口,这对于js这样的动态语言来说再自然不过,而且在开发测试时很有用~
一番折腾后,深切体会到mozilla平台在调试、文档、版本管理方面与emacs的差距啊。。。
在上一篇 日志的基础上,加一个XPCOM应该不是很难的事情。
在firefox3.0之后,引入了方便javascript XPCOM编写的XPCOMUtils,在MDC的
教程上有两个版本的示例代码。本着一切从简的原则,区区把不用XPCOMUtils的
版本照抄了一个。。
编写HelloWorld.idl:
#include
"
nsISupports.idl
"
[scriptable, uuid( 53E1581F - FFFF - 4b0f - 8FF0 - 02FC75F3698D)]
interface nsIHelloWorld : nsISupports
{
string hello();
} ;
[scriptable, uuid( 53E1581F - FFFF - 4b0f - 8FF0 - 02FC75F3698D)]
interface nsIHelloWorld : nsISupports
{
string hello();
} ;
再来就是运行命令行编译:
{sdk_dir}/bin/xpidl -m typelib -w -v -I {sdk_dir}/idl -e HelloWorld.xpt HelloWorld.idl
在此区区强烈建议把.idl文件.xpt文件和.js目前都放在myapp/components目录下,这样可以省却很多麻烦。
好,区区编写HelloWorld.js实现这个XPCOM:
首个版本代码参见 http://developer.mozilla.org/en/docs/How_to_Build_an_XPCOM_Component_in_Javascript
基本上只是contract_id不同。
剧情预告就是,区区这样编写的.js无法启用,xulrunner和firefox3.0(是D,火狐也可当xulrunner用)通通报错说找不到class。
然后在把main.xul的windows tag的内容改成:
<
vbox
align
="center"
>
< caption label ="Hello World" />
< caption label ="Javascript World" />
< button label ="XPCOM" onmousedown ="onXPCOMClick(event)" />
</ vbox >
< caption label ="Hello World" />
< caption label ="Javascript World" />
< button label ="XPCOM" onmousedown ="onXPCOMClick(event)" />
</ vbox >
接着就是在main.js中加入函数:
function
onXPCOMClick(event)
{
try {
alert(Components.interfaces.nsIHelloWorld);
var myComponent = Components.classes['@joyer.huang/helloworld;1']
.createInstance(Components.interfaces.nsIHelloWorld);
alert(myComponent.hello());
alert(myComponent.wrappedJSObject.pi());
} catch (anError) {
alert("ERROR: " + anError);
}
}
try {
alert(Components.interfaces.nsIHelloWorld);
var myComponent = Components.classes['@joyer.huang/helloworld;1']
.createInstance(Components.interfaces.nsIHelloWorld);
alert(myComponent.hello());
alert(myComponent.wrappedJSObject.pi());
} catch (anError) {
alert("ERROR: " + anError);
}
}
反复试了多遍之后,我总结觉得不用XPCOMUtils实现的代码太长(许多时候错误都与代码长度成正比),加入
翻看了几个其它官方的xpcom都用XPCOMUtils了,所以痛下决心写了第二个HelloWorld.js:
const Cc
=
Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
Components.utils.import( " resource://gre/modules/XPCOMUtils.jsm " );
function HelloWorld() {
this.wrappedJSObject = this;
} ;
HelloWorld.prototype = {
hello: function() {
return "Joyer, Hello World!";
},
pi: function() {
return 3.141592654;
},
classDescription: "Joyer Hello World Javascript XPCOM Component",
contractID: "@joyer.huang/helloworld;1",
classID: Components.ID("{53E1581F-FFFF-4b0f-8FF0-02FC75F3698D}"),
QueryInterface:XPCOMUtils.generateQI([Ci.nsIHelloWorld]),
} ;
function NSGetModule(aCompMgr, aFileSpec) { return XPCOMUtils.generateModule([HelloWorld]); }
const Ci = Components.interfaces;
const Cr = Components.results;
Components.utils.import( " resource://gre/modules/XPCOMUtils.jsm " );
function HelloWorld() {
this.wrappedJSObject = this;
} ;
HelloWorld.prototype = {
hello: function() {
return "Joyer, Hello World!";
},
pi: function() {
return 3.141592654;
},
classDescription: "Joyer Hello World Javascript XPCOM Component",
contractID: "@joyer.huang/helloworld;1",
classID: Components.ID("{53E1581F-FFFF-4b0f-8FF0-02FC75F3698D}"),
QueryInterface:XPCOMUtils.generateQI([Ci.nsIHelloWorld]),
} ;
function NSGetModule(aCompMgr, aFileSpec) { return XPCOMUtils.generateModule([HelloWorld]); }
代码目前都正确了,但是要让main.xul运行起来有期望的行为,还得注意下面几个事情:
1.要变更一下application的BuildID,不然XPCOM不会重注册
2.要认真查看代码中的语法错误,或者拼写错误。(区区花了半小时才发现自己错把最后一下HelloWorld写成Helloworld)
3.如果还是运行不起来,在尝试各种xulrunner的调试和跟踪方法。如以-console来启动xulrunner
注意:在这个XPCOM实现中,区区试用了wrappedJSObject技巧,这个技巧好处是不用重新编译IDL和typelib就可以让XPCOM拥有新的接口,这对于js这样的动态语言来说再自然不过,而且在开发测试时很有用~
一番折腾后,深切体会到mozilla平台在调试、文档、版本管理方面与emacs的差距啊。。。