Firefox 3ではじめる拡張機能開発

第4回 機能を実装する(後編)

この記事を読むのに必要な時間:およそ 5.5 分

ブックマークへのタグ付け

ここからは,選択範囲を取得する処理の後に,現在表示しているWebページのURLに対するブックマークに対し,選択範囲の文字列からタグ付けする処理を追加します。⁠overlay.js」リスト2の内容を追加してください。

リスト2 ⁠overlay.js」への記述内容5(ブックマークへのタグ付け処理を追加)

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);
    if (keywords.length > 0) {
      var taggingSvc = Cc["@mozilla.org/browser/tagging-service;1"].
                       getService(Ci.nsITaggingService);
      taggingSvc.tagURI(url, keywords);
    }
    sel.removeAllRanges();
  },
};

ブックマークに対してタグ付けするには,表1に示したnsITaggingServiceのtagURIメソッドを使用します。nsITaggingServiceのリファレンスに記載されている通り,tagURIはnsIURIオブジェクトとタグ付けする文字列の配列を引数とします。そこで,リスト2では,タグ付けする文字列の配列(変数「keywords⁠⁠)の要素が1個以上あるかを調べてから,nsITaggingServiceを呼び出し(変数「taggingSvc⁠⁠,tagURIによってタグ付けを行います。

JavaScriptコードモジュールを利用する

JavaScriptコードモジュールとは,Firefox 3で新たに導入された機能で,異なるJavaScriptのスコープ間で共有可能なシングルトンのオブジェクトを容易に実現することができます。例えば,複数のXULから利用される関数を大量に定義するような場合,それらをひとつのJavaScriptファイルにまとめて各XUL内で<script>タグで読み込むよりも,JavaScriptコードモジュール化して各XULへインポートしたほうがメモリの面などで効率が良いといった利点があります。

もちろん拡張機能が独自にJavaScriptコードモジュールを定義することもできますが,Firefox 3自体が定義している便利なJavaScriptコードモジュールがいくつかあり,これらを拡張機能から利用することもできます。そのうちのひとつである「PlacesUtils」は,Places APIがより利用しやすい形にまとめられています。あるJavaScriptのスコープで「PlacesUtils」をインポートして利用可能にするためには,リスト3のように記述します。

リスト3 PlacesUtilsのインポート

Components.utils.import("resource://gre/modules/utils.js");
 

ただし,今回色々と機能を実装している「TagHelper」オブジェクトのスコープでは,すでにFirefox自体によって「PlacesUtils」がインポートされていますので注1⁠,リスト3の内容を記述しなくても「PlacesUtils」が利用可能です。

注1)
厳密には,⁠browser.xul」へオーバーレイされているXUL「chrome://browser/content/places/placesOverlay.xul」から読み込まれているJavaScript「chrome://browser/content/places/utils.js」にて,⁠PlacesUtils」がインポートされています。

JavaScriptコードモジュールは,そのソースコード内で定義された配列「EXPORTED_SYMBOLS」の各要素と同一の名前を有するJavaScriptのオブジェクト(およびその全プロパティ)が外部から利用可能となります。⁠PlacesUtils」オブジェクトで利用可能な各プロパティについての説明は,下記URLにて解説されていますが,場合によっては「PlacesUtils」自体のソースコードを見たほうが早いかもしれません注2⁠。

注2)
「PlacesUtils」のソースコードを見るには,FirefoxのロケーションバーへURL「resource://gre/modules/utils.js」を入力するか,または下記URLを参照してください。
mozilla-central mozilla/browser/components/places/content/utils.js

「PlacesUtils」で定義されたプロパティのうち,今回使用するものを表2に示します。これらのプロパティを利用することで,リスト2の内容はリスト4のように簡潔に書き直すことができます。

表2 使用するPlacesUtilsのプロパティ

プロパティ詳細
PlacesUtils.bookmarksnsINavBookmarksServiceへの参照。
PlacesUtils.taggingnsITaggingServiceへの参照。
PlacesUtils._urinsIIOServiceでURL文字列からnsIURIオブジェクトを生成する注3⁠。
注3)
一般的に,先頭がアンダーバーのプロパティは外部からの利用が想定されていないプライベートなプロパティであることを意味するため,⁠_uri」の使用は避けたほうがいいかもしれません。代わりに,⁠chrome://global/content/contentAreaUtils.js」で定義されている汎用関数「makeURI」を使用する手もあります。

リスト4 ⁠overlay.js」への記述内容6(PlacesUtilsを利用して書き換え)

var TagHelper = {
  generateTags: function() {
    var url = window.content.location.href;
    url = PlacesUtils._uri(url);
    if (!PlacesUtils.bookmarks.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);
    if (keywords.length > 0) {
      PlacesUtils.tagging.tagURI(url, keywords);
    }
    sel.removeAllRanges();
  },
};

著者プロフィール

Gomita

拡張機能開発者。
現在までにScrapBook,FoxAge2ch,Tab Scope,FireGesturesの4つをリリースしている。

URLhttp://www.xuldev.org/