强制上下文菜单显示表单输入

时间:2012-09-06 14:36:01

标签: firefox firefox-addon firefox-addon-sdk

我正在尝试开发一个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;
    };
  }
});

不幸的是,这仍然没有显示禁用输入的上下文菜单,但这对我来说不是一个显示阻止。

非常感谢

1 个答案:

答案 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