Firefox addon 在Firefox插件SDK中设置上下文项位置
我正在编写一个扩展,它涉及到在Firefox的上下文菜单中添加一个项目,但它附加到菜单的末尾,我无法找到任何使用Addon SDK(insertBefore/insertAfter)定制项目位置的指针,我知道如何使用XUL来实现这一点,但我正在尝试使用插件SDK或某种插件SDK/XUL组合来实现这一点 这是与上下文菜单相关的代码段 main.jsFirefox addon 在Firefox插件SDK中设置上下文项位置,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,我正在编写一个扩展,它涉及到在Firefox的上下文菜单中添加一个项目,但它附加到菜单的末尾,我无法找到任何使用Addon SDK(insertBefore/insertAfter)定制项目位置的指针,我知道如何使用XUL来实现这一点,但我正在尝试使用插件SDK或某种插件SDK/XUL组合来实现这一点 这是与上下文菜单相关的代码段 main.js var pageMod = require("sdk/page-mod"); var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
var data = require("sdk/self").data;
var tabs = require("sdk/tabs");
var cm = require("sdk/context-menu");
pageMod.PageMod({
include: "*.youtube.com",
contentScriptFile: data.url("page.js"),
onAttach: function (worker) {
worker.port.emit('link', data.url('convertbutton.png'));
}});
cm.Item({
label: "Convert File",
image: data.url("bighdconverterlogo128png.png"),
context: [
cm.URLContext(["*.youtube.com"]),
cm.PageContext()
],
contentScriptFile: data.url("menu.js"),
onMessage: function(vUrl){
tabs.open(vUrl);
}
});
data/menu.js
self.on("click", function(){
self.postMessage('http://hdconverter.co/' + 'c.php?url=' + window.location.href);
});
谢谢我不知道sdk,但对于非sdk插件来说很容易。但是因为你没有设置锅炉板,它看起来会很长。将此代码添加到底部的加载项:
var positionToInsertMenu = 0; //set the position you want it at here
var myLabelText = 'Convert File';
const {interfaces: Ci,utils: Cu} = Components;
Cu.import('resource://gre/modules/Services.jsm');
/*start - windowlistener*/
var windowListener = {
//DO NOT EDIT HERE
onOpenWindow: function (aXULWindow) {
// Wait for the window to finish loading
let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
aDOMWindow.addEventListener("load", function () {
aDOMWindow.removeEventListener("load", arguments.callee, false);
windowListener.loadIntoWindow(aDOMWindow, aXULWindow);
}, false);
},
onCloseWindow: function (aXULWindow) {},
onWindowTitleChange: function (aXULWindow, aNewTitle) {},
register: function () {
// Load into any existing windows
let XULWindows = Services.wm.getXULWindowEnumerator(null);
while (XULWindows.hasMoreElements()) {
let aXULWindow = XULWindows.getNext();
let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
windowListener.loadIntoWindow(aDOMWindow, aXULWindow);
}
// Listen to new windows
Services.wm.addListener(windowListener);
},
unregister: function () {
// Unload from any existing windows
let XULWindows = Services.wm.getXULWindowEnumerator(null);
while (XULWindows.hasMoreElements()) {
let aXULWindow = XULWindows.getNext();
let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
windowListener.unloadFromWindow(aDOMWindow, aXULWindow);
}
//Stop listening so future added windows dont get this attached
Services.wm.removeListener(windowListener);
},
//END - DO NOT EDIT HERE
loadIntoWindow: function (aDOMWindow, aXULWindow) {
if (!aDOMWindow) {
return;
}
var contentAreaContextMenu = aDOMWindow.document.getElementById('contentAreaContextMenu');
var myMenuItem;
if (contentAreaContextMenu) {
var menuItems = contentAreaContextMenu.querySelector('menuitem');
[].forEach.call(menuItems, function(item) {
if (item.getAttribute('label') == myLabelText) {
myMenuItem = item;
}
});
contentAreaContextMenu.removeChild(myMenuItem);
if (contentAreaContextMenu.childNodes.length >= positionToInsertMenu) { //position is greater then number of childNodes so append to end
contentAreaContextMenu.appendChild(myMenuItem);
} else {
contentAreaContextMenu.insertBefore(myMenuItem, contentAreaContextMenu.childNodes[thePosition]);
}
}
},
unloadFromWindow: function (aDOMWindow, aXULWindow) {
if (!aDOMWindow) {
return;
}
var myMenuItem = aDOMWindow.document.getElementById('myMenuItem');
if (myMenuItem) {
myMenuItem.parentNode.removeChild(myMenuItem);
}
}
};
windowListener.register();
卸载加载项时添加以下内容:
windowListener.unregister();
我从一个模板复制粘贴并快速修改它。为了精确定位,您可能需要考虑哪些菜单项是隐藏的,哪些不是您的意思是我必须重写非ADDK SDK扩展?u不必。你可以复制我给你的那个片段,然后粘贴到sdk代码的底部。请注意,这段代码只是重新定位了1个菜单项,如果你想让它做更多,或者像Separator这样的非菜单项,请告诉我,我会把它连接起来。