我已经编写了一些代码来探索我的Firefox书签,但我只获得了第一级书签(即我没有得到文件夹中的链接)。
e.g。
Search_engines /
google.com
在此示例中,我只能访问Search_engines和google.com而不是yahoo.com
我的函数是递归的我不知道为什么会这样。
我的代码:
function browse_bookmark_node(bookmark_node, array)
{
// We explore the bookmarks with this function
// iterate over the immediate children of this folder
for (var i = 0; i < bookmark_node.childCount; i ++) {
var node = bookmark_node.getChild(i);
if (node.type ==0) {
// the node is a link so we add it to the array
array.push(node.title);
} else if (node.type ==6) {
// the node is a folder so we explore it
browse_bookmark_node(node, array);
}
}
}
function wrapper_browse_bookmark_node(bookmark_node) {
// We use this function to wrapp the function browse_bookmark_node and keep track of the links
var array = [];
browse_bookmark_node(bookmark_node, array);
return array;
}
// All the code following is used to access firefox bookmarks and works fine
var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"]
.getService(Components.interfaces.nsINavHistoryService);
var options = historyService.getNewQueryOptions();
var query = historyService.getNewQuery();
var bookmarksService = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
.getService(Components.interfaces.nsINavBookmarksService);
var bookmarksMenuFolder = bookmarksService.bookmarksMenuFolder;
query.setFolders([bookmarksMenuFolder], 1);
var result = historyService.executeQuery(query, options);
var rootNode = result.root;
rootNode.containerOpen = true;
// The function call to explore the bookmarks
var links_array = wrapper_browse_bookmark_node(rootNode);
// close a container after using it!
rootNode.containerOpen = false;
答案 0 :(得分:3)
一个明显的错误是使用toolbarFolder
作为起点 - 这只是书签工具栏。如果您需要所有书签(意思是书签菜单,书签工具栏和未排序的书签),您需要更改查询参数:
query.setFolders([
bookmarksService.bookmarksMenuFolder,
bookmarksService.toolbarFolder,
bookmarksService.unfiledBookmarksFolder
], 3);
另一个问题是在childCount
对象上获取nsINavHistoryResultNode
属性 - 没有这样的属性。在您可以访问nsINavHistoryContainerResultNode
的属性之前,您需要明确或隐式地(通过QueryInterface
)调用instanceof
。所以我会写:
} else if (node.type == 6 && node instanceof Components.interfaces.nsINavHistoryContainerResultNode) {
var oldOpen = node.containerOpen;
node.containerOpen = true;
browse_bookmark_node(node, array);
node.containerOpen = oldOpen;
}
答案 1 :(得分:0)
为了节省想要获得所有书签的人的时间,不要这样做
query.setFolders([
bookmarksService.bookmarksMenuFolder,
bookmarksService.toolbarFolder,
bookmarksService.unfiledBookmarksFolder
], 3);
正如弗拉迪米尔所建议的那样,因为它不会为你带来所有的书签,而是对文件夹进行交叉,只给你所有这些文件夹的书签,如Mozilla doc's所述
您可以设置多个文件夹,结果将是所有文件夹的交集。