2

Ich schreibe eine Firefox-Erweiterung, die dem Tab-Kontextmenü des Browsers einen Menüeintrag hinzufügt, um die URL des Tabs an einen Web-Service zu senden. Ich habe einen command Event-Listener für meinen Menüpunkt, der ausgelöst wird, wenn der Menüpunkt ausgewählt wird und das funktioniert.So erhalten Sie die URL des Rechtsklick-Tabs in einem Firefox-Add-on

Das Problem, das ich habe, ist herauszufinden, welche Registerkarte rechts geklickt wurde basierend auf dem Ereignis, das ich erhalte. Es scheint keinen einfachen Weg von dem Menüelement selbst (welches das Ziel des Ereignisses command ist) zu der Registerkarte zu geben, da das Registerkartenkontextmenü kein Kind der Registerkarte in XUL-Land ist. Ich kann natürlich nicht nur die aktuelle Registerkarte abrufen, da der Benutzer möglicherweise mit der rechten Maustaste auf eine inaktive Registerkarte geklickt hat.

Die Lösung, die ich derzeit verwende, ist eine contextmenu Event-Handler auf jeder Registerkarte, die die URL der Registerkarte in einer globalen Variablen speichert, und verwenden Sie diese globale Variable in meinem command Event-Handler. Das funktioniert gut und ich bin mit der globalen Variable etwas in Ruhe, da es physikalisch unmöglich ist, gleichzeitig mehr als ein Kontextmenü aufzurufen.

Aber gibt es einen besseren Weg? Ich dachte daran, meinen command Event-Handler mit einer Schließung zu aktualisieren, die die URL enthält, aber das hat den Nachteil, dass ich den alten Event-Handler entfernen muss, bevor ich den neuen hinzufüge, was die Dinge noch weiter verkompliziert.

Mein aktueller Code sieht aus wie etwas das:

var tabs = require("sdk/tabs"); 
var xultabs = require("sdk/tabs/utils"); 
var viewFor = require("sdk/view/core").viewFor; 

var itemid = "my-extension-name"; 
var xulns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; 

// global variable to hold tab URL and function to set it on right-click of tab 
taburl = ""; 
function getTabURL(e) { taburl = xultabs.getTabURL(e.target); } 

tabs.on('ready', function(tab) { 
    // set up event listener to get tab URL when tab is right-clicked 
    let vtab = viewFor(tab); 
    vtab.addEventListener("contextmenu", getTabURL); 

    // add our context menu item if it's not already there 
    let doc = viewFor(tab.window).document; 
    if (!doc.getElementById(itemid)) { 
    let menu = doc.getElementById("tabContextMenu"); 
    let item = doc.createElementNS(xulns, "menuseparator"); 
    menu.appendChild(item); 
    item = doc.createElementNS(xulns, "menuitem"); 
    item.setAttribute("label", "My Menu Item"); 
    item.setAttribute("id", itemid); 
    item.addEventListener("command", function() { pushURL(taburl) }); 
    menu.appendChild(item); 
    } 
}); 

function pushURL(url) { 
    // pushes the URL to the service 
} 

Antwort

2

Wenn ein Kontextmenü angezeigt wird, können Sie herausfinden, was Element das Popup ausgelöst durch zeigen dabei:

e.target.ownerDocument.popupNode 

Dies könnte nützlich, aber wirklich alles, was Sie brauchen, ist die ownerDocument.defaultView

Ich denke, es gibt sogar eine e.view Eigenschaft, die das Browserfenster enthält.

So zum Beispiel:

function contextMenuShowing(e) { 
    console.log('context menu showing', 'popupNode:', e.target.ownerDocument.popupNode); 
    var currentWindow = e.target.ownerDocument.defaultView; // can try var currentWindow = e.view; 
    if (currentWindow.gBrowser) { 
      var tabURL = gBrowser.selectedBrowser.currentURI; 
    } 
} 

cToolbarContextMenu.addEventListener('popupshowing', contextMenuShowing, false); 

Eine andere Methode ist, weil auf der rechten Maustaste, dass offensichtlich bedeutet, dass das Fenster fokussiert ist. So können Sie das tun:

+1

'selectedBrowser' hilft leider nicht, da es sich immer auf die sichtbare Registerkarte bezieht, die nicht unbedingt die ist, die mit der rechten Maustaste geklickt wurde. Ich hatte keine Probleme, die URL der Registerkarte * active * herauszufinden, es gibt mehrere Möglichkeiten, dies zu tun. Ich muss wissen, dass der Menübefehl das Ziel ist. – kindall

+1

Es stellt sich heraus, dass 'require ("sdk/tabs/utils"). GetTabURL (e.target.ownerDocument.popupNode)' ist die magische Beschwörung. – kindall

+0

Ohhh ich sehe jetzt, Sie klicken mit der rechten Maustaste auf den Tab-Element! Super, damit der 'popupNode' den Trick macht! Danke für das Teilen und das Akzeptieren! – Noitidart