Javascript 将WebExtension从Chrome移植到Firefox?

Javascript 将WebExtension从Chrome移植到Firefox?,javascript,google-chrome,firefox,google-chrome-extension,firefox-addon-webextensions,Javascript,Google Chrome,Firefox,Google Chrome Extension,Firefox Addon Webextensions,我做了一个工作的Chrome扩展,它没有打包,只是我电脑上的一个目录。我发现我是 我遵循MDN上的“”指南,发现我的清单文件非常完美 然后,我按照有关如何执行扩展“”的说明进行操作 但是,当我单击目录中的任何文件时,什么也没有发生。扩展未加载。有什么建议吗?我知道扩展在Chrome fine中工作,加载时不会出错 manifest.json: { “清单版本”:2, “姓名”:“呃”, “说明”:“P”, “版本”:“1.0”, “浏览器操作”:{ “默认图标”:“icon.png”, “默认弹

我做了一个工作的Chrome扩展,它没有打包,只是我电脑上的一个目录。我发现我是

我遵循MDN上的“”指南,发现我的清单文件非常完美

然后,我按照有关如何执行扩展“”的说明进行操作

但是,当我单击目录中的任何文件时,什么也没有发生。扩展未加载。有什么建议吗?我知道扩展在Chrome fine中工作,加载时不会出错

manifest.json:

{
“清单版本”:2,
“姓名”:“呃”,
“说明”:“P”,
“版本”:“1.0”,
“浏览器操作”:{
“默认图标”:“icon.png”,
“默认弹出窗口”:“popup.html”
},
“背景”:{
“脚本”:[“background.js”]
},
“内容脚本”:[
{
“匹配项”:[“SiteIwant”],
“js”:[“ChromeFormFill.js”],
“运行时间”:“文档空闲”
}
],
“权限”:[
"*://*/*",
“饼干”,
“活动标签”,
“标签”,
"https://ajax.googleapis.com/"
],
“外部可连接”:{
“匹配项”:[“SiteIwant”]
}
}
ChromeFormFill.js:

//JavaScript源代码c
控制台日志(“内部内容”);
log(chrome.runtime.id);
document.getElementById(“ID”).value=chrome.runtime.ID.toString();
Background.js

chrome.runtime.onMessage.addListener(
功能(请求、发送方、发送响应){
如果(request.data==“info”){
控制台日志(“接收信息”);
返回true;
}
});
chrome.tabs.create(
{
url:“我的url”
主动:正确
},功能(选项卡){
executeScript(tab.id,{file:'Run.js',runAt:'document_idle'});
});
Run.js将发出警报('hi')

当我尝试将它加载到Firefox上时,它什么也做不了;什么也不会发生。

问题: 在manifest.json中: 不支持外部可连接的:1 。您可以跟随了解更多信息。目前,这项计划预计不会在何时实施

您需要使用不同的方法在站点上的代码和WebExtension之间进行通信。这样做的方法是注入一个内容脚本,并在站点代码和内容脚本之间进行通信。通常的方法是或。我的首选项是
CustomEvent()

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

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

匹配项
值需要有效(假定为故意编辑): 您有两行(一行有尾随的
,一行没有;两行的语法都正确):

“SiteIwant”
必须是有效的。我假设这是改变了一些有效的东西来混淆你正在使用的站点。我用过:

"matches": [ "*://*.mozilla.org/*" ]
在Background.js中: 台词: 需要:

    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" });
在Firefox48中,这一行在选项卡可用之前执行。这是一个错误。它固定在和中。您将需要其中一个来测试/继续开发

ChromeFormFill.js中的问题: 另一个Firefox 48错误(现已长期修复):
chrome.runtime.id未定义
。这在开发者版和晚间版中都已修复

潜在的内容脚本问题: 我将假设您的HTML中有一个ID=
'ID'
的元素。否则,您的
document.getElementById(“ID”)
将为
null
。不检查返回值是否有效

运行示例代码 一旦所有这些错误都解决了,并且在Firefox夜间版或开发者版下运行,它就可以正常工作了。但是,您没有任何依赖于外部可连接的
,这将无法正常工作


  • 注意到我忘了在原始答案中包含这个问题
    如果没有在Firefox上完全更新manifest.json.im,它将无法在Firefox中工作@woxxommanifest声明了
    background.js
    ,但在随后的引用中它被命名为
    background.js
    。虽然Chrome在Windows上是不区分大小写的,但Firefox在这方面可能会更严格一些。我甚至制作了一个只有基本清单的目录,并尝试了移植,没有加载任何内容。没有任何迹象表明清单已被读取
        url: 'http://www.mozilla.org/',
    
    chrome.tabs.executeScript(tab.id, { file: 'Run.js', runAt: "document_idle" });