Retrieving part of the bookmarks tree
出典: MDC
この記事は Firefox 3 の新機能について述べています
このドキュメントは、ブックマークツリーの一部を素早く取得したいと考える開発者のための、簡単なスタートガイドです。ブックマークは Places Query System を使って取得できます。
より基本的なブックマークの例は Manipulating bookmarks using Places を参照してください。
目次 |
[編集] クエリオブジェクトとオプションオブジェクトの取得
すべてのクエリは履歴サービスを通じて行うことができます。まず、履歴サービスから、空のクエリオブジェクトとオプションオブジェクトを取得する必要があります。
var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"]
.getService(Components.interfaces.nsINavHistoryService);
var options = historyService.getNewQueryOptions();
var query = historyService.getNewQuery();
[編集] 取得したいフォルダの検索
既知のフォルダ ID はブックマークサービスから取得可能です。/toolkit/components/places/public/nsINavBookmarksService.idl で定義されている属性は、bookmarksMenuFolder、tagsFolder、unfiledBookmarksFolder、toolbarFolder です。フォルダ ID は過去のクエリから取得することもできます。
以下の例では、ブックマークツールバーの ID を取得しています。
var bookmarksService = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
.getService(Components.interfaces.nsINavBookmarksService);
var toolbarFolder = bookmarksService.toolbarFolder;
placesRoot は Places の階層構造全体のルートフォルダです。ここには、ユーザのデータとともに管理用のデータが含まれているため、クエリに使用することは推奨されません。
[編集] クエリの設定
階層構造を持ったブックマークから結果を得るには、あらかじめ取得したクエリオブジェクトの setFolders にフォルダ ID を渡します。
query.setFolders([toolbarFolder], 1);
[編集] クエリの実行
executeQuery と executeQueries の 2 つの関数は、クエリの結果を含んだ nsINavHistoryResult オブジェクトを返します。
var result = historyService.executeQuery(query, options);
[編集] 結果の取得
(この例のように) キーワードや日付範囲といった複雑なクエリパラメータを付けずに、フォルダによってグループ化された 1 つのフォルダのみにクエリを実行した場合、結果の root は、そのフォルダに相当する nsINavHistoryContainerResultNode になります。複雑なクエリを実行した場合、ルートは nsINavHistoryQueryResultNode になります。
結果が含まれたコンテナの子要素にアクセスする前に、まずそのコンテナを開く必要があります。それから、子要素に対して反復処理を実行します。コンテナは、開かれている間、内容を最新の状態を保つため、ブックマークシステムからの通知を監視します。処理が完了したら、コンテナを閉じてリソースを解放するのを忘れないでください。そうしないと、コンテナはオブザーバの通知を取得し、内容を更新し続けることになり、結果的にブラウザ全体の処理速度が低下してしまいますので注意してください。
var rootNode = result.root;
rootNode.containerOpen = true;
// このフォルダの直下にある子要素に対して反復処理を行い、コンソールに出力します
for (var i = 0; i < rootNode.childCount; i ++) {
var node = rootNode.getChild(i);
dump("Child: " + node.title + "\n");
}
// コンテナは、処理が済んだら必ず閉じてください!
rootNode.containerOpen = false;
RESULT_TYPE_FOLDER という type が設定された、あるいは他のコンテナの種類が設定されたノードに遭った場合は、それらのフォルダを開いて、階層を降りていくことができます。結果の種類について理解するには、Places:Query System の「結果の利用」という項目をご覧ください。
[編集] 完全なコード
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 toolbarFolder = bookmarksService.toolbarFolder;
query.setFolders([toolbarFolder], 1);
var result = historyService.executeQuery(query, options);
var rootNode = result.root;
rootNode.containerOpen = true;
// このフォルダの直下にある子要素に対して反復処理を行い、コンソールに出力します
for (var i = 0; i < rootNode.childCount; i ++) {
var node = rootNode.getChild(i);
dump("Child: " + node.title + "\n");
}
// コンテナは、処理が済んだら必ず閉じてください!
rootNode.containerOpen = false;