Непроверенное значение lastError: Ошибка: нет соответствующего окна — я получаю эту ошибку при попытке выполнить скрипт с помощью команды в Firefox WebExtension

У меня есть эта часть кода (все находится в background.js), которая в основном выполняет javascript на страницах на основе URL-адреса страницы. Он должен работать при нажатии кнопки панели инструментов и команде 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...


person kecman    schedule 15.07.2016    source источник
comment
Спасибо за код в вашем вопросе. Однако, особенно для отладки, нам нравится иметь возможность проверять ответы, которые мы предоставляем. Это означает, что мы должны иметь возможность дублировать проблему, а затем вносить проверенные изменения для ее решения. Это намного проще сделать, если вы предоставите полный минимально воспроизводимый пример, демонстрирующий проблему, с которой вы столкнулись. Если вы этого не сделаете, нам придется приложить значительно больше усилий, чтобы просто начать вам помогать. Это значительно уменьшит количество людей, которые будут это делать. Это также означает, что мы должны угадать, какой должна быть остальная часть кода.   -  person Makyen♦    schedule 15.07.2016
comment
Я отклонил этот вопрос, потому что он не содержит полного минимально воспроизводимого примера. Как минимум он не содержит ваш файл manifest.json. Без этого файла, включенного в вопрос, никто не сможет найти решение, которое вы указали в ответе, который вы опубликовали на этот вопрос. Таким образом, вопрос не имеет большого значения для тех, кто будет рассматривать его в будущем. Если вы обновите вопрос, включив в него минимально воспроизводимый пример, я удалю свой отрицательный голос. Если вы это сделаете, пожалуйста, оставьте комментарий с @Makyen, чтобы я был уведомлен об изменении.   -  person Makyen♦    schedule 16.07.2016


Ответы (2)


Я обнаружил проблему, это было отсутствующее разрешение «all_urls». По-видимому, разрешений «вкладки» и «activeTab» было недостаточно.

person kecman    schedule 15.07.2016

Ошибка, которую вы получаете, возникает, когда вы пытаетесь внедрить вкладку, для которой у вас нет разрешения на вставку. Это может быть обычная вкладка, если в вашем manifest.json не установлен соответствующий permissions. Чаще всего вы пытаетесь внедрить на вкладку, содержащую страницу, в которую это не разрешено. Сюда входят большинство about:* страниц (особенно about:debugging, с которых надстройки загружаются как временные надстройки), но теперь также включаются страницы в AMO (например, https://addons.mozilla.org).

Кроме того, ваш код не проверяет активную вкладку в текущем окне для тестируемого URL-адреса. По сути, это означает, что вы, возможно, пытаетесь внедрить вкладку, в которой вы не проверили, что URL-адрес соответствует тому, который вы хотите.

Вы делаете следующее:

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

Это делает предположение, что массив tabs.Tab возвращенный tabs.query() будет иметь активный tab для текущего окна в качестве первого объекта в этом массиве, когда вы запросили все active:true вкладок. Хотя предположение может быть правильным в большинстве случаев, не гарантируется, что оно является правильным. Если у вас открыто несколько окон, у вас будет несколько активных вкладок. Порядок этих вкладок в массиве не обязательно будет первым для текущего окна. Вероятно, вам следует изменить объект queryInfo на {active:true,currentWindow:true}.

Как бы то ни было, вы можете пытаться внедрить вкладку, которая не является активной вкладкой в ​​текущем окне.

person Makyen♦    schedule 15.07.2016
comment
Спасибо за ваш вклад, я рассмотрю эти советы по изменению кода, но ошибка заключалась в отсутствии разрешения all_urls в файле manifest.json! - person kecman; 15.07.2016
comment
@kecman, каким волшебством мы должны знать, что содержимое вашего файла manifest.json неверно, если вы не предоставили свой файл manifest.json в вопрос? Именно поэтому именно полный минимально воспроизводимый пример является требуется, чтобы вопросы отладки соответствовали теме stackoverflow. - person Makyen♦; 15.07.2016