创建XPCOM组件 3. 使用XPCOM组件

来源:互联网 发布:mac版死或生 编辑:程序博客网 时间:2024/04/29 09:02

 缩了很多水...

 

 

 

3. 使用XPCOM组件

原文:https://developer.mozilla.org/en/Creating_XPCOM_Components/Using_XPCOM_Components

    玩转XPCOM的最好方法是是先看看它如何被客户端使用。

    Mozilla浏览器之类的应用程序是复杂、模块化的XPCOMzujian组件的客户。实际上,几乎所有和浏览器相关的功能,如导航、窗口管理、cookie管理、书签、安全、搜索、渲染等,都定义于XPCOM中,并通过那些组件接口进行访问。Mozilla由XPCOM组件组成。

组件示例

cookie管理器

接口nsICookieManager

removeAll删除所有cookieenumerator枚举cookieremove删除指定的cookie

在js中取得CookieManager组件

// 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/。

    ...

JavaScript和Mozilla

...

组件WebBrowserFind

接口nsIWebBrowserFind

findNext查找下一个findBackwards布尔属性,让findNext()向上搜索searchFrames布尔属性,指定是否要搜索子框架matchCase布尔属性,指定是否要区分大小写entireWord布尔属性,指定是否要匹配整个单词

...

组件WebLock

接口IWebLock

lock锁定浏览器为当前站点(或读取自磁盘的站点白名单)unlock addSite添加到白名单removeSite sites枚举白名单

...

在Mozilla中使用组件

查找Mozilla组件

    Mozilla提供了一些工具,可以查找和显示Gecko中有效的接口信息,有XPCOM Component Viewer和MXR。前者不会区分冻结或非冻结接口(在Gecko 2.0中已经不存在冻结接口);后者是一个基于Web的源码查看工具,被冻结的接口在源码的最上方被标记为@status frozen。

XPCOM Component Viewer

    XPCOM Component Viewer是一个插件,你可以在浏览器中安装(在沙盒中,目前无效)。替代地,可以试试另外一个类似的插件XPCOMViewer。

...

在Cpp中使用XPCOM组件

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

XPConnect:在脚本中使用XPCOM组件

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

...

 

原创粉丝点击