缩了很多水...
原文:https://developer.mozilla.org/en/Creating_XPCOM_Components/Using_XPCOM_Components
玩转XPCOM的最好方法是是先看看它如何被客户端使用。
Mozilla浏览器之类的应用程序是复杂、模块化的XPCOMzujian组件的客户。实际上,几乎所有和浏览器相关的功能,如导航、窗口管理、cookie管理、书签、安全、搜索、渲染等,都定义于XPCOM中,并通过那些组件接口进行访问。Mozilla由XPCOM组件组成。
removeAll | 删除所有cookie |
enumerator | 枚举cookie |
remove | 删除指定的cookie |
// xpconnect
var cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
.getService();
cmgr = cmgr.QueryInterface(Components.interfaces.nsICookieManager);
function FinalizeCookieDeletions() {
for (var c=0; c<deletedCookies.length; c++) {
cmgr.remove(deletedCookies[c].host,
deletedCookies[c].name,
deletedCookies[c].path);
}
deletedCookies.length = 0;
}
上面,从js中连接组件的技术叫做XPConnect。它允许在js中调用XPIDL定义的接口方法。XPConnect将应用程序代码绑定到Mozilla浏览器的用户界面、其它基于Gecko的XUL和js环境(如xpcshell)。关于XPConnect和js的更多信息,参考http://www.mozilla.org/scriptable/。
...
...
findNext | 查找下一个 |
findBackwards | 布尔属性,让findNext()向上搜索 |
searchFrames | 布尔属性,指定是否要搜索子框架 |
matchCase | 布尔属性,指定是否要区分大小写 |
entireWord | 布尔属性,指定是否要匹配整个单词 |
...
lock | 锁定浏览器为当前站点(或读取自磁盘的站点白名单) |
unlock | |
addSite | 添加到白名单 |
removeSite | |
sites | 枚举白名单 |
...
Mozilla提供了一些工具,可以查找和显示Gecko中有效的接口信息,有XPCOM Component Viewer和MXR。前者不会区分冻结或非冻结接口(在Gecko 2.0中已经不存在冻结接口);后者是一个基于Web的源码查看工具,被冻结的接口在源码的最上方被标记为@status frozen。
XPCOM Component Viewer是一个插件,你可以在浏览器中安装(在沙盒中,目前无效)。替代地,可以试试另外一个类似的插件XPCOMViewer。
...
nsCOMPtr<nsIServiceManager> servMan;
nsresult rv = NS_GetServiceManager(getter_AddRefs(servMan));
if (NS_FAILED(rv))
return -1;
nsCOMPtr<nsICookieManager> cookieManager;
rv = servMan->GetServiceByContractID("@mozilla.org/cookiemanager",
NS_GET_IID(nsICookieManager),
getter_AddRefs(cookieManager));
if (NS_FAILED(rv))
return -1;
PRUint32 len;
deletedCookies->GetLength(&len);
for (int c=0; c<len; c++)
cookieManager->Remove(deletedCookies[c].host,
deletedCookies[c].name,
deletedCookies[c].path,
PR_FALSE);
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;
}
...