2012-12-18 38 views
3

运行XUL类型的脚本与Firefox 17.0.1我使用的是附加的所谓KeyConfig 20110522设置一些新的热键,还可以设置的menuitems为我的新键acceltext以及为不需要这么做的附加组件。获取Firefox在启动时

menuitemsacceltext要设置当Firefox启动,但目前我只是使用热键通过KeyConfig执行对用户界面下面的代码:

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

我需要一些初学者的提示:

  • 我该如何执行任意的cod e在用户界面上的方式与我通过控制台在HTML页面上执行的方式相同?

  • 是否有一种偷偷摸摸的方式让浏览器启动时执行一堆代码而无需深入研究XUL开发?

  • 有没有办法追查对UI执行的命令,所以我可以在命令调用get使用触发器,当我把我的热键像这样反而:

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

任何其他

这种低级黑客攻击技巧也值得欢迎。

回答

0

您可以针对Firefox的用户界面从插件执行任意代码,但正如你说,做所有的XUL相关的东西是有点无趣:-)

进入“自举”扩展!

1部分:

A“自举”(或重新startless)扩展仅需要一个install.rdf的文件,以确定该附加组件,和一个bootstrap.js文件以实现自举接口。

引导程序接口,可以非常简单地实现:

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

你可以通过把install.rdf编译扩展和bootstrap.js放入新zip文件的顶层,并将zip文件扩展名重命名为.xpi。

第2部分:

你的代码是特权,并且可以使用任何Mozilla平台的API。但是有一个时间问题。执行“启动”功能的时间点是尚未存在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);