遍历nsIDOMNodeList

时间:2011-10-16 17:30:09

标签: firefox-addon xul xpcom idl

我正在为Firefox开发一个C ++组件,而我正在试图围绕XPCOM及其所有部分。这真的很令人困惑所以我正在努力解决这个问题,但我正试图浏览一个页面并获取所有链接。我试图找出所有对象的作用。所以,如果我有这个界面:

interface nsIPageSummary : nsISupports {
    boolean saveSummary(in nsIDOMDocument document, 
                        out unsigned long numLinks,
                        out unsigned long numImages);
};
在IDL中定义的

,我的C ++代码中的方法如下所示:

SaveSummary(nsIDOMDocument* inDoc, PRBool* outSuccess)
{
    *outSuccess = PR_FALSE;
    nsCOMPtr<nsIDOMNodeList> nodeList;
    inDoc->GetElementsByTagName(NS_LITERAL_STRING("A"), getter_AddRefs(nodeList));
}

我知道C ++方法需要更多的参数来匹配界面中定义的参数,但我不明白所有的打字工作方式。就实际列表而言,我是否正确理解

inDoc->GetElementsByTagName(NS_LITERAL_STRING("A"), getter_AddRefs(nodeList));

行将inDoc中的所有“A”标记放入nodeList?而且我只需要遍历nodeList来获取所有内容?

1 个答案:

答案 0 :(得分:0)

使用xpidl编译接口定义以获取C ++头文件 - 您可以检查该文件以查看接口定义的转换方式。你的方法定义应该看起来像是:

nsresult SaveSummary(nsIDOMDocument* inDoc, PRUint32* outNumLinks, PRUint32* outNumImages, PRBool* outSuccess)

我建议在接口定义中使用类型PRUint32而不是模糊的unsigned long。我还建议删除返回值:XPCOM方法总是返回nsresult NS_OK或错误代码,这足以表示成功或失败。从JavaScript调用时,错误代码会自动转换为异常。最后我建议使用小写标记名称:虽然它在HTML中无关紧要(不区分大小写),但在XHTML文档中只接受小写标记名称。所以你的界面定义应如下所示:

interface nsIPageSummary : nsISupports {
    void saveSummary(in nsIDOMDocument document, 
                     out PRUint32 numLinks,
                     out PRUint32 numImages);
};

相应的实施:

nsresult
SaveSummary(nsIDOMDocument* inDoc, PRUint32* outNumLinks, PRUint32* outNumImages)
{
  nsresult rv;

  nsCOMPtr<nsIDOMNodeList> nodeList;
  rv = inDoc->GetElementsByTagName(NS_LITERAL_STRING("a"), getter_AddRefs(nodeList));
  if (NS_FAILED(rv))
    return rv;

  rv = nodeList->GetLength(outNumLinks);
  if (NS_FAILED(rv))
    return rv;

  rv = inDoc->GetElementsByTagName(NS_LITERAL_STRING("img"), getter_AddRefs(nodeList));
  if (NS_FAILED(rv))
    return rv;

  rv = nodeList->GetLength(outNumImages);
  if (NS_FAILED(rv))
    return rv;

  return NS_OK;
}