为什么我的init()函数没有运行? (安装Firefox扩展时自动添加工具栏按钮但仅在首次运行时添加)

时间:2013-12-05 15:21:48

标签: javascript firefox xul toolbar

我一直在回答这个问题,并继续解决它。

我已经阅读了数十页描述如何操作的内容,并在此处查看了How can I make my Firefox extension toolbar button appear automatically?等答案,但我无法做到这一点。

我理解我需要做的事情的概念,但我已经达到的目的是,虽然扩展本身正常工作,但我不能让init()函数运行而且负载监听器不能似乎也被添加(我在alert代码之前和之后添加了window.top.addEventListener..,但alert s也没有被解雇。

我想要实现的是在安装/更新时添加工具栏按钮的推荐过程,但仅限于首次运行/安装。

我的扩展包括:

  • chrome.manifestinstall.rdf位于扩展根目录中。
  • 一个chrome文件夹,其中包含其他元素(extensionName.jsextensionName.pngextensionName.xulextensionName.cssicon.png)。
  • {li> prefs.js位于defaults/preferences目录中。这包含extensions.MyExtensionNameButton.firstRunDone pref设置为false

扩展本身完全按照要求工作(它包括工具栏按钮和右键单击上下文菜单项)。

我的extensionName.js文件包含以下内容(实际的扩展功能在工作时会被修剪掉,并且会使问题太长):

objMyExtensionNameButton = {

    // functions that are called by the .xul are in here,


    init : function() {
      var firstRunPref = "extensions.MyExtensionNameButton.firstRunDone";
      alert("init function run");
      if (!Application.prefs.getValue(firstRunPref)) {
        Application.prefs.setValue(firstRunPref, true);
        // all the rest of the first run code goes here.
        alert("this is the first run");
      } else {
        alert("this is NOT the first run");
      }
   }  
};

window.top.addEventListener("load", function() { objMyExtensionNameButton.init(); }, false);

包含.js文件的xul的相关部分如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css"
  href="chrome://MyExtensionNameButton/content/button.css"?>

<!DOCTYPE overlay >
<overlay id="MyExtensionNameButton-overlay"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script type="application/javascript"
  src="chrome://MyExtensionNameButton/content/MyExtensionNameButton.js"/>

<!-- Firefox -->
<toolbarpalette id="BrowserToolbarPalette">
  <toolbarbutton id="MyExtensionNameButton"/>
  </toolbarpalette>


<!-- button details -->
<toolbarbutton id="MyExtensionNameButton"

...etc etc etc...

安装扩展程序或Firefox启动时似乎无法运行任何内容 - 单击工具栏按钮中的扩展选项或右键单击菜单运行这些功能没有任何问题 - 这些功能都包含在对象中。

我尝试在该对象的内部和外部移动init()函数,我相信,正确调用它。

另一件奇怪的事情是,我似乎没有看到控制台中的扩展名出现任何错误(当我没有将default/preferences/prefs.js文件添加到{{1}时,我没有看到任何错误或者,所以在那里似乎也有问题。)

谢谢,

FM

1 个答案:

答案 0 :(得分:0)

在默认prefs.js中,您应该添加

pref('extensions.MyExtensionNameButton.firstRunDone', false);

由于pref extensions.MyExtensionNameButton.firstRunDone不存在,对Application.prefs.getValue(firstRunPref)的调用应该失败。

如果您打开错误控制台,按Ctrl + Shift + j,您应该会看到相关的错误。