使用Add-on SDK创建XPI包?

时间:2014-07-04 12:24:24

标签: javascript firefox-addon firefox-addon-sdk

我的任务是为Firefox编写一个附加组件,它将向现有页面添加div元素。我下载了附加SDK并编写了一个main.js文件,如下所示:

var data = require("sdk/self").data;
require("sdk/tabs").on("ready", ExecuteAd);

function ExecuteAd(tab) {
  if ( tab.url.indexOf("some url checking") > -1 ) {
    var image = "http://www.lavasoft.com/img/product_icons/aaw11/free.png";
    var link = "http://www.google.me";

    tab.attach({
        contentScriptFile: data.url("myscript.js"),
        contentScript: "appendFunc('"+image+"', '"+link+"');"
        //contentScript: "alert('Works');"
    });
  }
}

当我执行命令cfx run时,它启动Firefox,如果我转到特定的网页,这个脚本可以工作。但是当我使用cfx xpi创建XPI文件然后单击Firefox并打开该文件时,它会安装我的附加组件,但现在当我转到相同的网页时,我添加之前加载项不起作用。我有这个外部Javascript文件,存储在文件夹' data'。

appendFunc位于myscript.js文件中。

如何让我的扩展在生产环境中工作而不仅仅是测试环境?我认为主要的问题是它找不到这个数据/ myscript.js(它包含在.xpi文件中吗?)

1 个答案:

答案 0 :(得分:2)

请勿混用contentScriptcontentScriptFile。此外,您无法先知道两者的加载方式。

而是加载您的脚本,communicate using port

main.js

var data = require("sdk/self").data;
require("sdk/tabs").on("ready", ExecuteAd);

function ExecuteAd(tab) {
  var image = "http://www.lavasoft.com/img/product_icons/aaw11/free.png";
  var link = "http://www.google.me";
  var worker = tab.attach({
      contentScriptFile: data.url("myscript.js")
  });
  worker.port.emit("showAd", {image: image, link: link});
}

myscript.js

self.port.on("showAd", function(data) {
  console.log("showing ad", data.link, data.image);
});

另外,听起来PageMod对你正在做的事情来说是更好的选择。

PS:如果您计划在addons.mozilla.org网站上托管,请咨询Add-on Policies。政策,例如禁止注入a)没有明确标记的广告和b)用户在此之前没有选择加入的广告。