2

ブラウザのタブコンテキストメニューにメニュー項目を追加してWebサービスにタブのURLを送信するFirefox拡張機能を作成しています。私はcommandイベントリスナーは、メニュー項目が選択され、それが正常に動作するときに発生する私のメニュー項目のために持っています。Firefoxのアドオンで右クリックしたタブのURLを取得する方法

問題は、受信したイベントに基づいてどのタブが右クリックされたかを把握していることです。タブコンテキストメニューはXUL-landのタブの子ではないため、メニュー項目自体(commandイベントのターゲット)からタブへの簡単なパスはありません。もちろん、現在のタブを手に入れることはできません。なぜなら、ユーザーが非アクティブなタブを右クリックしている可能性があるからです。

私が現在使用している解決策は、グローバル変数にタブのURLを格納する各タブにcontextmenuイベントハンドラを配置し、このグローバル変数をcommandイベントハンドラで使用することです。これはうまく動作し、複数のコンテキストメニューを同時に表示することは物理的に不可能であるため、グローバル変数とはやや平和です。

もっと良い方法がありますか? commandイベントハンドラをURLを保持するクロージャで更新することを考えましたが、新しいイベントハンドラを追加する前に古いイベントハンドラを削除する必要があるという欠点があります。

私の現在のコードが何かのように見えるこの:

​​

これは次のようになります。コンテキストメニューが表示されたら

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 
} 

答えて

2

、あなたは要素が実行して表示するポップアップを引き起こしたかを把握することができます便利だが本当に必要なのはownerDocument.defaultView

でも、ブラウザウィンドウを保持するe.viewというプロパティもあると思います。例えばので

:右クリックで、それは明らかにウィンドウがフォーカスされている意味するので

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); 

もう一つの方法は、あります。

const { getMostRecentBrowserWindow } = require('sdk/window/utils'); 

cToolbarContextMenu.addEventListener('popupshowing', function() { 
    var currentWindow = getMostRecentBrowserWindow(); 
    if (currentWindow.gBrowser) { 
     var tabURL = currentWindow.gBrowser.selectedBrowser.currentURI.spec; 
    } 
}, false); 
+1

'selectedBrowser'は残念ながら、表示されているタブを必ずしも参照していないので、必ずしも右クリックされたものではありません。 *アクティブなタブのURLを調べるのに問題はありませんでしたが、それを行うにはいくつかの方法があります。私は実際にメニューコマンドで目標とされているものを知る必要があります。 – kindall

+1

'require(" sdk/tabs/utils ")。getTabURL(e.target.ownerDocument.popupNode)'は魔法の呪文です。 – kindall

+0

オハイオ州私は今、あなたが右のタブの要素をクリックして参照してください!素晴らしいですので、 'popupNode'はそのトリックを行います!共有して受け入れてくれてありがとう! – Noitidart

関連する問題