2016-12-23 1 views
0

Я пытаюсь запустить выполнить скрипт из моего фона сценария с помощью сочетаний клавиш, она не работает и возвращает:Не удается успешно запустить 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, но я пытаюсь выполнить сценарий на обычной странице без ограничений (на этой странице например, я могу воссоздать проблему).

Спасибо большое, ребята!

+0

Пожалуйста, опишите * точное * взаимодействие с пользователем, который вы, начиная с, я полагаю, , загружая расширение как временное дополнение из 'about: debugging'. Я пытаюсь определить, что из всего, что вы делаете, вызывает вскрытие, чтобы разрешить ошибку. Ошибка, которую вы получаете: 'Ошибка: в некоторых случаях не ожидается сопоставление окон {" matchesHost ": []}' (при попытке ввести на вкладку, содержащую URL-адрес, для которого у вас нет разрешения на ввод). Это то, что вы должны обрабатывать грациозно в ловушке вашей обработки обещания. – Makyen

+0

Привет, спасибо за ответ! Вы правы, я загружаю его как временное дополнение от «about: debugging». – SunlessVoid

+0

Это не говорит мне, если вы пытаетесь выполнить его, когда URL-адрес активной вкладки в текущем окне «about: debugging». Также не намекает на объяснение того, почему всплывающее открытие/закрытие «исправляет» ошибку. Вам не разрешается вводить скрипты на большинство 'about: *' страниц, включая 'about: debugging' (и [некоторые другие страницы] (http://stackoverflow.com/q/40798543/3773011)). Попытка ввода сценариев с использованием 'tabs.executeScript()' на такие страницы приведет к ошибке, которую вы получаете. Есть решения для этого, но я все еще пытаюсь выяснить, почему открытие и закрытие всплывающего окна останавливает ошибку. – Makyen

ответ

3
// in manifest.json 

    "permissions": [ 
     "<all_urls>", 
     "activeTab" 
    ], 

МОЖЕТ РАБОТАЮТ ДЛЯ меня (Firefox 50, Mac OS X 10.11.6).

я получил точно такое же сообщение об ошибке вы описали, когда я использовал оригинальный

"permissions": [ 
     "activeTab" 
    ], 

Так что добавление "<all_urls>" кажется, решить эту проблему. Однако вы сказали, что по-прежнему возникают проблемы, когда вы включаете «all_urls» в свои разрешения, поэтому я не уверен, способ, которым я это сделал, исправляет проблему в вашей собственной настройке.

Редактировать: Является ли предоставление какого-либо расширения для веб-сайта такими широкими разрешениями, было бы разумно с точки зрения рисков безопасности, которые оно может представлять, является отдельным важным соображением.

(я бы отправил это как комментарий, но я не хватает репутации еще, чтобы иметь возможность добавлять комментарии.)

+0

Эй, спасибо за ответ, и спасибо Богу, что вы это проверили, потому что, видимо, – SunlessVoid

+0

(даже не редактировать мои собственные комментарии) ... Я использовал «all_urls», а не «». На стороне заметки, есть ли способ создать предупреждение из фонового скрипта без executeScript? Чувствует странность, придавая моему дополнению эту привилегию. – SunlessVoid

+0

@SunlessVoid, Re: alert: не легко. Вы можете создать что-то напоминающее предупреждение, но оно требует значительного количества кода. – Makyen

Смежные вопросы