Исследование закладок Firefox не проходит мимо первого уровня с Javascript - PullRequest
1 голос
/ 07 июня 2011

Я написал некоторый код для изучения моих закладок Firefox, но я получаю только первый уровень закладок (т.е. я не получаю ссылки в папках).

например

  • Search_engines /

    • yahoo.com
  • 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;

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

Одна очевидная ошибка - использование 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;
}
0 голосов
/ 08 ноября 2011

Просто чтобы сэкономить время всем, кто хочет получить все закладки, не делайте query.setFolders([ bookmarksService.bookmarksMenuFolder, bookmarksService.toolbarFolder, bookmarksService.unfiledBookmarksFolder ], 3); , как предложил Владимир, так как это не принесет вам все закладки, а вместо этого сделает пересечение папок и даст вам толькозакладки, которые размещены во всех этих папках, как написано в документации Mozilla

. Вы можете установить несколько папок, и в результате будут пересечены все папки.

(https://developer.mozilla.org/en/Querying_Places)

...