将消息从内容脚本传递到main

时间:2014-09-26 14:51:24

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

编辑3:找到解决方案/修复

这是为我解决的SO线程:PageMod attaching worker to same URL multiple times

TLDR:如果页面包含iFrame,它会将一个worker / content脚本附加到它,这会导致多个内容脚本尝试运行。使用attachTo: 'top'仅将脚本附加到顶级文档而不附加iFrame。


我正在努力移植我制作的简单Chrome扩展程序,而且我很难为Firefox插件传递消息。这就是我所拥有的。

csScript.js

self.port.emit("url", getVideoUrl());

function getVideoUrl() {  
  return $('meta[itemprop=contentURL]').prop('content');
}

main.js

pageMod.PageMod({
  include: [URLs],
  exclude: [URLs],
  contentScriptFile: [data.url("jquery-2.1.1.min.js"),
                      data.url("csScript.js")],
  onAttach: function(worker) {
    worker.port.on("url", function(url) {
      var videoUrl = validateUrl(url);
      });
    }
  });

当某个网址被点击时,我想获取一个属性值并将其发送回我的main.js并使用它。由于它现在有效,我收到message is null错误。我已经阅读了文档,但似乎无法理解如何传递消息。


修改:将onAttach更改为:

onAttach: function(worker) {
    worker.port.on("url", function(url) {
      var videoUrl = validateUrl(url);
      });
    }
  });

似乎没什么变化。我需要做的就是将内容脚本中的一个字符串传递回我的main.js文件。但是,根据上面的代码,它告诉我urlnull。我查看的所有文档似乎表明这是Firefox插件中消息传递的工作方式。


Edit2:添加一些日志语句后,我注意到了几件事:

1)匹配URL时,我的内容脚本运行10次以上。我不知道原因。 脚本附加到每个iFrame。

2)大多数时候,URL返回null / undefined。但是,它可以正常工作一次 - 从内容脚本中提取URL,然后将其正确传递回main.js文件。然而,它会被再次运行的内容脚本迅速消灭。

2 个答案:

答案 0 :(得分:2)

首先确保getVideoUrl()正在返回一个字符串,我猜测

$('meta[itemprop=contentURL]').prop('content')
在您获得message is null的情况下,

不会返回字符串。

你也有:

onAttach: function(worker) {
  worker.port.on("url", function(message) {
    var videoUrl = validateUrl(message.url);
    videoUrl5k = make5kUrl(videoUrl);
  });
}

我改为:

onAttach: function(worker) {
  worker.port.on("url", function(url) {
    var videoUrl = validateUrl(url);
    videoUrl5k = make5kUrl(videoUrl);
  });
}

也许这解决了这个问题?因为我没有看到make5kUrl

的定义

答案 1 :(得分:0)

pageMod构造函数中,使用attachTo: 'top'选项会将脚本仅附加到顶级文档。内容脚本已附加到其他iFrame,然后尝试运行。