2016-12-23 2 views
0

Ich habe versucht Skript aus meinem Hintergrund Skript mithilfe von Tastenkombinationen ausführen ausführen, funktioniert es nicht und kehrt:Konnte nicht erfolgreich ExecuteScript vom Hintergrund Skript ausgeführt werden, wenn ich das popup/script lade erstes

Error: No window matching {"matchesHost":[]} 

Aber wenn ich nur die Popup-Seite öffne, schließe sie und mache das gleiche, alles funktioniert.

Ich habe das Problem bei der Verwendung des Beastify-Beispiels mit minimalen Änderungen neu erstellt. Hier ist der Code:

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" 
      } 
     } 
    } 
} 

Popup/choose_beast.js (das gleiche wie in original)

/* 
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 (ergänzt durch ich)

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 (von mir hinzugefügt)

alert("0"); 

ich die ganze content_scripts bin Überspringen/beastify.js weil es nichts mit ihm (IMO) zu tun hat, aber es kann gefunden werden here.

Jetzt weiß ich, dass das Hintergrundskript ausgeführt wird und die Nachrichten empfängt, auch wenn die Popup-Seite zuvor nicht geöffnet wurde, weil ich sehe, dass das Skript nicht ausgeführt wird. Ich habe keine Ahnung, was dieses Verhalten verursacht und ob es einen Weg gibt es zu beheben.

Hinweis: Ich habe versucht, Berechtigungen wie "Tabs" und sogar "all_urls", aber es hat nichts geändert.

Hinweis 2: Ich führe das Add-on als temporäres Add-on von der Seite about: debugging aus, aber ich versuche, das Skript auf einer normalen, nicht eingeschränkten Seite (auf dieser Seite) auszuführen zum Beispiel kann ich das Problem neu erstellen).

Vielen Dank Jungs!

+0

Bitte beschreiben Sie die * genaue * Interaktion mit dem Benutzer, die Sie von Start zu tun, ich nehme an , Laden der Erweiterung als temporäres Add-On von 'about: debugging'. Ich versuche herauszufinden, was Sie tun, wenn Sie das Popup öffnen, um den Fehler zu beheben. Der Fehler, den Sie bekommen, 'Fehler: Kein Fenster Matching {" ÜbereinstimmungenHost ": []}' wird unter bestimmten Umständen erwartet (wenn Sie versuchen, in eine Registerkarte mit einer URL zu injizieren, für die Sie keine Berechtigung zum injizieren haben). Es ist etwas, das Sie im Fangteil Ihrer Behandlung des Versprechens anmutig behandeln sollten. – Makyen

+0

Hallo, danke für die Antwort! Du hast recht, ich lade es als temporäres Add-On von 'about: debugging'. – SunlessVoid

+0

Das sagt mir nicht, wenn Sie versuchen, es auszuführen, wenn die URL für die aktive Registerkarte im aktuellen Fenster 'über: Debugging' ist. Es gibt auch keinen Hinweis darauf, warum das Öffnen/Schließen des Popups den Fehler "behebt". Sie dürfen keine Skripte in die meisten 'about: *' - Seiten einfügen, einschließlich 'about: debugging' (und [einige andere Seiten] (http://stackoverflow.com/q/40798543/3773011)). Der Versuch, Skripte mit 'tabs.executeScript()' in solche Seiten zu injizieren, führt zu dem Fehler, den Sie bekommen. Es gibt Lösungen dafür, aber ich versuche immer noch herauszufinden, warum das Öffnen und Schließen des Popups den Fehler stoppt. – Makyen

Antwort

3
// in manifest.json 

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

Funktioniert für mich (Firefox 50, Mac OS X 10.11.6). So ist die Zugabe von "<all_urls>" scheint die ursprüngliche

"permissions": [ 
     "activeTab" 
    ], 

benutzt hatte, um das Problem zu beheben

Ich hatte genau die gleiche Fehlermeldung erhalten Sie beschrieben, als ich. Sie haben jedoch angegeben, dass das Problem weiterhin auftritt, wenn Sie "all_urls" in Ihre Berechtigungen aufgenommen haben. Daher bin ich mir nicht sicher, ob die Art und Weise, wie ich es gemacht habe, das Problem in Ihrer eigenen Einrichtung behebt.

edit: Ob das Geben einer Webextension so umfassende Berechtigungen in Bezug auf die Sicherheitsrisiken, die es darstellen könnte, weise ist, ist eine separate, wichtige Überlegung, würde ich mir vorstellen.

(ich würde dies als ein Kommentar geschrieben habe, aber ich habe noch nicht genug Ruf der Lage sein, um Kommentare hinzuzufügen.)

+0

Hey, danke für die Antwort, und Gott sei Dank haben Sie das überprüft, weil anscheinend – SunlessVoid

+0

(kann nicht sogar meine eigenen Kommentare bearbeiten) ... Ich war "all_urls" und nicht "". Nebenbei bemerkt, gibt es eine Möglichkeit, eine Warnung aus dem Hintergrundskript ohne executeScript zu erstellen? Fühlt sich merkwürdig an und gibt meinem Add-On dieses Privileg. – SunlessVoid

+0

@SunlessVoid, Re: Warnung: nicht leicht. Sie können etwas erstellen, das alertähnlich ist, aber eine erhebliche Menge an Code benötigt. – Makyen

Verwandte Themen