Firefox addon 控制firefox选项卡

Firefox addon 控制firefox选项卡,firefox-addon,xul,Firefox Addon,Xul,我正在开发一个firefox扩展,直到现在我还在使用XUL,以控制用户在网站上的导航并保存访问过的页面,但是浏览器有限,我尝试了一个简单的google搜索,当我点击一些结果时,它不会显示在浏览器中 一个想法是将xul应用程序移动到Dialog并控制实际的firefox选项卡。 但是我不知道怎么做。(根据您的评论…) 要创建记录选项卡“加载”事件的加载项,请创建引导(无重启)加载项: bootstrap.js(包含“特权”代码的JavaScript文件) install.rdf(描述Firefr

我正在开发一个firefox扩展,直到现在我还在使用XUL,以控制用户在网站上的导航并保存访问过的页面,但是浏览器有限,我尝试了一个简单的google搜索,当我点击一些结果时,它不会显示在浏览器中

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

(根据您的评论…)

要创建记录选项卡“加载”事件的加载项,请创建引导(无重启)加载项:

  • bootstrap.js(包含“特权”代码的JavaScript文件)
  • install.rdf(描述Firefrox插件的XML文件)
要构建插件,只需将两个文件都放在ZIP文件的顶层(没有文件夹!),文件扩展名为
.xpi
。要安装加载项,请导航到
关于:加载项
,然后从工具菜单中单击
从文件安装
,找到XPI,打开它,然后在短暂延迟后选择
安装


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>
基本上,这会为web浏览器的每个当前和未来窗口调用
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的
TabBrowser
中为
load
事件安装事件侦听器。
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);
  }
}
var my\u load\u handler=函数(evt){
试一试{
var browserEnumerator=wm.getEnumerator(“导航器:浏览器”);
while(browserEnumerator.hasMoreElements()){
var browserWin=browserEnumerator.getNext();
var tabbrowser=browserWin.gBrowser;
var numTabs=tabbrowser.browsers.length;
对于(变量索引=0;索引

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

您是在尝试在firefox自己的
TabBrowser
中“控制firefox选项卡”,还是在创建一个附加窗口并使用
Browser
元素来呈现一些远程内容?如果是后者,为什么?我正在尝试第一个选项,我想在firefox标签中记录访问过的网站。好吧,举个例子……有比枚举所有窗口和标签更直接的方法。(例如:使用nsIProgressListener接口)但这种方式很容易理解。
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);
  }
}