控制firefox选项卡

时间:2014-02-04 10:27:37

标签: firefox-addon xul

我正在开发一个firefox扩展,直到现在我正在使用XUL browser来控制用户浏览网站并保存访问过的网页,但是浏览器是有限的,我试过一个简单的谷歌搜索,当我点击某些结果时,它将不会显示在浏览器中。

一个想法是将xul应用程序移动到Dialog并控制实际的firefox选项卡。 但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

(根据你的评论......)

要创建记录TAB'load'事件的插件,请创建一个bootstrapped(无重启)插件:

  • bootstrap.js(包含“特权”代码的JavaScript文件)
  • install.rdf(描述您的Firefrox插件的XML文件)

要构建插件,只需将两个文件放在ZIP文件的顶级(无文件夹!)中,文件扩展名为.xpi。要安装插件,请导航至about:addons,然后从工具菜单中点击Install from file,找到您的XPI,打开它,然后在短暂延迟后选择Install


install.rdf中输入以下内容:

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
    <Description about="urn:mozilla:install-manifest">
        <em:id>youraddonname@yourdomain</em:id>
        <em:type>2</em:type>
        <em:name>Name of your addon</em:name>
        <em:version>1.0</em:version>
        <em:bootstrap>true</em:bootstrap>
        <em:description>Describe your addon.</em:description>
        <em:creator>Your name</em:creator>

        <!-- Firefox Desktop -->
        <em:targetApplication>
            <Description>
                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
                <em:minVersion>4.0.*</em:minVersion>
                <em:maxVersion>29.0.*</em:maxVersion>
            </Description>
        </em:targetApplication>
    </Description>
</RDF>

您需要在bootstrap.js

中实现两个必需的JavaScript函数
  • startup() - 在您安装插件时以及浏览器启动时调用。
  • shutdown() - 在卸载插件时以及浏览器关闭时调用。

您应该从startup()调用所有“特权”代码。为了卫生,您可以(也可能应该)实施install()uninstall()功能。

首先在bootstrap.js中实施以下代码:

const Cc = Components.classes;
const Ci = Components.interfaces;
let consoleService = Cc["@mozilla.org/consoleservice;1"]
                        .getService(Ci.nsIConsoleService);
let wm             = Cc["@mozilla.org/appshell/window-mediator;1"]
                        .getService(Ci.nsIWindowMediator);

function LOG(msg) {
  consoleService.logStringMessage("EXTENSION: "+msg);    
}

function startup() {
  try {
    LOG("starting up...");
    let windows = wm.getEnumerator("navigator:browser");
    while (windows.hasMoreElements()) {
      let chromeWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
      WindowListener.setupBrowserUI(chromeWindow);
    }
    wm.addListener(WindowListener);
    LOG("done startup.");
  } catch (e) {
    LOG("error starting up: "+e);
  }
}

function shutdown() {
  try {
    LOG("shutting down...");
    let windows = wm.getEnumerator("navigator:browser");
    while (windows.hasMoreElements()) {
      let chromeWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
      WindowListener.tearDownBrowserUI(chromeWindow);
    }
    wm.addListener(WindowListener);
    LOG("done shutdown.");
  } catch (e) {
    LOG("error shutting down: "+e);
  }
}

基本上,每个电流和电流都会调用WindowListener.setupBrowserUI()。您的网络浏览器的未来窗口。 WindowListener定义如下:

var WindowListener = {
  setupBrowserUI: function(chromeWindow) {
    chromeWindow.gBrowser.addEventListener('load', my_load_handler, true);
  },
  tearDownBrowserUI: function(chromeWindow) {
    chromeWindow.gBrowser.removeEventListener('load', my_load_handler, true);
  },
  onOpenWindow: function(xulWindow) {
    let chromeWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                         .getInterface(Ci.nsIDOMWindow);
    chromeWindow.addEventListener("load", function listener() {
      chromeWindow.removeEventListener("load", listener, false);
      var domDocument = chromeWindow.document.documentElement;
      var windowType = domDocument.getAttribute("windowtype");
      if (windowType == "navigator:browser")
        WindowListener.setupBrowserUI(chromeWindow);
    }, false);
  },
  onCloseWindow: function(chromeWindow) { },
  onWindowTitleChange: function(chromeWindow, newTitle) { }
};

OpenWindow事件设置事件监听器,然后在每个ChromeWindow的load中为TabBrowser事件安装事件监听器。 load事件处理程序定义为:

var my_load_handler = function (evt) {
  try {
    var browserEnumerator = wm.getEnumerator("navigator:browser");
    while (browserEnumerator.hasMoreElements()) {
      var browserWin = browserEnumerator.getNext();
      var tabbrowser = browserWin.gBrowser;
      var numTabs = tabbrowser.browsers.length;
      for (var index = 0; index < numTabs; index++) {
        var currentBrowser = tabbrowser.getBrowserAtIndex(index);
        var domWindow = currentBrowser.contentWindow.wrappedJSObject;
        if (!domWindow.hasOwnProperty('__logged_this_window__')) {
          LOG("TAB loaded:");
          LOG("   URL: "+domWindow.location.href);
          LOG("   TITLE: "+domWindow.title)
          domWindow.__logged_this_window__ = 1;
        }
      }
    }
  } catch (e) {
    LOG(e);
  }
}

基本上,如果Firefox中的任何load元素都有TabBrowser个事件,那么该函数将会运行。它将枚举所有Firefox窗口以及所有这些窗口的选项卡(Browser元素)。诀窍是当页面重新加载“内容”DomWindow上的所有自定义属性都丢失时,我们检查是否存在自定义属性。如果没有,那么我们会记录TAB内容页面的详细信息。