我们在chrome上有一个可以正常使用的扩展程序,我们正尝试在Firefox中使用它。它具有背景,内容和弹出脚本,每个脚本彼此发送消息。
我们使用about:debugging作为临时扩展名加载了它。但是,在Firefox中,当我们尝试将任何消息发送到内容脚本时,会出现此错误:
未经检查的lastError值:错误:无法建立连接。 接收端不存在。
我们使用以下代码向所有标签发送消息:
chrome.tabs.query({}, function (tabs) {
let lastTabId = tabs[0].id;
chrome.tabs.sendMessage(lastTabId, imessage);
});
这使我们无法建立错误,但是如果我将其更改为:
chrome.tabs.query({ active: true }, function (tabs) {
let lastTabId = tabs[0].id;
chrome.tabs.sendMessage(lastTabId, imessage);
});
然后,我们不再收到错误,但是我们希望广播到所有标签页,这在Chrome浏览器中没有问题。
除上述内容外,当我们尝试从弹出窗口发送消息时,还会得到:
TypeError:chrome.tabs未定义(我们也尝试使用相同的错误浏览器)
在Firefox中运行时,我已经注销了浏览器和chrome,但不存在选项卡,但在chrome中,它位于popup.js中。
Firefox中的安全限制是否会阻止popup.js访问选项卡?我们已经在清单中添加了标签作为权限。
下面是Firefox中的浏览器对象,缺少标签,但Chrome中没有。
更新: 经过大量实验,似乎chrome中的弹出窗口的行为类似于具有后台具有的所有特权和权限的后台脚本,但是在Firefox中,它的行为类似于内容脚本,无法访问chrome.tabs。
清单:
{
"manifest_version": 2,
"name": "<removed>",
"description": "<removed>",
"author": "<removed>",
"version": "1",
"permissions": [
"activeTab",
"tabs",
"webNavigation",
"storage",
"http://*/*",
"https://*/*"
],
"options_ui": {
"page": "options.html"
},
"content_scripts": [
{
"matches": [
"<removed>"
],
"js": [
"js/vendor.js",
"js/content_script.js"
]
}
],
"browser_action": {
},
"background": {
"scripts": [
"js/vendor.js",
"js/background.js"
]
},
"web_accessible_resources": [
"popup.html",
"content/bootstrap.min.css"
]
}
我们也不将弹出窗口用作弹出窗口,而是将其加载到内容脚本中,并像侧边栏一样注入到页面中。这样是否可以将弹出窗口更改为更类似于内容脚本并且无法访问browser.tabs或chrome.tabs。
private buildSidebar() {
this._logger.logTimeStart("buildSidebar");
this._logger.logInfo("Build iframe sidebar");
if (this.hasSidebarBeenInititalise()) {
return;
}
let iframe = document.createElement('iframe');
iframe.id = "extension-sidebar";
iframe.height = "100%";
iframe.style.background = "#CCC";
iframe.style.height = "100%";
iframe.style.width = "0px";
iframe.style.position = "fixed";
iframe.style.top = "0px";
iframe.style.right = "0px";
iframe.style.zIndex = "9999999999999999999999";
iframe.frameBorder = "none";
iframe.src = chrome.extension.getURL(`popup.html?contentScriptIdentifier=${
this._uniqueIdentifier}¤tUrl=${document.URL}`);
this._logger.logInfo("Append iframe sidebar");
document.body.appendChild(iframe);
}