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 を導入する際にちょこっと改良