2

我制作了一个未打包的可用 Chrome 扩展程序,它只是我计算机上的一个目录。我发现我应该能够很容易地将它移植到 Firefox

我按照 MDN 上的“移植 Google Chrome 扩展”指南,发现我的清单文件非常完美。

然后我按照有关如何执行扩展的“在 Firefox 中的临时安装”的说明进行操作。

但是,当我单击目录中的任何文件时,什么也没有发生。扩展不加载。有什么建议吗?我知道该扩展程序在 Chrome 中运行良好,并且加载时不会出错。

清单.json

{
  "manifest_version": 2,
  "name": "ER",
  "description": "P",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },

  "background": {
    "scripts": [ "background.js" ]
  },

  "content_scripts": [
    {
      "matches": [ "SiteIwant" ],
      "js": [ "ChromeFormFill.js" ],
      "run_at":  "document_idle" 

    }
  ],

  "permissions": [
    "*://*/*",
    "cookies",
    "activeTab",
    "tabs",
    "https://ajax.googleapis.com/"
  ],
  "externally_connectable": {
    "matches": ["SiteIwant"]
  }
}

ChromeFormFill.js

// JavaScript source c
console.log("inside content");
console.log(chrome.runtime.id);
document.getElementById("ID").value = chrome.runtime.id.toString();

背景.js

chrome.runtime.onMessage.addListener(
  function (request, sender, sendResponse) {
      if (request.data === "info") {
          console.log("Recieving Info");
          return true;
      }
 });

chrome.tabs.create(
{
    url: 'myUrl' 
    active: true
}, function (tab) {
    chrome.tabs.executeScript(tab.id, { file: 'Run.js', runAt: "document_idle" });
});

Run.js将只是alert('hi').

当我尝试在 Firefox 上加载它时,它不会做任何事情;什么都不会发生。

4

1 回答 1

4

问题:

manifest.json中:

externally_connectable不支持:1

火狐不支持externally_connectable。您可以关注错误 1319168以获取更多信息。目前,没有预期的时间来实施。

您将需要使用不同的方法在您网站上的代码和 WebExtension 之间进行通信。这样做的方法是注入内容脚本并在站点代码和内容脚本之间进行通信。执行此操作的常用方法是CustomEvent()window.postMessage()。我的偏好是CustomEvent()

使用window.postMessage()就像在外面大喊你的信息并希望没有其他人在听,或者他们知道他们应该忽略该信息。其他人也在使用的代码window.postMessage()必须是为了忽略您的消息而编写的。您必须编写代码以忽略来自其他代码的任何潜在消息。如果其中任何一个没有完成,那么您的代码或其他代码可能会出现故障。

使用CustomEvent()就像直接与房间里的某人交谈。其他人可能正在听,但他们需要知道房间的存在才能这样做,并特别选择听你的谈话。自定义事件仅由侦听您指定的事件类型的代码接收,该事件类型可以是您选择的任何有效标识符。这使得干扰错误发生的可能性大大降低。您还可以选择使用多种不同的事件类型来表示不同的事物,或者只使用一种事件类型并为您的消息定义一个格式,以便区分您需要的任何可能的消息类型。

matches值需要有效(假设被故意编辑):

您有两行(一行带有尾随,,一行没有;都在语法上正确):

"matches": ["SiteIwant"]

"SiteIwant"必须是有效的匹配模式。我假设这已从有效的内容更改为混淆您正在使用的网站。我用了:

"matches": [ "*://*.mozilla.org/*" ]

Background.js中:

这些行:

    url: 'myUrl' 
    active: true

需要:

    url: 'myUrl',
    active: true

[注意,后面的'myUrl'.] 另外,myUrl 需要是一个有效的 URL。我用了:

    url: 'http://www.mozilla.org/',

一个 Firefox 48 错误(现已长期修复):

您的线路:

chrome.tabs.executeScript(tab.id, { file: 'Run.js', runAt: "document_idle" });

在 Firefox 48 中,此行在选项卡可用之前执行。这是一个错误。它已在Firefox Developer EditionNightly中修复。您将需要其中之一来测试/继续开发。

ChromeFormFill.js中的问题:

另一个 Firefox 48 错误(现已长期修复):

chrome.runtime.id is undefined. 这在 Developer Edition 和 Nightly 中已修复。

潜在的内容脚本问题:

我将假设您的 HTML 有一个 ID = 的元素'ID'。如果没有,你document.getElementById("ID")将是null。您不检查返回的值是否有效。

运行您的示例代码

一旦所有这些错误都得到解决,并在 Firefox Nightly 或 Developer Edition 下运行,它就可以正常工作了。但是,您没有任何依赖于 being 的东西externally_connectable,它不会起作用。


  1. agaggi注意到我忘记在我的答案的原始版本中包含这个问题。
于 2016-08-12T05:31:55.167 回答