4

Ich versuche, ein Kontextmenü zu meinem Firefox Add-on mit der WebExtensions API hinzuzufügen. Ich brauche das Hintergrundskript, um einen Klick auf den Menüpunkt zu hören und eine Nachricht an das Inhaltsskript zu senden. Diese ist das, was ich habe:Kontextmenüs funktionieren nicht Firefox Add-on WebExtensions

manifest.json

{ 
    "manifest_version": 2, 
    "name": "MyExt", 
    "version": "0.0.1", 

    "description": "Test extension", 
    "icons": { 
    "48": "icons/icon-48.png" 
    }, 

    "applications": { 
    "gecko": { 
     "id": "[email protected]", 
     "strict_min_version": "45.0" 
    } 
    }, 

    "permissions": ["contextMenus"], 

    "background": { 
    "scripts": ["background-scripts.js"] 
    }, 

    "content_scripts": [ 
    { 
     "matches": ["<all_urls>"], 
     "js": ["content-script.js"] 
    } 
    ] 
} 

Hintergrund-scripts.js

chrome.contextMenus.create({ 
    id: "clickme", 
    title: "Click me!", 
    contexts: ["all"] 
}); 

browser.contextMenus.onClicked.addListener(function(info, tab) { 
    console.log("Hello World!"); 
    sendMessage(info, tab); 
}); 

function sendMessage(info, tab) { 
    chrome.tabs.query(
     {active: true, currentWindow: true }, 
     function(tabs) { 
      chrome.tabs.sendMessage(tabs[0].id, "Test message from background script."); 
     } 
    ); 
} 

inhalts script.js

browser.runtime.onMessage.addListener(function(msg) { 
    console.log(msg); 
}); 

Der Menüeintrag wird erstellt, aber die Nachrichten werden nie angezeigt (ich überprüfe sowohl das Web als auch die Browserkonsole). Da das Klickereignis nicht funktioniert, wird die Nachricht auch nicht gesendet.

Ich folge this example von MDN, die nicht funktioniert. Es erstellt auch die Menüpunkte, aber sie tun nichts, was mich denken lässt, dass sich etwas in der API geändert hat und MDN sich nicht darum gekümmert hat, die Dokumentation zu aktualisieren.

Irgendwelche Ideen? Vielen Dank.

Antwort

1

Ihr Code funktioniert wie folgt geschrieben:

Browser console with output

ich stark vermuten, dass Ihr Problem entweder ist:

  • Sie testen eine Version von Firefox vor Firefox 48 Firefox 48 ist in Beta. Die contextMenus "Browser compatibility" section besagt eindeutig, dass die erste Version, in der es funktioniert, Firefox 48 ist. Die WebExtensions API befindet sich noch in der Entwicklung. Im Allgemeinen sollten Sie gegen Firefox Developer Edition oder Firefox Nightly testen. Sie können frühere Versionen verwenden, wenn alle die von Ihnen verwendeten APIs in einer früheren Version funktionieren. Wenn Sie jedoch Probleme haben, sollten Sie mit Nightly testen. Ich vermute, dass dies das wahrscheinlichste Problem ist, da Sie angegeben haben, dass contextMenus example code nichts unternimmt.
  • Sie haben nicht zu einer tatsächlichen Webseite navigiert. Ihr content-script.js wird nur in Seiten geladen, die mit einem der unterstützten Schemata übereinstimmen: also "http", "https", "file", "ftp", "app". Es ist nicht in about:* Seiten geladen. Wenn dies Ihr Problem wäre, hätten Sie eine Teilfunktionalität aus dem Beispielcode contextMenus. Darüber hinaus Code verwenden, müssten die Browser-Konsole nach einer Verzögerung, erzeugt eine Fehlermeldung:

    Error: Could not establish connection. Receiving end does not exist. 
    

    Browser Console with error

Ein Hinweis auf den Code:
Hinweis, Ihre sendMessage() Funktion ist möglicherweise übermäßig komplex. Sie suchen nach der aktiven Registerkarte, wenn das Objekt tabs.Tab für die Registerkarte, in der der Kontextmenüeintrag ausgewählt wurde, bereits an Ihre Funktion als eines der Argumente übergeben wurde.Eine kürzere Version könnte sein:

function sendMessage(info, tab) { 
    chrome.tabs.sendMessage(tab.id, "Test message from background script."); 
} 

Ich würde gerne wissen, ob Sie eine Situation erlebt hat, wo Sie für die aktiven Registerkarte zu suchen benötigt, anstatt verwenden, um das tabs.Tab Objekt über das Kontextmenü Hörer zur Verfügung gestellt.

+0

Vielen Dank. Das Problem war die Firefox-Version. Es war ein dummer Fehler anzunehmen, dass ich die neueste Version habe. In Bezug auf die Developer Edition ist mein tatsächliches Add-on viel komplexer als das und DE hat etwas getan (ich habe keine Erfahrung mit der Webentwicklung, daher weiß ich nicht, was dieses "Etwas" war), das das Add-On verhindert hat funktioniert richtig. Ich habe es jetzt getestet und es funktioniert gut. – guimarac

Verwandte Themen