Unchecked lastError value: Error: No matching window - I get this error when trying to execute script with command in Firefox WebExtension
Unchecked lastError value: Error: No matching window - I get this error when trying to execute script with command in Firefox WebExtension
我有这部分代码(一切都在background.js中),它基本上根据页面的URL在页面中执行javascript。它应该适用于工具栏按钮单击和 Ctrl + Q 命令。
我像这样将它分配给按钮点击,它起作用了:
chrome.browserAction.onClicked.addListener(function(tab) {
browser.tabs.query(
{active:true},
function(tabs) {
var tab = tabs[0];
if(tab.url.indexOf("app.fillz.com/orders/edit") != -1){
chrome.tabs.executeScript({
file: "fillz.js"
});
} else if(tab.url.indexOf("amazon") != -1 && tab.url.indexOf("buy/addressselect/handlers/display.html") != -1){
chrome.tabs.executeScript({
file: "amazon.js"
});
}
}
);
});
问题是当我尝试将相同的代码分配给 onCommand 事件时,如下所示:
chrome.commands.onCommand.addListener(function(command) {
if (command == "fills2amazonCopyAndPaste") {
browser.tabs.query(
{active:true},
function(tabs) {
var tab = tabs[0];
if(tab.url.indexOf("app.fillz.com/orders/edit") != -1){
console.log("FILLZ");
chrome.tabs.executeScript({
file: "fillz.js"
});
} else if(tab.url.indexOf("amazon") != -1 && tab.url.indexOf("buy/addressselect/handlers/display.html") != -1){
console.log("AMAZON");
chrome.tabs.executeScript({
file: "amazon.js"
});
}
}
);
}
});
命令被识别,还有当前活动选项卡的 url,我用上面代码中的那两个 console.log() 命令检查了它,但是当我尝试执行时脚本没有执行用命令来做。在浏览器控制台中,只有这个错误:
Unchecked lastError value: Error: No matching window
源自://gre/modules/ExtensionUtils.jsm
可能是什么问题,我知道我的 manifest.json 文件没问题,因为命令被识别,但它根本不会执行 javascript...
我发现了问题,是缺少 "all_urls" 权限。
显然 "tabs" 和 "activeTab" 权限不够。
您遇到的错误是当您尝试注入您无权注入的选项卡时产生的错误。如果您没有在 manifest.json 中设置适当的 permissions
,这可能是一个普通选项卡。更常见的是,您正试图注入包含不允许注入的页面的选项卡。这包括大多数 about:*
页面(特别是 about:debugging
,加载项作为临时加载项从中加载),但现在也包括 AMO 上的页面(例如 https://addons.mozilla.org
)。
此外,您的代码并未针对您正在测试的 URL 明确测试当前 window 中的活动选项卡 。实际上,这意味着您可能正在尝试注入一个您尚未检查 URL 匹配您想要的选项卡。
您执行以下操作:
function(tabs) {
var tab = tabs[0];
这假设当您请求所有 active:true
选项卡时,tabs.Tab
returned by tabs.query()
数组将当前 window 的活动选项卡作为该数组中的第一个对象.虽然假设在大多数情况下可能是正确的,但不能保证它是有效的假设。如果您有多个 windows 打开,您将有多个活动标签。不能保证数组中这些选项卡的顺序首先是当前 window 的选项卡。您可能应该将 queryInfo 对象更改为 {active:true,currentWindow:true}
.
事实上,您可能正试图注入一个不是当前 window 中活动标签的标签。
我有这部分代码(一切都在background.js中),它基本上根据页面的URL在页面中执行javascript。它应该适用于工具栏按钮单击和 Ctrl + Q 命令。
我像这样将它分配给按钮点击,它起作用了:
chrome.browserAction.onClicked.addListener(function(tab) {
browser.tabs.query(
{active:true},
function(tabs) {
var tab = tabs[0];
if(tab.url.indexOf("app.fillz.com/orders/edit") != -1){
chrome.tabs.executeScript({
file: "fillz.js"
});
} else if(tab.url.indexOf("amazon") != -1 && tab.url.indexOf("buy/addressselect/handlers/display.html") != -1){
chrome.tabs.executeScript({
file: "amazon.js"
});
}
}
);
});
问题是当我尝试将相同的代码分配给 onCommand 事件时,如下所示:
chrome.commands.onCommand.addListener(function(command) {
if (command == "fills2amazonCopyAndPaste") {
browser.tabs.query(
{active:true},
function(tabs) {
var tab = tabs[0];
if(tab.url.indexOf("app.fillz.com/orders/edit") != -1){
console.log("FILLZ");
chrome.tabs.executeScript({
file: "fillz.js"
});
} else if(tab.url.indexOf("amazon") != -1 && tab.url.indexOf("buy/addressselect/handlers/display.html") != -1){
console.log("AMAZON");
chrome.tabs.executeScript({
file: "amazon.js"
});
}
}
);
}
});
命令被识别,还有当前活动选项卡的 url,我用上面代码中的那两个 console.log() 命令检查了它,但是当我尝试执行时脚本没有执行用命令来做。在浏览器控制台中,只有这个错误:
Unchecked lastError value: Error: No matching window
源自://gre/modules/ExtensionUtils.jsm
可能是什么问题,我知道我的 manifest.json 文件没问题,因为命令被识别,但它根本不会执行 javascript...
我发现了问题,是缺少 "all_urls" 权限。 显然 "tabs" 和 "activeTab" 权限不够。
您遇到的错误是当您尝试注入您无权注入的选项卡时产生的错误。如果您没有在 manifest.json 中设置适当的 permissions
,这可能是一个普通选项卡。更常见的是,您正试图注入包含不允许注入的页面的选项卡。这包括大多数 about:*
页面(特别是 about:debugging
,加载项作为临时加载项从中加载),但现在也包括 AMO 上的页面(例如 https://addons.mozilla.org
)。
此外,您的代码并未针对您正在测试的 URL 明确测试当前 window 中的活动选项卡 。实际上,这意味着您可能正在尝试注入一个您尚未检查 URL 匹配您想要的选项卡。
您执行以下操作:
function(tabs) {
var tab = tabs[0];
这假设当您请求所有 active:true
选项卡时,tabs.Tab
returned by tabs.query()
数组将当前 window 的活动选项卡作为该数组中的第一个对象.虽然假设在大多数情况下可能是正确的,但不能保证它是有效的假设。如果您有多个 windows 打开,您将有多个活动标签。不能保证数组中这些选项卡的顺序首先是当前 window 的选项卡。您可能应该将 queryInfo 对象更改为 {active:true,currentWindow:true}
.
事实上,您可能正试图注入一个不是当前 window 中活动标签的标签。