未经检查的lastError值:错误:没有匹配的窗口 - 在Firefox WebExtension中尝试使用命令执行脚本时出现此错误

时间:2016-07-15 17:08:04

标签: javascript firefox firefox-addon firefox-webextensions

我有这部分代码(一切都在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 ...

2 个答案:

答案 0 :(得分:2)

我发现了问题,这是失踪的" all_urls"允许。 显然"标签"和" activeTab"权限还不够。

答案 1 :(得分:1)

您获得的错误是当您尝试注入您无权注入的选项卡时产生的错误。如果您的 manifest.json 中没有设置适当的permissions,则可以是普通标签。更常见的是,您尝试注入包含不允许注入的页面的选项卡。这包括大多数about:*页面(特别是about:debugging,其中加载项作为临时加载项加载),但现在还包括AMO上的页面(例如https://addons.mozilla.org)。

此外,您的代码并未明确地测试当前窗口中的活动选项卡 以查找您正在测试的URL。实际上,这意味着您可能正在尝试注入一个未检查URL匹配的选项卡。

您执行以下操作:

function(tabs) {
    var tab = tabs[0];

这假设tabs.Tab返回的tabs.query()数组将当前窗口的活动选项卡作为该数组中的第一个对象,当您请求所有active:true时标签。虽然在大多数情况下假设可能是正确的,但并不能保证它是一个有效的假设。如果您打开了多个窗口,则会有多个活动选项卡。数组中这些选项卡的顺序不保证首先具有当前窗口的顺序。您可能应该将queryInfo对象更改为{active:true,currentWindow:true}

实际上,您可能正在尝试注入当前窗口中不是活动选项卡的选项卡。