contentAreaContextMenu、popupshowing

拡張機能とかuserChrome.jsのスクリプトを書くときに

var contextMenu = document.getElementById("contentAreaContextMenu");
contextMenu.addEventListener("popupshowing", function(event) {
  gContextMenu.showItem("my-hoge-menuitem", gContextMenu.onImage);
}, false);

とかやってメニューの表示状態を制御するのはすごくよくやると思うんだけど、本当ならちゃんとこうしてやらないとだめですね。

var contextMenu = document.getElementById("contentAreaContextMenu");
contextMenu.addEventListener("popupshowing", function(event) {
  if (event.target != this) return;
  gContextMenu.showItem("my-hoge-menuitem", gContextMenu.onImage);
}, false);

もしくはこんなん

var contextMenu = document.getElementById("contentAreaContextMenu");
var obj = {
  handleEvent: function(event) {
    //if (event.target.id != "contentAreaContextMenu") return;
    if (event.target != event.currentTarget) return;
    gContextMenu.showItem("my-hoge-menuitem", gContextMenu.onImage);
  }
};
contextMenu.addEventListener("popupshowing", obj, false);

こうしてやらないとサブメニューが開いた時にもイベントハンドラが実行されてしまう。軽い処理だったら別にいいのかもしれないけど。今まで全然やってなかった。

handleEventを使った例のほうを要素のidに依存しないように書き直しました。


さらに追記
イベントオブジェクトのeventPhaseプロパティを使ってチェックしているコードがあった。

var contextMenu = document.getElementById("contentAreaContextMenu");
contextMenu.addEventListener("popupshowing", function(event) {
  if (event.eventPhase != Event.AT_TARGET) return;
  gContextMenu.showItem("my-hoge-menuitem", gContextMenu.onImage);
}, false);

いろんなやり方があるなあ