Firefox 3.0で、タブを閉じたとき左のタブをアクティブにする。(その2)
Firefox 3.0で、タブを閉じたとき左のタブをアクティブにする。では、現在開いているタブを閉じると、左隣のタブが前面に出るようにした。しかしこの方法だと、ひとたび一番左のタブにたどり着いた後は、ずっと一番左のタブが前面になり続ける。そこで一番左のタブを閉じたときに、一番右のタブを前面に出すスクリプトを書いてみた。
タブを閉じたときの動作は、前回書いた通り「gBrowser.removeTab()」が行っている。今回はFirefoxの拡張Javascript Commandを使って以下のコードを実行し、結果をエラーコンソールからコピーした。
gBrowser.remvoeTab.toString();
出力は以下の通り。(前回挿入した行は削除してある。)
Javascript Command returned value: function removeTab(aTab) { this._browsers = null; if (aTab.localName != "tab") { aTab = this.mCurrentTab; } var l = this.mTabContainer.childNodes.length; if (l == 1 && this.mPrefs.getBoolPref("browser.tabs.autoHide")) { this.mPrefs.setBoolPref("browser.tabs.forceHide", true); this.setStripVisibilityTo(false); return; } /********** 中略 *********/ var newIndex = -1; if (currentIndex > index) { newIndex = currentIndex - 1; } else if (currentIndex < index) { newIndex = currentIndex; } else { newIndex = index - 1; if ("owner" in oldTab && oldTab.owner && this.mPrefs.getBoolPref("browser.tabs.selectOwnerOnClose")) { for (i = 0; i < this.mTabContainer.childNodes.length; ++i) { tab = this.mTabContainer.childNodes[i]; if (tab == oldTab.owner) { newIndex = i; break; } } } if (newIndex == -1) { newIndex = (index == l - 1) ? index - 1 : index; } } /*********** 中略 ************/ }
ここで重要なのは
newIndex = (index == l - 1) ? index - 1 : index;
で、閉じるタブが右端なら次に前面に出るタブはそのとなり、そうでなければ次に前面に出るのは現在のタブと同じ位置にくるタブとなっている。
ここを以下のように書き換える。
newIndex = (index == 0) ? l - 2 : index - 1;
これで、閉じるタブが一番左なら次に前面に出るのは一番右のタブになる。*1
方針が決まったので、後は前回と同じくtoString、evalを使って以下のように書く。
function tksBaseMoveLeftAfterRemoveCurrentTab() { eval( "gBrowser.removeTab = " + gBrowser.removeTab.toString().replace( "newIndex = (index == l - 1) ? index - 1 : index;", "newIndex = (index == 0) ? l - 2 : index - 1;" ) ); } window.addEventListener("load",tksBaseMoveLeftAfterRemoveCurrentTab,false);
*1:本当は処理の途中で何かの拍子にl=this.mTabContainer.childNodes.lengthが2未満になった時のために例外処理を書くべきなのだろうが、面倒なので割愛する。