keyconfigは拡張開発にも使える

(keyconfigについては11/6の日記も参照のこと)

Search Buttonという拡張がある。自分はこの拡張の持つAuto-clear Search Barという機能が気に入ってたんだけど、残念ながらこの拡張はFirefox 2.0に対応していない。そこでAuto-clear Search Bar機能のみを持った拡張を作ろうとして、手始めにkeyconfigで同様の機能を実装してみた。

以下のスクリプトをkeyconfigで適当なキー(例えばCtrl+Q)に割り当てて、新しいウィンドウを開き、割り当てたキーを押す。するとそれ以降、検索バーの検索ボタンクリックまたはエンターキー押下で、検索バーに表示されている検索ワードが自動的に消去されるようになる(Firefox 2.0専用)。

SearchbarAutoClear = {

    invokeLater: function(func) {
        /* alert("invokeLater: " + func); */
        setTimeout(func, 0);
    },

    getSearchbar: function() {
        return document.getElementById("searchbar");
    },

    clearSearchbarTextBox: function() {
        /* alert("clear!"); */
        var searchbar = this.getSearchbar();
        if (searchbar) {
            var searchbox = searchbar._textbox
            searchbox.textValue = '';
            searchbox.focus();
        }
    },

    searchBarClicked: function(event) {
        var target = event.originalTarget;
        var anonid = target.getAttribute("anonid");
        if ((anonid == "search-go-button") && (event.button == 0)) {
            SearchbarAutoClear.invokeLater(function() {
                    SearchbarAutoClear.clearSearchbarTextBox();
                    content.focus();
                });
        }
    },

    installAdvicedOnTextEntered: function() {
        var searchbar = this.getSearchbar();
        if (searchbar) {
            var target = searchbar._textbox;
            var method = 'onTextEntered';
            var originalOnTextEntered = target[method];
            target[method] = function(aEvent) {
                originalOnTextEntered.apply(this, aEvent);
                SearchbarAutoClear.clearSearchbarTextBox();
            };
        }
    },

    init: function() {
        var searchbar = this.getSearchbar();
        if (searchbar) {
            searchbar.addEventListener("click", this.searchBarClicked, true);
            this.installAdvicedOnTextEntered();
        }
    },

};

try {
    SearchbarAutoClear.init();
    alert("searchbar hack installed");
} catch (e) {
    alert("searchbar hack failed: " + e.description + " at " + e.number);
}