― MozillaZine.jp フォーラムは Mozilla 製品に関する情報交換の場です ―



All times are UTC + 9 hours

新しいトピックを投稿する トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年9月27日(日) 15:44 
初めまして、BitBiterと申します。

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

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

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

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


通報する
ページトップ
  
引用付きで返信する  
投稿記事Posted: 2009年9月27日(日) 18:04 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
 BitBiter さんがすでに見つけられているとおり、タブバー上のコンテキストメニューを見つけました。tabbrowser.xml の 85 行目の xul:menupopup 要素がそれです。

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

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

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

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


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年9月27日(日) 19:44 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
 もうすこしスマートにするなら以下の id を持つ要素のいずれかを DOM API で検索し、その親要素の子要素、つまり検索結果の兄弟要素として新規のメニューアイテムを挿入するという方法もあります。
  • context_newTab
  • context_reloadTab
  • context_reloadAllTabs
  • context_closeOtherTabs
  • context_openTabInWindow
  • context_bookmarkTab
  • context_bookmarkAllTabs
  • context_undoCloseTab
  • context_closeTab

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


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年9月27日(日) 23:52 
mitsuguさん アドバイスありがとうございます。

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

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

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


通報する
ページトップ
  
引用付きで返信する  
投稿記事Posted: 2009年9月28日(月) 01:34 
オフライン
Moderator

登録日時: 2007年5月03日(木) 01:11
記事: 92
お住まい: 東京
BitBiter さんが書きました:
少々、強引な気もしますが、
・document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");
・addEventListener('popupshowing', ...
とやって、所与の目的を達成できました。


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

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


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年9月28日(月) 06:40 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
BitBiterさん さんが書きました:
・document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");
・addEventListener('popupshowing', ...

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


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年9月28日(月) 23:08 
Piro さんが書きました:
タブのコンテキストメニューの項目の追加方法としては、現状ではそれが定番ですね。

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

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

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


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

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


通報する
ページトップ
  
引用付きで返信する  
期間内表示:  ソート  
新しいトピックを投稿する トピックへ返信する  [ 7 件の記事 ] 

All times are UTC + 9 hours


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[7人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by MozillaZine.jp® Forum Software © phpBB Group , Almsamim WYSIWYG
Japanese translation principally by ocean