« McCoy を使ったアドオンの安全な更新方法の提供 | [Places] ビューと nsIPlacesView インタフェース » |
[Places] 右クリックメニューへのメニュー項目追加
Firefox 2 でのブックマークの右クリックメニューは、ポップアップを表示するたびに JavaScript によって menuitem 要素を動的に生成する実装方式であったため、拡張機能によってメニュー項目を追加しづらいという問題があった。しかし、 Firefox 3 にて Places として実装が一新され、右クリックメニューの menuitem 要素や呼び出される command 要素は placesOverlay.xul という XUL ファイルで実装する形になり、拡張機能からのメニュー項目追加がしやすくなった。
Places の右クリックメニューは、以下の5つの場所で使用される。
ブックマークメニュー | chrome://browser/content/browser.xul |
ブックマークツールバー | |
ブックマークサイドバー | chrome://browser/content/bookmarks/bookmarksPanel.xul |
履歴サイドバー | chrome://browser/content/history/history-panel.xul |
履歴とブックマークの管理 | chrome://browser/content/places/places.xul |
各 XUL はいずれも placesOverlay.xul (chrome://browser/content/places/placesOverlay.xul) をオーバーレイしている。そこで、拡張機能から placesOverlay.xul に対してさらにオーバーレイして menuitem 要素などを追加することで、上記すべての場所の右クリックメニューへ一括してメニュー項目を追加することが可能となる。
サンプル
例として、ブックマークの右クリックメニューへ「Show Information」という新しいメニュー項目を追加する。
chrome.manifest
overlay chrome://browser/content/places/placesOverlay.xul chrome://myext/content/placesUIOverlay.xul
placesUIOverlay.xul
<popup id=”placesContext”>, <commandset id=”placesCommands”> をマージポイントとして menuitem 要素と command 要素を追加する。
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="placesUIOverlay.js" />
<commandset id="placesCommands">
<command id="placesCmd_showInfo" oncommand="showBookmarkInformation();" />
</commandset>
<popup id="placesContext">
<menuseparator insertafter="placesContext_openSeparator" />
<menuitem id="placesContext_showInfo"
command="placesCmd_showInfo"
label="Show Information"
insertafter="placesContext_openSeparator"
selectiontype="single"
selection="bookmark|folder"
forcehideselection="livemarkChild|livemark/feedURI|PlacesOrganizer/OrganizerQuery" />
</popup>
</overlay>
ブックマークの右クリックメニューは、右クリックした対象が通常のブックマークか、フォルダか、区切りか、などの条件によってメニュー項目数が増減する。メニュー項目を表示する条件は、 menuitem 要素へ追加された以下の4つの特殊な属性の値によって決定される。詳細は PlacesController クラスの buildContextMenu や _buildSelectionMetadata のコメントを参照。
属性 | 役割 |
---|---|
selectiontype | single, multiple のいずれかの値をセットすることで、選択している対象が単数か複数かの条件によってメニュー項目を表示する。 |
selection | any, bookmark, folder, separator といった値を指定することで、選択している対象がブックマークか、フォルダか、区切りかといった条件でメニュー項目を表示する。 | 区切りで複数指定可能。 |
forcehideselection | selection 属性の逆で、選択している対象の種類によってメニュー項目を非表示にする。 |
hideifnoinsetionpoint | よくわからん。 |
上記の例では、単一のブックマークあるいはフォルダを選択しているときにだけ「Show Information」メニュー項目を表示する。ただし、例外としてライブブックマークや特殊な「ブックマークツールバー」フォルダを選択しているときはメニュー項目を表示しない。
また、上記の例ではメニューの区切り(menuseparator 要素)も追加しているが、ありがたいことに Places の右クリックメニューは連続するメニューの区切りを自動的に1個にして表示してくれるので、新たに追加するメニューの区切りについては、どういった条件で表示するのかを意識する必要が無い。
placesUIOverlay.js
function showBookmarkInformation() { // TODO }
[…] « [Places] 右クリックメニューへのメニュー項目追加 […]