我正在寻找一个小的firefox附加组件,它可以检测下载的文件在本地被删除(或已被删除)并删除firefox下载列表中的相应条目。
有人能指点我操作下载列表的相关api吗?我似乎无法找到它。
答案 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);
}
});