Firefox附加组件设置来自* .port.on()的全局变量

时间:2015-07-10 17:08:54

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

我不知道为什么这不起作用。即使我在control_window.port.on中设置了vars文本和大小,也会显示为未定义。我还没有找到解决方法。

var self = require('sdk/self');

// a dummy function, to show how tests work.
// to see how to test this function, look at test/test-index.js
function dummy(text, callback) {
  callback(text);
}

exports.dummy = dummy;
//ignore above
var buttons = require('sdk/ui/button/action');
var tabs = require("sdk/tabs");

var pageMod = require("sdk/page-mod");
var data = require("sdk/self").data;
var text;
var size;

function setTextAndSize(texts, siz) {
    text = texts;
    size = siz;
}

pageMod.PageMod({
  include: "*.example.com",
  contentScriptFile: data.url("myscript.js"),
  contentScriptOptions: {"text" : text, "size" : size}//text and size are undefined even though I set them line 57.
});

var control_window = require("sdk/panel").Panel({
  contentURL: data.url("control.html"),
  contentScriptFile: data.url("controlget.js")
});

var button = buttons.ActionButton({
  id: "myicon",
  label: "My add on",
  icon: {
    "16": "./icon-16.png",
    "32": "./icon-32.png",
    "64": "./icon-64.png"
  },
  onClick: handleClick
});

control_window.on("show", function() {
  control_window.port.emit("show");
});

function opentabb() {
    tabs.open("http://example.com");
}

control_window.port.on("start", function (text, size, info, link) {
    console.log("Text: "+text+" Size: "+size);//this works
    control_window.hide();
    setTextAndSize(code, size);//does not set for some reason
    opentabb();
});

control_window.port.on("text-entered", function (text) {
  console.log(text);
  control_window.hide();
});

function handleClick(state) {
    control_window.show();
}

我想从control_window.port.on()

设置全局变量文本和大小

如果我初始化var text = "test"var size = "testsize",则pagemod会显示"test""testsize",但control_window.port.on()仍然不会设置var text;或{{1} }}

1 个答案:

答案 0 :(得分:0)

  

从Firefox 30开始,内容脚本的执行环境   已更改,因此内容脚本无法直接与页面共享对象   脚本。这会影响使用自定义事件发送消息   用于页面脚本的内容脚本。

您需要使用window.postMessage()在内容脚本之间进行通信。

你可以沿着这些方向做点什么。

PageMod内容脚本中。

// myscript.js
window.postMessage({text: self.options.text, size: self.options.size},'*');

Panel内容脚本中。

// controlget.js
window.addEventListener('message', function(event){
  self.port.emit('start', event.data.text, event.data.size, 'some info', window.location.href);
});

祝你好运。