TabMixPlus の javascript を改造する
タブを追加するときにアクティブタブの右に挿入させている
タブを削除した場合は左のタブへ移動する設定をしている
タブを閉じたときにアクティブタブの右側に未読のタブがあれば
一番右の未読のタブへ移動したくなった
未読タブが右側に無ければ、設定通りに左のタブへシフトさせる
TabMixPlus 0.3.7.4pre 090404
tabmixplus.jar->content\tabmixplus\tab\tab.js
TMP_PL_setUnreadTab()関数に追加
この関数はページの読み込み完了時に呼び出される
setUnreadTab: function TMP_PL_setUnreadTab(aTab) { if (aTab.parentNode.childNodes.length == 1) { var hidebutton = gBrowser.isBlankTab(aTab) || tabxPrefs.getBoolPref("keepLastTab"); TMP_setItem(aTab.parentNode, "hidebutton", hidebutton || null); } //追加部分 aTab.setAttribute("ma_pageLoad", "unread"); // 未読タブにフラグを付ける aTab.removeAttribute("tab-progress"); if (gPref.getBoolPref("extensions.tabmix.unreadTab") && aTab.hasAttribute("selected") && gPref.getBoolPref("extensions.tabmix.unreadTabreload") && !aTab.hasAttribute("dontremoveselected") && aTab.getAttribute("selected") == "false") aTab.removeAttribute("selected"); // see gBrowser.openLinkWithHistory in tablib.js if (aTab.hasAttribute("dontremoveselected")) aTab.removeAttribute("dontremoveselected") },
tabmixplus.jar->content\tabmixplus\tabmix.js
TMP_EL_handleEvent()関数の改造
この関数はタブのイベント処理をする
handleEvent: function TMP_EL_handleEvent(aEvent) { switch (aEvent.type) { case "SSTabRestoring": this.onSSTabRestoring(aEvent); break; case "TabOpen": this.onTabOpen(aEvent); break; case "TabClose": this.onTabClose(aEvent); break; case "TabSelect": // 追加部分 選択したタブからフラグを除去 if ( aEvent.target.hasAttribute("ma_pageLoad") ) aEvent.target.removeAttribute("ma_pageLoad"); this.onTabSelect(aEvent); break; case "DOMMouseScroll": this.onTabBarScroll(aEvent); break; case "load": this.onWindowOpen(aEvent); break; case "unload": this.onWindowClose(aEvent); break; } },
tabmixplus.jar->content\tabmixplus\minit\tablib.js
タブを閉じたときの挙動の処理
gBrowser.selectIndexAfterRemove = function (oldTab) { var currentIndex = this.mCurrentTab._tPos; if (this.mCurrentTab != oldTab) return currentIndex; var l = this.mTabs.length; if (l==1) return 0; var mode = this.mPrefs.getIntPref("extensions.tabmix.focusTab"); switch ( mode ) { case 0: // first tab return currentIndex == 0 ? 1 : 0; break; case 1: // left tab // 追加部分 var lastIndex = gBrowser.mTabContainer.childNodes.length - 1; for (var i=lastIndex; i>currentIndex; i--) { if ( gBrowser.mTabs[i].hasAttribute("ma_pageLoad") ) // 未読フラグの確認 return i; } // ここまで return currentIndex == 0 ? 1 : currentIndex-1; break; case 3: // last tab return currentIndex == l - 1 ? currentIndex - 1 : l - 1; break; case 6: // last opened var lastTab = this.getTabForLastPanel(); if (lastTab == oldTab && l > 1) { lastTab = document.getAnonymousElementByAttribute(this, "linkedpanel", this.mPanelContainer.childNodes[l-2].id); } return lastTab._tPos; case 4: // last selected var tempIndex = this.previousTabIndex(oldTab); // if we don't find last selected we fall back to default if (tempIndex > -1) return tempIndex; case 2: // opener / right (default ) case 5: // right tab default: if (mode != 5 && this.mPrefs.getBoolPref("browser.tabs.selectOwnerOnClose") && "owner" in oldTab) { var owner = oldTab.owner; if (owner && owner.parentNode && owner != oldTab) // oldTab and owner still exist just return its position return owner._tPos; } } return currentIndex == l - 1 ? currentIndex - 1 : currentIndex + 1; }
TabMixPlus でタブを閉じたときに左のタブへを設定すれば右側にある未読のタブへ飛ぶ
追記 多段タブ設定にしていると段にタブがあふれたときに未読フラグがおかしくなった こりゃいかん
追記090412 Firefox 3.5 を導入する際にちょこっと改良