1

ツリーの任意の時点でルート フォルダーからすべてのユーザーのブックマーク フォルダーの配列を返すことができるようにしたいと考えています。

これは、RESULT_TYPE_FOLDER を何も返さない最も近いものです。

function find_folders()
{
  var history = Cc["@mozilla.org/browser/nav-history-service;1"]
     .getService(Ci.nsINavHistoryService);

  var query = history.getNewQuery();
  var options = history.getNewQueryOptions();

  // Query users bookmarks, not history
  options.queryType = options.QUERY_TYPE_BOOKMARKS;

  // Execute the search and store results
  var result = history.executeQuery(query, options);

  // Open the root containerNode and open it
  var resultContainerNode = result.root;

  // OPEN resultContainerNode
  resultContainerNode.containerOpen = true;
  var folders = [];

  // Search results are now child items of this container?
  for (var i=0; i < resultContainerNode.childCount; ++i) {
    var childNode = resultContainerNode.getChild(i);

    if(childNode.type === childNode.RESULT_TYPE_FOLDER)
    {
      folders.push(childNode);
    }
  }

  // CLOSE resultContainerNode
  resultContainerNode.containerOpen = false;

  return folders;
};

find_folders();

この結果の種類のチェックを削除すると、多くの URI といくつかの RESULT_TYPE_QUERY が得られますが、RESULT_TYPE_FOLDER は得られません。

childNode.type: 0
childNode.type: RESULT_TYPE_QUERY
childNode.title: Most Visited
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: 0
childNode.type: RESULT_TYPE_QUERY
childNode.title: History

ここのドキュメント: https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavHistoryQueryOptions#Query_type_constants は、設定できることを示唆しています:

excludeItems boolean このオプションは、すべての URI とセパレーターをブックマーク クエリから除外します。これは、ブックマーク フォルダとクエリのリスト (場所ページの左ペインなど) だけが必要な場合に使用されます。履歴に対するクエリでは無視されます。デフォルトは false です。

ただし、これを設定すると、クエリは結果を返しません。

function find_folders()
{
  var history = Cc["@mozilla.org/browser/nav-history-service;1"]
     .getService(Ci.nsINavHistoryService);

  var query = history.getNewQuery();
  var options = history.getNewQueryOptions();

  options.queryType = options.QUERY_TYPE_BOOKMARKS;
  options.excludeItems = true; // Exclude everything that isn't a folder?
  // Execute the search and store results
  var result = history.executeQuery(query, options);

  // Open the root containerNode and open it
  var resultContainerNode = result.root;

  // OPEN resultContainerNode
  resultContainerNode.containerOpen = true;
  var folders = [];

  // Search results are now child items of this container?
  for (var i=0; i < resultContainerNode.childCount; ++i) {
    var childNode = resultContainerNode.getChild(i);
    folders.push(childNode);
  }

  // CLOSE resultContainerNode
  resultContainerNode.containerOpen = false;

  return folders;
};

find_folders(); // Returns nothing :C
4

2 に答える 2

2

excludeItemsたとえば、検索するフォルダーを指定した場合にのみ機能します。

query.setFolders([PlacesUtils.toolbarFolderId, PlacesUtils.bookmarksMenuFolderId,
                 PlacesUtils.unfiledBookmarksFolderId], 1);

また、フォルダーのフラット リストを返さないため、結果を確認し、コンテンツを開いて再帰的に収集する必要があります。

フォルダのフラット リストを取得するための適切なユース ケースがある場合は、拡張バグを自由に提出できます。

最後に、Places ノードを結果から取り出して配布します。これにより、基本的にゾンビ オブジェクトが作成されます。独自のオブジェクトを作成し、気になるもの、たとえば などを追加した方がよいでしょう{ title: node.title, uri: node.uri }(私はこの動作に関連するバグをここで見つけたので、報告して修正します)。

于 2013-02-05T20:12:35.910 に答える
1

わかりました、Firefox Places クエリ インターフェイスでいくつかのバグと制限に遭遇したようです。

1 - (バグ?)query.setFolders([folder_array], 1) 2 番目のパラメーター (フォルダー数) を 1 以外に設定すると、結果が得られません。1 に設定すると、配列の最初のフォルダーのみが検索されます。

2 - (制限)excludeItems役に立たない検索対象のフォルダーを指定した場合にのみ機能します:C

3 - (制限/バグ?)query.setSearchTerm(term)フォルダ名と一致しないように見えるので、手動で検索用語と照合する必要がありました:Q__

大ざっぱな回避策は、検索するフォルダーの配列を作成してから、それぞれを個別に検索し、次のように結果を連結することです。

bookmarkr_utilities.find_folders = function(search_term)
{
  bookmarkr_utilities.debug_log("find_folders()");
  bookmarkr_utilities.folders = [];


  var folders = [   bookmarkr_utilities.bmsvc_service().toolbarFolder
                  , bookmarkr_utilities.bmsvc_service().bookmarksMenuFolder
                  , bookmarkr_utilities.bmsvc_service().unfiledBookmarksFolder   ];


  for (var i = 0; i < folders.length; i++) 
  {
    bookmarkr_utilities.folders = bookmarkr_utilities.folders.concat(bookmarkr_utilities.find_inside_folder(search_term, folders[i]));
  }

  return bookmarkr_utilities.folders;
};

実際に検索を実行するヘルパー関数:

bookmarkr_utilities.find_inside_folder = function(search_term, search_folder)
{
  var history = Cc["@mozilla.org/browser/nav-history-service;1"]
     .getService(Ci.nsINavHistoryService);

  var result_folders = [];

  var query = history.getNewQuery();

  query.setFolders([search_folder], 1);

  var options = history.getNewQueryOptions();

  options.excludeItems = true; // exclude everything except folders
                               // only works when folders are set

  // Execute the search and store results
  var result = history.executeQuery(query, options);

  // Open the root containerNode and open it
  var resultContainerNode = result.root;
  resultContainerNode.containerOpen = true;

  // Search results are now child items of this container?
  bookmarkr_utilities.debug_log("resultContainerNode.childCount: " + resultContainerNode.childCount);
  for (var i=0; i < resultContainerNode.childCount; ++i) {
    var childNode = resultContainerNode.getChild(i);

    if(childNode.type === childNode.RESULT_TYPE_FOLDER)
    {
      // HACK HACK HACK
      if(search_term)
      {
        if(childNode.title.toLowerCase() == search_term.toLowerCase())
          result_folders.push(childNode);
      }
      // END HACK HACK HACK OH GOD
      else
      {
        result_folders.push(childNode);
      }
    }
  }

  // Close container
  resultContainerNode.containerOpen = false;

  return result_folders;
}
于 2013-02-06T10:36:04.547 に答える