An English version of this page is also available.
宣伝1。Firefox Hacks Rebooted発売中。本書の1/3を使って、再起動不要なアドオンの作り方のテクニックや非同期処理の効率のいい書き方などを解説しています。既刊のFirefox 3 Hacksや拡張機能開発チュートリアルと併せてどうぞ。
宣伝2。日経Linux 2011年9月号から、Linuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。そちらもよろしく。
複数のタブをまとめて閉じたり再読み込みしたりできるようにする拡張機能です。タブの上でドラッグするとタブが選択され、ポップアップメニューからその後の操作を選択できます。また、Ctrl-クリックなどで個別に選択した後、右クリックメニューから操作を行うことも可能です。(感覚としては、Excelのセルの選択の操作あたりの感覚をイメージしてください)
おまけとして、「タブを複製」「すべてのタブを閉じる」「右のタブを閉じる」「左のタブを閉じる」「URLをコピー」「似たタブを閉じる」機能もあります。
この拡張機能は、タブブラウザ拡張の機能をFirefox 2向けに再実装する試みの一環として開発しています。
不具合に遭遇した場合は、まずよくある質問をご覧下さい。それでも解決方法が見つからない場合の障害報告はGitHubのイシュートラッカーにお願いします。
以下の言語パックを内蔵しています。
タブの選択と操作。左ドラッグでおもむろに選択してコマンド実行、という感じです。なお、今までのようにタブをドラッグ&ドロップで並べ替えたい場合は、タブのアイコン部分をドラッグしてください。
タブをドラッグするだけで選択されてしまうのが嫌だという場合は、設定で挙動を変更してください。ドラッグ時の挙動は「タブの移動(Firefox標準)」「選択(マルチプルタブハンドラ標準)」「タブの切り替え(iRider互換)」の3択で選べます。
タブの選択操作は、感覚的にはExcelのセルの選択に近いです。Ctrl-クリックもShift-クリックも使えます。
クローズボックスの選択。タブのクローズボックスの上でドラッグ開始すると、クローズボックスだけを選択するモードになります。この場合、ボタンを放したらすぐに選択されたタブを閉じることができます。(iRider互換)
今のタブより右のタブ・左のタブをまとめて閉じる機能もあります。タブのコンテキストメニューから実行してください。
バージョン0.4以降で、クリップボードにタブのURIをコピーする時の形式を自由に追加できるようになりました。以下は登録例です。
<li><a href="%URL_HTMLIFIED%">%TITLE_HTMLIFIED%</a></li>[%TITLE_HTMLIFIED%](%URL_HTMLIFIED% "%TITLE_HTMLIFIED%") * [%TITLE_HTMLIFIED%](%URL_HTMLIFIED% "%TITLE_HTMLIFIED%")((<%TITLE_HTMLIFIED%|URL:%URL_HTMLIFIED%>)) * ((<%TITLE_HTMLIFIED%|URL:%URL_HTMLIFIED%>))[url=%URL%]%TITLE%[/url][list][url=%URL%]%TITLE%[/url][/list]※すべての処理はtabbrowser要素一つを単位として行われる。複数のtabbrowser要素に対して処理を行いたい場合、それぞれのtabbrowser要素に対して個別に処理を行う必要がある。
MultipleTabService.closeTabs(in Array aTabs)MultipleTabService.reloadTabs(in Array aTabs)MultipleTabService.addBookmarkFor(in Array aTabs)MultipleTabService.duplicateTabs(in Array aTabs)MultipleTabService.splitWindowFromTabs(in Array aTabs)MultipleTabService.hasSelection([in Node aTabBrowser])MultipleTabService.isSelected(in Node aTab)MultipleTabService.setSelection(in Node aTab, in boolean aNewSelectionState)MultipleTabService.toggleSelection(in Node aTab)MultipleTabService.clearSelection([in Node aTabBrowser])MultipleTabService.getSelectedTabs([in Node aTabBrowser])MultipleTabService.getLeftTabsOf(in Node aTab)MultipleTabService.getRightTabsOf(in Node aTab)マルチプルタブハンドラは、選択された複数のタブをまとめてドラッグ&ドロップする機能を持っています。ドロップ操作の受け入れ側でマルチプルタブハンドラのAPIを使うことによって、複数のタブをドロップされたときの挙動を定義することができます。
バージョン0.6以降では、HTML5のドラッグ&ドロップイベントのdata transfer経由でドラッグ中の選択されたタブを取得できます。この場合、0番目のデータはタブの並び順で左端のタブではなく、ドラッグ操作を開始したタブとなります。
onDrop : function(aEvent) {
var tabs = [];
var dt = aEvent.dataTransfer;
for (let i = 0, maxi = dt.mozItemCount; i < maxi; i++) {
tabs.push(dt.mozGetDataAt(TAB_DROP_TYPE, i));
}
tabs.sort(function(aA, aB) { return aA._tPos - aB._tPos; });
...
},
ユーティリティメソッドとして、MultipleTabService.getSelectedTabs()にドロップ時のイベントオブジェクトを渡しても同じ結果を得られます。
onDrop : function(aEvent) {
var tabs = MultipleTabService.getSelectedTabs(aEvent);
},
また、バージョン0.5以前と互換の以下のAPIも利用できます。
HTML5のドラッグ&ドロップイベントを使わない場合、ドラッグされたタブをMultipleTabService.getBundledTabsOf()メソッドに渡すと、もしそのタブと一緒に他のタブも選択されていたら、選択されたタブ全体の配列を返します。タブが選択されていなかった場合や、タブ以外の物を渡した場合は、空の配列が返ります。以下は、複数のタブを選択してドラッグ&ドロップしたときに、ドロップされたすべてのタブのURIを表示する処理の例です。
onDrop : function(aEvent, aData, aSession) {
var tab = aSession.sourceNode;
if ('MultipleTabService' in window) {
var tabs = MultipleTabService.getBundledTabsOf(tab);
if (tabs.length) {
// 複数のタブがドロップされたときは、
// ドロップされたタブすべてのURIを表示
alert(
tabs.map(function(aTab) {
return aTab.linkedBrowser.currentURI.spec;
}).join('\n')
);
return;
}
}
// 通常の処理
alert(tab.linkedBrowser.currentURI.spec);
},
MultipleTabService.getBundledTabsOf()メソッドの2つめの引数としてオブジェクトを渡すと、ドロップされたタブが含まれているtabbrowser要素と、そのtabbrowser要素が含まれているウィンドウ(DOMWindow)を取得できます。以下は、他のウィンドウからタブをドラッグ&ドロップされた時だけ元のウィンドウのタブを閉じる処理の例です。
onDrop : function(aEvent, aData, aSession) {
var tab = aSession.sourceNode;
if ('MultipleTabService' in window) {
var info = {};
var tabs = MultipleTabService.getBundledTabsOf(tab, info);
if (tabs.length) {
var uris = tabs.map(function(aTab) {
return aTab.linkedBrowser.currentURI.spec;
}).join('\n');
if (info.sourceWindow != window)
tabs.forEach(function(aTab) {
info.sourceBrowser.removeTab(aTab);
});
}
...
return;
}
}
...
},
複数のタブを選択した状態でそのうちの1つをドラッグ&ドロップすると、通常はマルチプルタブハンドラ自身がドラッグ操作の開始を検知して、複数のタブの移動のための処理を行います。他のアドオンからマルチプルタブハンドラのこの挙動をキャンセルしたい場合(そのアドオンが複数のタブのドラッグ&ドロップを扱うための仕組みを持っている場合など)は、マルチプルタブハンドラが発行するMultipleTabHandler:TabsDragStartイベントをキャンセルしてください。
var listener = function function(aEvent) {
switch (aEvent.type) {
case "MultipleTabHandler:TabsDragStart":
return aEvent.preventDefault();
case "dragstart":
// 複数のタブのドラッグ&ドロップを開始するための任意の処理
return;
}
};
gBrowser.mTabContainer.addEventListener(
"MultipleTabHandler:TabsDragStart", listener, false);
/* Firefox自身によるタブのドラッグ開始処理よりも先に
処理を行わないといけないので、キャプチャリングフェーズで
イベントを監視する。 */
gBrowser.mTabContainer.addEventListener(
"dragstart", listener, true);
ユーザースタイルシートや拡張機能などによって、タブバーが画面の横に縦型で表示されている場合のために、label-horizontal属性とlabel-vertical属性を使って、メニュー項目に特別なラベルを指定することができます。
label-horizontal属性の値は、タブが通常の水平表示になっている場合のラベルとして使われます。label-vertical属性の値は、タブが何らかのカスタマイズによって垂直表示(縦型)になっている場合のラベルとして使われます。
<menuitem id="context-item-feature4"
label-horizontal="Feature 4, 左のタブを処理する"
label-vertical="Feature 4, 上のタブを処理する"/>
ユーザ設定として extensions.multipletab.show.メニュー項目の要素のid という名前をキーにした真偽値の設定を作成し、値をfalseにすることで、メニュー項目を一時的に非表示にすることができます。
他の拡張機能などによって組み込まれたメニュー項目の表示・非表示を設定するためのUIは、この拡張機能には含まれていません。GUIで表示状態を変更できるようにするには、独自の設定ダイアログを設けるか、 chrome://multipletab/content/config.xul にオーバーレイで項目を組み込んでください。
また、メニュー項目にmultipletab-available属性およびmultipletab-enabled属性を設定しておくことで、メニューが開かれる時に動的に判断を行って、メニュー項目を隠したり無効にしたりすることもできます。これらの属性の値として記述された内容はJavaScriptの式として評価され、multipletab-availableの評価結果が真であれば項目が表示され、偽であれば非表示となります。また、multipletab-enabledの評価結果が真であれば項目は有効、偽であれば無効となります。
<menuitem id="context-item-myservice-feature"
label="タブが3つ以上選択されている時のための機能"
multipletab-available="MyService.available()"
multipletab-enabled="selectedTabs.length > 3"/>
この例であれば、MyService.available()の返り値が真の時だけ項目が表示され、且つ、選択されているタブの数が3つ以上の時だけ項目を選択できるようになります。なお、これらの属性値に記述する式では以下の変数を利用できます。
tabbrowsergBrowserに等しい。tabsArray.slice(gBrowser.mTabContainer.childNodes)に等しい。selectedTabsMultipleTabService.getSelectedTabs(gBrowser)に等しい。項目の表示・非表示の最終的な判定は、extensions.multipletab.show.メニュー項目の要素のid の設定値(未定義の場合はtrue)とmultipletab-available属性値の評価結果(未定義の場合は真)の両方を元にして行います。設定値と属性値の評価結果の両方共が真の場合のみ、項目が表示されます。言い換えると、どちらか一方でも偽であれば項目は非表示となります。
-1 ="browser.tabs.warnOnClose"を使用, 0 =警告しない, 1 =警告する)%AUTHOR% , %AUTHOR_HTMLIFIED% , %DESCRIPTION% , %DESCRIPTION_HTMLIFIED% , %KEYWORDS% , %KEYWORDS_HTMLIFIED% getData() で情報を取得できるようにしたaEvent.getData(プロパティ名) でプロパティの内容を参照するようにしてください。)MultipleTabHandlerTabsClosing イベント、閉じた直後に MultipleTabHandlerTabsClosed イベントを発行するようにしたmultipletab-insertbefore に加えて multipletab-insertafter も利用できるようにしたmultipletab-insertbefore と multipletab-insertafter でXPath式を利用できるようにした