« [Places] 右クリックメニューへのメニュー項目追加 | [Places] nsINavHistoryResultNode からブックマークの各種情報を取得する » |
[Places] ビューと nsIPlacesView インタフェース
nsIPlacesView インタフェース
ブックマークや履歴といった Places データベースに保持されている内容は、ツリー/メニュー/ツールバーといった色々な GUI ウィジェット(「places view」あるいは単に「ビュー」と呼ぶ)として実際に目に見える形で表示される。各ビューはいずれも XBL にて nsIPlacesView インタフェースで定められた各種プロパティ・メソッドを実装しており、ビューの違いを意識することなくコントローラ側で各種機能を実装できる設計となっている。
Places ではデータベースへの問い合わせ結果を所定のインタフェースを介してビューに結びつけて表示させる。問い合わせ結果全体を表す nsINavHistoryResult オブジェクトからは、個々の「行」に対応する nsINavHistoryResultNode オブジェクトへアクセス可能である。このオブジェクトを「result node」あるいは単に「ノード」と呼ぶ。あるビュー上でユーザが現在選択している項目に対応するノードは、 nsIPlacesView インタフェースの selectedNode プロパティや getSelection メソッドによって取得可能である。
placesUIOverlay.js
引き続き、 [Places] 右クリックメニューへのメニュー項目追加 にて新たに追加した「Show Information」メニュー項目をクリックした際に実行される showBookmarkInformation 関数を実装する。
まずは右クリックメニューの対象となるビューと、そのビューにて選択しているノードを取得する。ここで、対象のビューとしてブックマークサイドバーのツリーだけを考慮すると、うっかり以下のようにやってしまうところである。
var view = document.getElementById("bookmarks-view"); // XULElement var node = view.selectedNode; // nsINavHistoryResultNode
しかし、これではせっかくのビューの違いを意識しない Places の設計が台無しである。ツリー/メニュー/ツールバーすべてを考慮して右クリックメニューの対象となっているビューを取得するには、以下のようにすればよい。 PlacesUIUtils.getViewForNode は、引数に指定した DOM ノードの先祖をたどって直近のビューを見つけ出す便利メソッドである。
var view = PlacesUIUtils.getViewForNode(document.popupNode); // XULElement var node = view.selectedNode; // nsINavHistoryResultNode
あとはノードの各プロパティの情報を表示するだけ。各プロパティの詳細は nsINavHistoryService.idl 参照。
alert( "title : " + node.title + " " + "uri : " + node.uri + " " + "type : " + node.type + " " + "icon : " + (node.icon ? node.icon.spec : "") + " " + "itemId : " + node.itemId + " " + "tags : " + node.tags );
var view = document.getElementById(“bookmarks-view”); // XULElement
var node = view.selectedNode; // nsINavHistoryResultNode