XPConnect: 在脚本中使用 XPCOM 组件
在本章开始我们讨论了CookieManager组件,他提供了一个很好的例子来说明如何使用javascript访问组件.在下面的代码片断里你可以看到如何通过getService()方法创建一个CookieManager组件对象,并且通过它提供的功能来让我们从用户界面来读取和删除cookies.
Managing Cookies from JavaScript
var cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
.getService();
cmgr = cmgr.QueryInterface(Components.interfaces.nsICookieManager);
function loadCookies() {
// load cookies into a table
var enumerator = cmgr.enumerator;
var count = 0;
var showPolicyField = false;
while (enumerator.hasMoreElements()) {
var nextCookie = enumerator.getNext();
nextCookie = nextCookie.QueryInterface(Components.interfaces.nsICookie);
/* .... */
}
function FinalizeCookieDeletions() {
for (var c=0; c<deletedCookies.length; c++) {
cmgr.remove(deletedCookies[c].host,
deletedCookies[c].name,
deletedCookies[c].path,
false);
}
deletedCookies.length = 0;
}
除了CookieManager被调用的方法以外(也就是cookiemanager.remove
(他会映射到remove()
The nsICookieManager
Interface),请注意那些在Javascript中反映XPCOM组件的专门的XPConnect对象和方法。
Components
是用来控制到组件连接的JavaScript对象, 而classes
是一组所有你可以根据契约ID来查询的对象。为了在Javascript中实例化XPCOM组件,你创建一个新的Component
对象同时传入你所需要查询的组件契约ID,返回的可能是一个singleton或者一个实例。
var cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
.getService();
cookiemanager
对象的结果提供组件的所有在IDL中编译好然后编译到类型库中的方法的入口。 使用CookieManager组件, 你可以写如下的代码来完成从系统中清除所有cookies的操作:
cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
.getService();
cmgr = cmgr.QueryInterface(Components.interfaces.nsICookieManager);
// delete all cookies
function trashEm() {
cmgr.removeAll();
}
这个例子所展示的另外一个关键的XPConnect特性的是可以在所有从XPCOM映射到javascript的对象上执行的QueryInterface
方法。如同在C++中, 你可以使用这个方法询问给定对象的别的接口。
Services Versus Regular Instances
到底让客户把你的组件作为一个实例还是服务是一个设计问题,你应当在你的组件文挡中进行描述。实际上,例子中通过方法createInstance()调用
getService()
方法的方法实际上也可以是对组件对象调用并且缓存结果,并让他做为一个singlenton而不是实例。
用来建立服务的singleton设计模式在XPCOM Services进行描述。
请记住,QueryInterface
让你查询一个对象所支持的接口。在The nsICookieManager
Interface的代码片断中, QueryInterface
方法被用来从eunumerator中获得nsICookie
接口,从而, 比如说, JavaScript代码就可以获得每个cookie的value
和name
属性。
-
Note: cookie-manager-ui注意接口不是组件的一部分. XPCOM通过Mozilla's Cross Platform Front End (XPFE)和其他的用户接口使使用CookieManager这样的组件变得容易,但是组件本身并不提供自身的UI。
-
Note: private-xpcom-interfaces这方面也有例外. 一些XPCOM接口也可以是private并且不是作为公用的. Private接口和在IDL中公开的接口要求有所不同。
-
Note: cookie-manager-in-tutorialCookieManager组件用来支持本教程所描述的网页所定功能。