Tab Mix Plusの「右側(左側)のタブをすべて閉じる」ボタンを改造

Tab Mix Plusで「右側・左側のタブをすべて閉じるボタン」を表示したときの右側・左側の配置が逆だと思う。しょっちゅう押し間違える*1のでボタンを作った。




最新版は一番下のタイプ。

ソースコード

tab-close_LR_button.uc.jsで保存。

// ==UserScript==
// @name           tab-close_LR_button
// @namespace      http://d.hatena.ne.jp/Cherenkov/
// @description    http://d.hatena.ne.jp/Cherenkov/20090526/p1
// @include        chrome://browser/content/browser.xul
// ==/UserScript==

(function() {

  var tabContextMenu = document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");

  function contextEdit(){
    var L_btn = document.createElement("button");
    L_btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAIAAAArLKlOAAAABnRSTlMA%2FwCjALHDmqA%2BAAABgklEQVR4nGP8v3gjA4ngpas5Ey65W2YaOSd2YYrfs9KZN28eC1Y9Xc9u7M%2Bf%2Fv37dwYLNzSz0pKSZGVl0W1byfo9YM08Xl7eBQsWsLKyIkvN%2F%2F22rKxMSEgoKCgIYdsRBaHp06crKChMnTpVWlr669evv3%2F%2F9l05GyLLy8trYmIyZ86cqqoqDQ0NqLayS0de7XmVn59vZmYGEeHm5j5w4ACaW16%2Ffv3mzRvNs7dZGu%2Be379%2Ff35%2Bvp%2BfHzMzM64QgoDdu3c7OTkxMDAwubq6CgoKHj9%2B%2FPHjx%2Fj1vHv3buvWrTkCcgwMDIyQeFvH9WfhwoVOTk7Jyck8PDwMDAx%2F%2F%2F69desWMzPz379%2F37x5c%2B7cuUOHDsXHx%2Ft9YkBog4AJb%2B4dOnQoLi7O19f3x48f3t7eampqrKysIiIiGhoakX%2B54SpR4q1ARMm%2F13%2FixIkbN25MSUnh5uaeZecDlfuL4mD06FY8enmCidNhecGenp6vX7%2Fi8icjnjS5huNXyA82rFIAVHuVVG1mytAAAAAASUVORK5CYII%3D");
    L_btn.addEventListener("command", function() {
      closeTabs("left");
    }, false);
    var R_btn = document.createElement("button");
    R_btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAIAAAArLKlOAAAABnRSTlMAAAAAAABupgeRAAABWUlEQVR4nJWQv4uCYBjHn%2B4lUKRF2trbXNzzpS2C6NdamGM4SEP9CUJTW1tSDiI0RIS0NURL4BwVKBKEEm2GS8jd4MHFdXl3n%2FH5vp%2Fnxwue58H%2FeVMUxbKs50AUxcPh8NJrNBoY4%2BcXGONCodDv93%2BeVqvVaJru9XqKojwGyWRyPB6nUqlyuazr%2BjctsdvtBoOBLMuqqpqm6ft%2BFPi%2BbxgGRVHn83k4HDqO0263c7ncl1qtVi%2BXy3ss2%2B2W5%2FlutxspKLredV2GYV5%2BAEAmkymVSkEQeJ4nCAICgOVySRBEPp8nSTLGPJ1Os9ksCIJms5mISvP5fDKZcBzHsmw6nUYIhWGYzWYRQgBwu91Go9FqteJ5vl6vA0DisZ%2Bmafv9%2Fnq93u%2F34%2FFoGAZBEIvFQlVVjuM6nU7MLp8Ui8XNZtNqtSRJsm37dyECY1ypVNbr9V%2BFiOl0GpN%2BAJS%2FqroH3r3AAAAAAElFTkSuQmCC");
    R_btn.addEventListener("command", function() {
      closeTabs("right");
    }, false);

    var hbox = document.createElement("hbox");
    hbox.setAttribute("align","center");
    hbox.appendChild(L_btn);
    hbox.appendChild(R_btn);
    tabContextMenu.appendChild(hbox);

    //必要がないときは消える。
    tabContextMenu.addEventListener("popupshowing", function() {
      var aTab = (document.popupNode.localName == "tabs") ? gBrowser.mCurrentTab : gBrowser.mContextTab;
      if(aTab.previousSibling == null)
        L_btn.setAttribute("style","display:none");
      else
        L_btn.setAttribute("style","display:inline");
      if(aTab.nextSibling == null)
        R_btn.setAttribute("style","display:none");
      else
        R_btn.setAttribute("style","display:inline");
    }, false);
  }

  function closeTabs(LeftRight) {
    var aTab = (document.popupNode.localName == "tabs") ? gBrowser.mCurrentTab : gBrowser.mContextTab;
    var pos = aTab._tPos;

    //コンテキストメニューを開いたタブをアクティブにして、
    //タブを消す際にチラチラ表示されるのを防ぐ。
    if(pos!=gBrowser.mCurrentTab._tPos)
      gBrowser.selectedTab = gBrowser.mTabs[pos];

    var start = (LeftRight == "left") ? pos - 1 : gBrowser.mTabs.length - 1;
    var stop = (LeftRight == "left") ? 0 : pos + 1;
    for(var i = start; i >= stop; i--) {
      gBrowser.removeTab(gBrowser.mTabs[i]);
    }
    tabContextMenu.hidePopup();
  }

//Menu Editor対策
setTimeout(function(){contextEdit()},0);

})();

更新履歴

20090528
ボタンが押せないときは非表示にするようにした。
20090611
Tab Mix Plusに依存する部分を無くした。

使い方

問題点

  • ボタンを小さくしたいけどwidthがうまくいかない。hbox、buttonに対してsetAttribute("width",50)やsetAttribute("style","width:50px!important;")もダメ。
  • コードを書いていて途中までsetTimeout(run,0);無くても動いてたのになぜ。バックアップとってなくてわからなくなった・・。

追記:アドオンのMenu Editorを無効にすればsetTimeoutしなくても動くことを確認した。

  • コンテキストを開くたびにdataスキーム読み込むのはどうなんだ。

感想

Firebugさんありがとう。

*1:Menu Editorを無効化したとき