我正在尝试开发一个ff插件,允许用户右键单击表单元素并执行与之相关的任务。
不幸的是,有人认为上下文菜单不应出现在ff中的表单输入中,尽管经过长时间的讨论https://bugzilla.mozilla.org/show_bug.cgi?id=433168,它们仍然不会出现在复选框,无线电或选择中。
我确实找到了这个:https://developer.mozilla.org/en-US/docs/Offering_a_context_menu_for_form_controls但是我无法想到如何翻译代码以使用新的附加SDK。 我尝试将显示的javascript转储到内容脚本中,也通过观察者服务转储,但无济于事。
我也找不到推荐的扩展名https://addons.mozilla.org/en-US/firefox/addon/form-control-context-menu/的来源,因为它是“专门为了证明如何做到这一点而创建的”非常令人沮丧。
这似乎是非常基本的插件功能,任何帮助或指向更简单文档的链接都将非常感激。
**更新**
我在main中需要一个文件中添加以下代码,这似乎可以解决问题。
var {WindowTracker} = require("window-utils");
var tracker = WindowTracker({
onTrack: function(window){
if (window.location.href == "chrome://browser/content/browser.xul") {
// This is a browser window, replace
// window.nsContextMenu.prototype.setTarget function
window.setTargetOriginal = window.nsContextMenu.prototype.setTarget;
window.nsContextMenu.prototype.setTarget = function(aNode, aRangeParent, aRangeOffset) {
window.setTargetOriginal.apply(this, arguments);
this.shouldDisplay = true;
};
};
}
, onUntrack: function(window) {
if (window.location.href == "chrome://browser/content/browser.xul") {
// In case we were called because the extension is uninstalled - restore
// original window.nsContextMenu.prototype.setTarget function
window.nsContextMenu.prototype.setTarget = window.setTargetOriginal;
};
}
});
不幸的是,这仍然没有显示禁用输入的上下文菜单,但这对我来说不是一个显示阻止。
非常感谢
答案 0 :(得分:2)
可以看到此扩展程序中的重要代码here。它非常简单 - 它取代了每个浏览器窗口中的nsContextMenu.prototype.setTarget
函数,并确保它为表单控件设置shouldDisplay
标志。
将此转换为附加SDK的唯一问题是高级模块不允许您直接访问浏览器窗口。您必须使用已弃用的window-utils
模块。这样的事情应该有效:
var {WindowTracker} = require("sdk/deprecated/window-utils");
var tracker = WindowTracker({
onTrack: function(window)
{
if (window.location.href == "chrome://browser/content/browser.xul")
{
// This is a browser window, replace
// window.nsContextMenu.prototype.setTarget function
}
},
onUntrack: function(window)
{
if (window.location.href == "chrome://browser/content/browser.xul")
{
// In case we were called because the extension is uninstalled - restore
// original window.nsContextMenu.prototype.setTarget function
}
}
});
请注意,WindowTracker
应为replaced in some future SDK version。另外,供参考:nsContextMenu
implementation