中編から引き続き,選択範囲の文字列からブックマークへタグ付けする処理などをJavaScriptで実装していきます。
その前に,処理を実装するために必要となるPlaces APIについて簡単な紹介をします。
Places API
ここからは,選択範囲の文字列からブックマークへタグ付けする処理などを実装していきますが,その前に,処理を実装するために必要となるPlaces APIについて簡単な紹介をします。
ご存知の通りFirefox 3ではブックマークと履歴の管理機能が一新されましたが,この新しい管理システムを「Places」と呼びます。Placesでは,ブックマークや履歴を操作するための多数のAPIがXPCOMサービスとして提供されいます。そのうち,今回使用するAPIの概要を表1に示します。
表1 使用するPlaces API(XPCOMサービス)の概要
| XPCOMサービス | 概要 |
|---|---|
| nsINavBookmarksService | ブックマークの追加,編集,削除といった一般的な操作を行う。 ・Manipulating bookmarks using Places - MDC ・nsINavBookmarksService - MDC |
| nsITaggingService | ブックマークへのタグ付け,タグの削除などを行う。 ・Using the Places tagging service - MDC ・nsITaggingService - MDC |
表1に挙げた以外にも様々なAPIが存在します。詳しくは下記URLをご覧ください。
ブックマーク済みかどうかのチェック
ここからは,選択範囲を取得する処理の前に,現在表示しているWebページのURLがブックマーク済みかどうかをチェックする処理を追加します。また,ブックマーク済みでない場合は警告メッセージを表示して処理を終了するようにします。「overlay.js」へリスト1の内容を追加してください。
リスト1 「overlay.js」への記述内容4(ブックマーク済みかどうかのチェック処理を追加)
var TagHelper = {
generateTags: function() {
var url = window.content.location.href;
var ioSvc = Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
url = ioSvc.newURI(url, null, null);
var bookmarksSvc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
getService(Ci.nsINavBookmarksService);
if (!bookmarksSvc.isBookmarked(url)) {
alert('"' + window.content.document.title + '" is not bookmarked.');
return;
}
var keywords = [];
var sel = window.content.getSelection();
for (var i = 0; i < sel.rangeCount; i++) {
var keyword = sel.getRangeAt(i).toString();
keyword = keyword.replace(/^\s+|\s+$/g, "");
keywords.push(keyword);
}
Application.console.log("keywords = " + keywords);
sel.removeAllRanges();
},
};
あるURLがブックマーク済みかどうかを調べるには,表1に示したnsINavBookmarksServiceのisBookmarkedメソッドを使用します。nsINavBookmarksServiceのリファレンスに記載されている通り,isBookmarkedはnsIURIオブジェクトを引数とし,指定したURLがブックマーク済みかどうかを真偽値で返します。そこで,リスト1では,まずnsIIOServiceを使用してURLの文字列(変数「url」)からnsIURIオブジェクトを生成します。次に,nsINavBookmarksServiceを呼び出し(変数「bookmarksSvc」),isBookmarkedによって先ほどのnsIURIオブジェクトがブックマーク済みかどうかを調べ,戻り値がfalseなら警告を表示して終了します。
なお,リスト1では「Cc」と「Ci」を使用していますが,これらは「browser.xul」から読み込まれるFirefox自体のJavaScriptソースファイル内で定義された定数で,それぞれ「Components.classes」「Components.interfaces」への参照です。

