MozillaZine.jp フォーラム
https://forums.mozillazine.jp/

タブのコンテクストメニューへオーバーレイしたい
https://forums.mozillazine.jp/viewtopic.php?f=26&t=9175
ページ 11

作成者:  BitBiter [ 2009年9月27日(日) 15:44 ]
記事の件名:  タブのコンテクストメニューへオーバーレイしたい

初めまして、BitBiterと申します。

現在、Firefox3.5用のextensionの作成にチャレンジしています。
いくつかのチュートリアルを参照して、Hello Worldレベルは出せるようになりました。

が、Firefox本体へのオーバーレイ表示で、タイトルの通り、
タブのコンテクストメニューへ、項目を挿入しようとした段階で、つまづいてしまいました。
各チュートリアルは、たいがいトップレベルのメニューか contentAreaContextMenu への
追加をしていますが、タブのコンテクストメニューを見つけられませんでした。

browser.jar をばらして、「tabContextMenu」という項目を見つけたので、
<menupopup id="tabContextMenu">...
とやってみましたが、上手く反映されず。
エラーコンソールにもなにも出力されず。。。

どうすれば、項目を追加できるのでしょうか。
また、よろしければ、こういった場合の汎用的な解決法を教えていただけませんでしょうか。
よろしくお願いし致します。

作成者:  mitsugu [ 2009年9月27日(日) 18:04 ]
記事の件名:  Re: タブのコンテクストメニューへオーバーレイしたい

 BitBiter さんがすでに見つけられているとおり、タブバー上のコンテキストメニューを見つけました。tabbrowser.xml の 85 行目の xul:menupopup 要素がそれです。

 id 属性ではなく anonid 属性が振られています。値はこれも BitBiter さんがすでに見つけられているとおり "tabContextMenu" です。

 タブバー上のコンテキストメニューが開くタイミングで発生する popupshowing イベントのイベントハンドラは、この anonid="tabContextMenu" の menupopup 要素から呼び出されている updatePopupMenu になります。updatePopupMenu 内で menuitem を動的に非表示にしているようです。

 私が思い付くのは DOM を利用して xul:menupopup 要素のうち、anonid 属性が tabContextMenu のものを検索し、xul:menuitem 要素を子要素として挿入するくらいでしょうか。

> また、よろしければ、こういった場合の汎用的な解決法を教えていただけませんでしょうか。
 おそらく地道にハックするしかないのでは。
 効率のよい方法があれば私も識者よりご教示頂きたいです。

作成者:  mitsugu [ 2009年9月27日(日) 19:44 ]
記事の件名:  Re: タブのコンテクストメニューへオーバーレイしたい

 もうすこしスマートにするなら以下の id を持つ要素のいずれかを DOM API で検索し、その親要素の子要素、つまり検索結果の兄弟要素として新規のメニューアイテムを挿入するという方法もあります。
  • context_newTab
  • context_reloadTab
  • context_reloadAllTabs
  • context_closeOtherTabs
  • context_openTabInWindow
  • context_bookmarkTab
  • context_bookmarkAllTabs
  • context_undoCloseTab
  • context_closeTab

 どちらにせよ、オーバーライドは無理すじのような気がします。

作成者:  BitBiter [ 2009年9月27日(日) 23:52 ]
記事の件名:  Re: タブのコンテクストメニューへオーバーレイしたい

mitsuguさん アドバイスありがとうございます。

単純なオーバーレイ表示ができないとお聞きして、developer center を彷徨ってみました。

少々、強引な気もしますが、
・document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");
・addEventListener('popupshowing', ...
とやって、所与の目的を達成できました。

それにしても、あとちょっとの所が難しいですね。
本当に、ありがとうございました。

作成者:  Piro [ 2009年9月28日(月) 01:34 ]
記事の件名:  Re: タブのコンテクストメニューへオーバーレイしたい

BitBiter さんが書きました:
少々、強引な気もしますが、
・document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");
・addEventListener('popupshowing', ...
とやって、所与の目的を達成できました。


タブのコンテキストメニューの項目の追加方法としては、現状ではそれが定番ですね。

拙作アドオン「マルチプルタブハンドラ」に依存してもよければ、簡単に項目を挿入できるAPIを提供しています。参考までにどうぞ。
http://piro.sakura.ne.jp/xul/_multipletab.html

作成者:  mitsugu [ 2009年9月28日(月) 06:40 ]
記事の件名:  Re: タブのコンテクストメニューへオーバーレイしたい

BitBiterさん さんが書きました:
・document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");
・addEventListener('popupshowing', ...

 そうですね。イベント・ハンドラを追加する方が楽でした。ミスリードするようなことを書いてしまって申し訳ありませんでした。

作成者:  BitBiter [ 2009年9月28日(月) 23:08 ]
記事の件名:  Re: タブのコンテクストメニューへオーバーレイしたい

Piro さんが書きました:
タブのコンテキストメニューの項目の追加方法としては、現状ではそれが定番ですね。

拙作アドオン「マルチプルタブハンドラ」に依存してもよければ、簡単に項目を挿入できるAPIを提供しています。参考までにどうぞ。
http://piro.sakura.ne.jp/xul/_multipletab.html

試行錯誤の末であっても、定番にたどり着けたなら、うれしい限りです。
再発明も積もれば力になると信じております。

「マルチプルタブハンドラ」
これははすごい高機能ですねぇ。
まだまだ初心者なため、自作がさらに外部のアドオンから呼び出される、なんて事態を想定してませんでした。
少しずつひもといて、勉強させていただきます。


mitsugu さんが書きました:
 そうですね。イベント・ハンドラを追加する方が楽でした。ミスリードするようなことを書いてしまって申し訳ありませんでした。

いえいえ。メニューアイテムの挿入方法を探しているうちに、前述の方法にたどり着けましたので、非常に助かりました。
ありがとうございました

ページ 11 All times are UTC + 9 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/