3

Firefox 17.0.1 では、KeyConfig 20110522 というアドオンを使用していくつかの新しいホット キーを設定し、新しいキーとそうする必要のないアドオンacceltextのも設定しています。menuitems

Firefox の起動時に を設定したいのです、現在、ホット キーを使用して、KeyConfigを介して UI に対して次のコードを実行しています。acceltextmenuitems

document.getElementById("tabmix-menu")
  .setAttribute("acceltext","Alt+Ctrl+Shift+T");
// more of the same...

初心者向けのヒントがいくつか必要です。

  • コンソール経由で HTML ページに対して実行するのと同じ方法で、UI に対して任意のコードを実行するにはどうすればよいですか?

  • XUL 開発を深く掘り下げずに、ブラウザの起動時に実行するコードの塊を取得する卑劣な方法はありますか?

  • UI に対して実行されたコマンドをトレースして、次のようにホット キーを設定したときにトリガーを使用する代わりにコマンド呼び出しを取得できるようにする方法はありますか。

document.getElementById("tabmix-menu").click();

この種の低レベルのハッキングに関するその他のヒントも歓迎します。

4

1 に答える 1

0

アドオンから Firefox UI に対して任意のコードを実行できますが、あなたが言うように、XUL 関連のすべてのことを行うのは少し退屈です :-)

「ブートストラップ」拡張機能を入力してください!

パート1:

「Bootstrapped」(または re-startless) 拡張機能には、アドオンを識別するための install.rdf ファイルと、ブートストラップ インターフェースを実装するための bootstrap.js ファイルのみが必要です。

ブートストラップ インターフェイスは非常に簡単に実装できます。

function install() {}
function uninstall() {}
function shutdown(data, reason) {}
function startup(data, reason) { /* YOUR ARBITRARY CODE HERE! */ }

install.rdf新しい zip ファイルのトップレベルにandを配置して拡張機能をコンパイルしbootstrap.js、zip ファイル拡張子の名前を .xpi に変更します。

パート2:

あなたのコードには特権が与えられており、Mozilla プラットフォーム API のいずれかを使用できます。ただし、タイミングの問題があります。「スタートアップ」関数が実行される瞬間は、Chrome ウィンドウ オブジェクトがまだ存在しない瞬間です!

コードにとって Chrome ウィンドウがあることが重要な場合は、それが表示されるまで待つ必要があります。

// useful services.
Cu.import("resource://gre/modules/Services.jsm");    
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
                .getService(Ci.mozIJSSubScriptLoader);

var wmSvc = Cc["@mozilla.org/appshell/window-mediator;1"]
                .getService(Ci.nsIWindowMediator);

var logSvc = Cc["@mozilla.org/consoleservice;1"]
                .getService(Ci.nsIConsoleService);

// get the first gBrowser 
var done_startup = 0;
var windowListener;
function do_startup(win) {

    if (done_startup) return;
    done_startup = 1;
    wmSvc.removeListener(windowListener);

    var browserEnum = wmSvc.getEnumerator("navigator:browser");
    var browserWin = browserEnum.getNext();
    var tabbrowser = browserWin.gBrowser;

    /* your code goes here! */
}

// window listener implementation
windowListener = {
    onWindowTitleChange: function(aWindow, aTitle) {},
    onCloseWindow:       function(aWindow) {},
    onOpenWindow:        function(aWindow) {
        var win = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                     .getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
        win.addEventListener("load", function(aEvent) {
            win.removeEventListener("load", arguments.callee, false);
            if (aEvent.originalTarget.nodeName != "#document") return;
            do_startup();
        }
};

// CODE ENTRY POINT (put this in bootstrap "startup" function)
wmSvc.addListener(windowListener);
于 2013-01-12T08:16:18.957 に答える