Firefoxのアドオンを作ってみる 応用編

今回は、以前作成したブックマークレットの処理を右クリックメニューからできるようにするアドオンを作成してみた。

開発環境

Ubuntu 11.04
FireFox 6.0

ファイル構成

初級編のhelloと同じ構成となっている。

booksearcher
 ┠─ chrome.manifest
 ┠─ install.rdf
 └─ content
   ┠─ booksearcher.xul
   └─ booksearcher.js

booksearch.xul

コンテキストメニューの中に、書籍を検索するためのリンクを作成した。

<?xml version="1.0" ?>

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <script type="application/x-javascript" src="chrome://booksearcher/content/booksearcher.js" />

    <!-- コンテキストメニューへの追加 -->
    <popup id="contentAreaContextMenu">
        <menuseparator id="booksearcher-separator"/>
        <menuitem id="booksearcher-link" label="Search Book with Calil" oncommand='BookSearcher.search();'/>
    </popup>

</overlay>

id「contentAreaContextMenu」の内部に、仕切となるmenuseparatorと、リンクとなるmenuitemを記述している。

そして、menuitemには、クリック時に検索するための関数が呼ばれるよう、oncommandにBookSearcher.search関数を記述している。

booksearcher.js

書籍の検索処理はこんな感じ。

var BookSearcher = {
    search: function() {
        var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                    .getService( Components.interfaces.nsIWindowMediator );

        // 最近操作したウインドウを取得
        var mainWinodw = wm.getMostRecentWindow( "navigator:browser" );

        // 選択中の文字列を取得
        var selectString = mainWinodw.content.document.getSelection();

        if( selectString ) {
            var url = 'http://calil.jp/search?q=';

            url += encodeURI( selectString );
            // 新しいタブを開いて、カーリルで検索
            mainWinodw.gBrowser.addTab( url );
        }
    }
};

前回、作成したブックマークレットの処理をそのまま使える・・・かと思いきや、「選択中の文字列を取得」や「リンクをタブで開く」など少し勝手が違うところがあった。

まず、「選択中の文字列を取得」は、window.getSlection.toStringでは取得することができなかった。

どうやら、FireFox内部から関数を呼び出す場合と、外部から呼ぶ場合では挙動が違うみたいで、選択中の文字列を取得するには、winodw.content.document.getSelectionを使用する。

また、「リンクでタブを開く」も外部と内部で方法が異なっていた。

外部ではwindow.openを使用したら、自動でタブにurlが読み込まれていたが、これはブラウザの設定によるものらしい。

内部でwinodw.openを使用した場合、新しいウインドウを開いてしまう。

なので、gBrowser.addTab関数で新しくタブを開くよう、明示的に処理を記述した。

感想

前回のブックマークレットの処理をそのまま流用して、らくらくできると思っていただけに、少し疲れた。

GitHubリポジトリ

print7 / BookSearcher


参考

安全にSelectionオブジェクトを得る(XPCNativeWrapperの使用)

Tabbed browser