Descobri que essa mesma pergunta tinha sido perguntada anteriormente na MozillaZine aqui . Essa solução coloca o menu de contexto no canto superior esquerdo da tela. Eu tentei usar a solução dada a essa outra pergunta sobre como obter posições de tela do DOM para produzir o código abaixo que coloca o menu de contexto mais próximo para o elemento ativo, mas ainda é buggy (às vezes o menu é um pouco fora do elemento):
var target = (document.commandDispatcher.focusedElement || document.commandDispatcher.focusedWindow.document.documentElement);
var screenX=0;
var screenY=0;
if ("boxObject" in target) {
screenX=target.boxObject.x;
screenY=target.boxObject.y;
} else {
var box;
try {
box = elem.getBoundingClientRect();
} catch(e) {}
// Make sure we're not dealing with a disconnected DOM node
if (box) {
var body = document.body,
clientTop = document.documentElement.clientTop || body.clientTop || 0,
clientLeft = document.documentElement.clientLeft || body.clientLeft || 0,
scrollTop = window.pageYOffset || body.scrollTop,
scrollLeft = window.pageXOffset || body.scrollLeft,
top = box.top + scrollTop - clientTop,
left = box.left + scrollLeft - clientLeft;
}
screenX=target.offsetLeft;
screenY=target.offsetTop;
}
var e = document.createEvent("MouseEvents");
e.initMouseEvent("contextmenu", true, false, null, 0, screenX, screenY, 0, 0, false, false, false, false, 0, null);
target.dispatchEvent(e);