Я пытаюсь запустить выполнить скрипт из моего фона сценария с помощью сочетаний клавиш, она не работает и возвращает:Не удается успешно запустить executeScript из фонового скрипта, если я не загружать всплывающую страницу/скрипт первый
Error: No window matching {"matchesHost":[]}
Но если я просто открою всплывающее окно, закройте его и сделайте то же самое, все будет работать.
Я воссоздал проблему при использовании примера Beastify с минимальными изменениями. Вот код:
manifest.json
{
... (not interesting part, same as in beastify)
"permissions": [
"activeTab"
],
"browser_action": {
"default_icon": "icons/beasts-32.png",
"default_title": "Beastify",
"default_popup": "popup/choose_beast.html"
},
"web_accessible_resources": [
"beasts/frog.jpg",
"beasts/turtle.jpg",
"beasts/snake.jpg"
],
My additions start here:
"background": {
"scripts": ["background_scripts/background_script.js"]
},
"commands": {
"run_content_test": {
"suggested_key": {
"default": "Alt+Shift+W"
}
}
}
}
Всплывающие/choose_beast.js (такой же, как в оригинале)
/*
Given the name of a beast, get the URL to the corresponding image.
*/
function beastNameToURL(beastName) {
switch (beastName) {
case "Frog":
return browser.extension.getURL("beasts/frog.jpg");
case "Snake":
return browser.extension.getURL("beasts/snake.jpg");
case "Turtle":
return browser.extension.getURL("beasts/turtle.jpg");
}
}
/*
Listen for clicks in the popup.
If the click is on one of the beasts:
Inject the "beastify.js" content script in the active tab.
Then get the active tab and send "beastify.js" a message
containing the URL to the chosen beast's image.
If it's on a button wich contains class "clear":
Reload the page.
Close the popup. This is needed, as the content script malfunctions after page reloads.
*/
document.addEventListener("click", (e) => {
if (e.target.classList.contains("beast")) {
var chosenBeast = e.target.textContent;
var chosenBeastURL = beastNameToURL(chosenBeast);
browser.tabs.executeScript(null, {
file: "/content_scripts/beastify.js"
});
var gettingActiveTab = browser.tabs.query({active: true, currentWindow: true});
gettingActiveTab.then((tabs) => {
browser.tabs.sendMessage(tabs[0].id, {beastURL: chosenBeastURL});
});
}
else if (e.target.classList.contains("clear")) {
browser.tabs.reload();
window.close();
return;
}
});
background_scripts/background_script.js (добавленные me)
browser.commands.onCommand.addListener(function(command) {
var executing = browser.tabs.executeScript(
null,
{file: "/content_scripts/content_test.js"});
executing.then(
function (res){
console.log("started content_test.js: " + res);
},
function (err){
console.log("haven't started, error: " + err);
});
});
content_scripts/content_test.js (добавленный мной)
alert("0");
Я пропуская целые content_scripts/beastify.js потому что это не имеет ничего общего с ним (ИМО), но он может можно найти here.
Теперь я знаю, что фоновый скрипт запускается и получает сообщения, даже когда всплывающая страница еще не открывалась раньше, потому что я вижу, что она не выполняет сценарий. Я понятия не имею, что вызывает это поведение, и если есть способ его исправить.
Примечание: Я попытался добавить разрешения, такие как «вкладки» и даже «all_urls», но ничего не изменил.
Примечание 2: Я запускаю надстройку в качестве временного дополнения на странице about: debugging, но я пытаюсь выполнить сценарий на обычной странице без ограничений (на этой странице например, я могу воссоздать проблему).
Спасибо большое, ребята!
Пожалуйста, опишите * точное * взаимодействие с пользователем, который вы, начиная с, я полагаю, , загружая расширение как временное дополнение из 'about: debugging'. Я пытаюсь определить, что из всего, что вы делаете, вызывает вскрытие, чтобы разрешить ошибку. Ошибка, которую вы получаете: 'Ошибка: в некоторых случаях не ожидается сопоставление окон {" matchesHost ": []}' (при попытке ввести на вкладку, содержащую URL-адрес, для которого у вас нет разрешения на ввод). Это то, что вы должны обрабатывать грациозно в ловушке вашей обработки обещания. – Makyen
Привет, спасибо за ответ! Вы правы, я загружаю его как временное дополнение от «about: debugging». – SunlessVoid
Это не говорит мне, если вы пытаетесь выполнить его, когда URL-адрес активной вкладки в текущем окне «about: debugging». Также не намекает на объяснение того, почему всплывающее открытие/закрытие «исправляет» ошибку. Вам не разрешается вводить скрипты на большинство 'about: *' страниц, включая 'about: debugging' (и [некоторые другие страницы] (http://stackoverflow.com/q/40798543/3773011)). Попытка ввода сценариев с использованием 'tabs.executeScript()' на такие страницы приведет к ошибке, которую вы получаете. Есть решения для этого, но я все еще пытаюсь выяснить, почему открытие и закрытие всплывающего окна останавливает ошибку. – Makyen