BookSearcherの改良

右クリックした時に、選択中の文字列を表示させるようにしたい。(googleのやつみたいに)
ついでに、未選択の場合は、リンクを非表示にしたい。

右クリックイベントをフックさせようか(フックの使い方あってる?)と思ったけど、FireFoxにはコンテキストメニュー表示時用のイベントが用意されているみたいなので、今回はそれを使う。

変更箇所

今回の改良での変更は2つ
・content/booksearcher.xul
・content/booksearcher.js

content/booksearcher.xulに関しては、表示するメッセージを少し変更しただけ。

booksearcher.jsの変更点

booksearcher.jsは、BookSearcherにcheckSelection関数とinit関数、JS読み込み時の初期化処理を追加した。

var BookSearcher = {
    search: function() {
       〜省略〜 
    },

    checkSelection: function() {
        var separator = document.getElementById( "booksearcher-separator" );
        var link      = document.getElementById( "booksearcher-link" );

        // 文字列を選択していた場合、表示。選択していない場合、非表示。
        separator.hidden = !gContextMenu.isTextSelected;
        link.hidden      = !gContextMenu.isTextSelected;

        if( gContextMenu.isTextSelected ){
            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();

            // コンテキストメニュー表示メッセージの設定
            link.label = 'Search Book for "' + selectString + '"';
        }
    },

    init: function() {
        var contextMenu = document.getElementById( "contentAreaContextMenu" );

        if( contextMenu ) {
            // コンテキストメニュー表示時に、文字列選択状態を確認
            contextMenu.addEventListener( "popupshowing", BookSearcher.checkSelection, false );
        }

    }
};

window.addEventListener( "load", BookSearcher.init, false );

・initの処理
 コンテキストメニュー表示時に、文字列の選択状態を確認する。

・checkSelectionの処理
 文字列未選択の場合、書籍検索用リンクを非表示。また、選択していた場合は、書籍検索用リンクを表示して、リンクのラベルに選択中の文字列を追加する。

コードはココ

感想

コミットメッセージに悩む・・・何か良いサンプルないかな。

参考

Extensions/MDN