用于修改Firefox下载列表的API

时间:2014-08-11 14:21:38

标签: firefox-addon

我正在寻找一个小的firefox附加组件,它可以检测下载的文件在本地被删除(或已被删除)并删除firefox下载列表中的相应条目。

有人能指点我操作下载列表的相关api吗?我似乎无法找到它。

1 个答案:

答案 0 :(得分:3)

相关的API是PlacesUtils,它抽象了Places数据库的复杂性。

如果您的代码在chrome窗口的上下文中运行,那么您将免费获得PlacesUtils glabal变量。否则(引导,附加SDK,无论如何)你必须导入PlacesUtils.jsm

Cu.import("resource://gre/modules/PlacesUtils.jsm");

Places而言,下载的文件只不过是一种特殊的访问页面,相应地进行了注释。获取所有下载文件的数组只需要一行代码。

var results = PlacesUtils.annotations.getAnnotationsWithName("downloads/destinationFileURI");

由于我们要求destinationFileURI注释,resultarray的每个元素都将annotationValue属性中的下载位置保存为file: URI规范字符串。

用它可以检查文件是否确实存在

function getFileFromURIspec(fileurispec){
  // if Services is not available in your context Cu.import("resource://gre/modules/Services.jsm");
  var filehandler = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler);
  try{
    return filehandler.getFileFromURLSpec(fileurispec);
  }
  catch(e){
    return null;
  }
}

getFileFromURIspec将返回nsIFile的实例,如果规范无效,则返回null,在这种情况下不应该发生,但是完整性检查永远不会受到伤害。有了它,您可以调用exists()方法,如果它返回false,则Places中的关联页面条目有资格删除。我们可以通过它的uri告诉哪个页面是哪个页面,这也很方便地是results的每个元素的属性。

PlacesUtils.bhistory.removePage(result.uri);

总结一下

var results = PlacesUtils.annotations.getAnnotationsWithName("downloads/destinationFileURI");
results.forEach(function(result){
  var file = getFileFromURIspec(result.annotationValue);
  if(!file){
    // I don't know how you should treat this edge case
    // ask the user, just log, remove, some combination?
  }
  else if(!file.exists()){
    PlacesUtils.bhistory.removePage(result.uri);
  }
});