Показывать количество открытых табов в адресной строке ( Firefox 24+)
Автор: bunda1
Версия: от 16.10.2016.
Описание: Код создаёт кнопку в адресной строке которая показывает количество всех открытых табов и количество открытых табов текущей группы вкладок. Кнопка открывает меню со списком вкладок текущей группы, в меню название текущей вкладки отображается красным цветом а не прочитанные или незагружеые вкладки синим цветом. Меню вкладок даёт возможность левым кликом переключится на нужную вкладку и правым кликом удалять вкладки не закрывая меню. Меню вкладок автоматически закрывается при уводе курсора, длительность увода можно установить в коде.

Скриншот:
http://i78.fastpic.ru/big/2016/0419/d1/8d82a05862ef7b24b5547a28ed51fdd1.png

Использование: создайте новую Custom Buttons кнопку и положите код в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Показывать количество открытых табов в адресной строке, от 16.10.2016. ..................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel");
   tabCounter.setAttribute("id", "tabCounter");
   tabCounter.setAttribute("context", "event.stopPropagation()");
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore(tabCounter, urlbarIcons.firstChild);
   addDestructor(()=> tabCounter.remove() );


   // Отслеживать клик на счетчике ....
   tabCounter.onclick =e=> {
      if ( e.target.localName == "menuitem" ) return;

      tabCounter.textContent = ""; // удалить старое меню  
      
      // создать новое меню всех вкладок текущей группы
      var array = ["label", "image", "selected", "unread", "pending"];
      var menu = tabCounter.appendChild(document.createElement("menupopup"));
      gBrowser.visibleTabs.forEach(tab=> {
         var mItem = menu.appendChild(document.createElement("menuitem"));
         mItem.tab = tab;
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");      
         array.forEach(atrr=> mItem.setAttribute(atrr, tab.getAttribute(atrr)) );
      });
      
      // периодически запускать обновление меню
      menu.interval = setInterval(()=> menuReload(), 200);
      addEventListener("popuphidden", ()=> clearInterval(menu.interval), false, menu);
      
      // обновить меню
      function menuReload() {
         [...menu.children].forEach(el=> {
            array.forEach(atrr=> el.setAttribute(atrr, el.tab.getAttribute(atrr)) );
         })
      };      
      
      // автоматически закрывать меню при ухода курсора, длительность увода - 450 мс
      menu.onmouseover =()=> this.f = true;    
      menu.onmouseleave =()=> { this.f = false; setTimeout(()=> !this.f && menu.hidePopup(), 450) };
            
      // отслеживать клики на пунктах меню
      menu.onmouseup =e=> {
         e.preventDefault();

         var mItem = e.target, tab = mItem.tab;
         if ( e.button == 0 )
              gBrowser.selectedTab = tab;
         else
              {
              mItem.remove();
              gBrowser.removeTab(tab);
              }
         menuReload();
      };

      // фокус на активную вкладку в меню при открытии
      var box = document.getAnonymousElementByAttribute(menu, "class", "popup-internal-box");
      addEventListener("popupshowing", ()=> {
         var menuitem = [...menu.children].filter(el=> el.getAttribute("selected", "true") )[0];
         menuitem.setAttribute('_moz-menuactive', true);
         var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height/2;
         var boxCenter = box.boxObject.screenY + box.boxObject.height/2;  
         box.scrollByPixels(menuitemCenter - boxCenter);
      }, false, menu);            
      
      menu.showPopup(tabCounter, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabCounter:hover { color: #FF1493 !important; }\
      #tabCounter > menupopup scrollbox { overflow-y: auto !important; }\
      #tabCounter > menupopup > menuitem[unread="true"],\
      #tabCounter > menupopup > menuitem[pending="true"] { color: blue !important; }\
      #tabCounter { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
      #tabCounter > menupopup > menuitem[selected="true"] { color: red !important; font-weight: bold !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) ); 
   
   
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout(count.timeout) } catch(e) {};
     count.timeout = window.setTimeout(()=> {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
        tabCounter.label = (all > visible ? visible + '/' : '') + all;
     }, 350);
   };
   count();


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs);
   addEventListener("TabClose", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(()=> getChangeTabGroup(), 50); 
         removeEventListener(e.type, c, false, tabs); 
      }, false, tabs);
   };
   getChangeTabGroup();
})();

bunda1, спасибо.
Tab Utilities умеет выводить количество открытых табов в текущей группе по отношению к общему числу табов (во всех группах)
http://img202.imageshack.us/img202/8116/b32i.png
и при этом этот набор чисел объединяется с кнопкой меню "Список всех вкладок", при нажатии на которую выпадает список вкладок в активной группе
http://img823.imageshack.us/img823/1507/nfq7.png

Можно ли:
1) организовать вывод в адресной строке "количество табов в активной группе/общее количество табов" (например, как на скриншоте)
2) можно ли организовать вывод аналогично TU, т.е. на панели вкладок и с объединением с кнопкой "Список всех вкладок"?

>ORG@niZM< пишет:

Можно ли:
1) организовать вывод в адресной строке "количество табов в активной группе/общее количество табов" (например, как на скриншоте)
2) можно ли организовать вывод аналогично TU, т.е. на панели вкладок и с объединением с кнопкой "Список всех вкладок"?

Хорошо, я сделаю.

bunda1
хорошо, буду ждать сколько потребуется. А Tab Utilities уже отключен (RIP).

>ORG@niZM< пишет:

... организовать вывод в адресной строке "количество табов в активной группе/общее количество табов" и с объединением с кнопкой "Список всех вкладок"?

Выделить код

Код:

// Показывать количество открытых табов в адресной строке +, от 25.08.2013.
(function () { 
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel"); 
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore( tabCounter, urlbarIcons.firstChild );
   addDestructor(function() { urlbarIcons.removeChild( tabCounter ) });
   tabCounter.id = "tabCounter"; 
    
   
   // Отслеживать клик на счетчике ....
   tabCounter.onclick = function(e) {
      if ( e.button ) return;
   
      tabCounter.textContent = "";   
      var menu = tabCounter.appendChild( document.createElement("menupopup") ); // создать и открыть новое меню
      menu.setAttribute("onmouseup", "gBrowser.selectedTab = gBrowser.visibleTabs[event.target.index]");
      menu.setAttribute("onmouseleave", "this.hidePopup()");

      gBrowser.visibleTabs.forEach(function( tab, i ) {      
         var mItem = document.createElement("menuitem");
         mItem.index = i;         
         mItem.setAttribute("label", tab.label );
         mItem.setAttribute("image", tab.image );
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");
         mItem.setAttribute("selected", tab.selected );
         mItem.setAttribute("unread", tab.hasAttribute("unread"));
         menu.appendChild( mItem );
      });
      menu.showPopup( tabCounter, -1, -1, "popup", "bottomleft", "topleft");  
   };


   // Стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
   #tabCounter { -moz-appearance: none !important; border: 0px !important; margin-right: -5px !important; }\
   #urlbar-icons > statusbarpanel:first-child scrollbox { overflow-y: auto !important; }\
   .menuitem-iconic.bookmark-item[unread="true"]:not(:hover) { color: blue !important; }\
   .menuitem-iconic.bookmark-item[selected="true"]:not(:hover) { color: red !important; }\
   '));
   const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); 
   addDestructor(function() { sss.unregisterSheet(uri, sss.AGENT_SHEET) }); 


   // Считать и показывать количество вкладок ....
   function count() {
      setTimeout(function() {
         var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
         tabCounter.label = ( all > visible ? gBrowser.visibleTabs.length + '/' : '' ) + all;  
      }, 50 );
   };
   count();


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs );
   addEventListener("TabClose", count, false, tabs );
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(function() { getChangeTabGroup() }, 50 ) 
         removeEventListener( e.type, c, false, tabs ); 
      }, false, tabs );
   };
   getChangeTabGroup();
})();

bunda1
Как вариант - очень хорошо!
но скорей всего, >ORG@niZM< имел ввиду вывод не в адресную строку, а выводить счетчик прямо на кнопку "Список всех вкладок". Именно так и было реализовано в TU. И удобно и практично.

Inko7 пишет:

bunda1
но скорей всего, >ORG@niZM< имел ввиду вывод не в адресную строку, а выводить счетчик прямо на кнопку "Список всех вкладок". Именно так и было реализовано в TU. И удобно и практично.

А вот и не удобно и не практично, на панели вкладок должны быть только вкладки.

bunda1 пишет:

А вот и не удобно и не практично, на панели вкладок должны быть только вкладки.

ага, вкладки и индикатор их количества :)
ок, не буду спорить
пусть все решает автор кнопки, т.е. ты :)

bunda1 пишет:

А вот и не удобно и не практично, на панели вкладок должны быть только вкладки.

+1
bunda1
Идея очень хорошая, но в [nightly] работает некорректно, при выборе вкладок из списка во второй группе перекидывает  в первую группу.  Правда мне список не очень и нужен, тк пользуюсь для этого жестами:) Поэтому  удалил

этот блок

Выделить код

Код:

// Отслеживать клик на счетчике ....
tabCounter.onclick = function(e) { alert(self._handlers.length);
   if ( e.button !== 0 ) return;
   
   var menu = tabCounter.appendChild( document.createElement("menupopup") ); // создать и открыть новое меню
   Array.slice( gBrowser.visibleTabs ).forEach(function( tab, i ) {      
         var mItem = document.createElement("menuitem");
         mItem.index = i;         
         mItem.setAttribute("label", tab.label );
         mItem.setAttribute("image", tab.image );
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");
         mItem.setAttribute("selected", tab.selected );
         mItem.setAttribute("unread", tab.hasAttribute('unread') );
         menu.appendChild( mItem );     
   });
   menu.showPopup( tabCounter, -1, -1, "popup", "bottomleft", "topleft");  
   addEventListener("mouseup", function(e) gBrowser.selectedTab = gBrowser.visibleTabs[e.target.index], true, menu );

   addEventListener("popuphiding", function f(e) {  // удалить меню после закрытия
      tabCounter.removeChild( e.target )
  }, false, menu );
   
};


Ещё что-нибудь можно удалить, если не нужен список открытых вкладок?

25-08-2013 12:19:41

Inko7 пишет:

И удобно и практично.

Когда делаешь такие заявления надо добавлять ИМХО.:dumb: А не делать заявления от всех. ИМХО:)

voqabuhe
[nightly] это зло, ты всё правильно удалил.

Ну всё, всё, затоптали :P

bunda1
Для таких "неправильных", как я и мне подобных, сделай пожалуйста вариант:

выводить счетчик прямо на кнопку "Список всех вкладок"

и все споры утихнут навсегда :beer:

Ок

№5
bunda1, спасибо. И такой вариант мне по душе. Просто в качестве альтернативы можно, если не сложно

>ORG@niZM< пишет:

организовать вывод аналогично TU, т.е. на панели вкладок и с объединением с кнопкой "Список всех вкладок"

В любом случае спасибо - TU мне больше не нужен.

bunda1
по свободе может сделаешь?

Для таких "неправильных", как я и мне подобных, сделай пожалуйста вариант:

выводить счетчик прямо на кнопку "Список всех вкладок"

и все споры утихнут навсегда :beer:

по аналогии, самому получается поместить счетчик на кнопку рядом с дропмаркером, но как прописать его вместо - умений не хватает...

bunda1
Тогда и я выскажу свою хотелку, может понравится.:D А что если количеством заменить звезду, уж очень она вид портит. Но только чтобы цифра  сохраняла все функции звезды, или это фантастика?:)

Показывать количество открытых табов на кнопке "Список всех вкладок" ( Firefox 17+)
Автор: bunda1
Версия: от 01.09.2013.
Описание: Код показывает количество всех открытых табов на кнопке "Список всех вкладок".
Использование: создайте новую Custom Buttons кнопку и положите код в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Показывать количество открытых табов на кнопке "Список всех вкладок", от 01.09.2013. ................................
(function () {
  
  var alltabs = document.getElementById('alltabs-button');
  if ( alltabs == null ) return;
  
  // Стиль добавляет текст на кнопку ....
  var uri = makeURI('data:text/css,'+ encodeURIComponent('\
  %button% .toolbarbutton-icon {\
    display: none !important;\
  }\
  %button% .toolbarbutton-text {\
    display: -moz-box !important;\
  }\
  %button% {\
    -moz-box-orient: horizontal !important;\
  }\
  '.replace(/%button%/g, "#alltabs-button" ) ));
   const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); 
   addDestructor(function() { sss.unregisterSheet(uri, sss.AGENT_SHEET) });
  
  // Фокус на активную вкладку в меню всех вкладок ....
  (function() {
    const popup = document.getElementById("alltabs-popup");
    const box = document.getAnonymousElementByAttribute(popup, "class", "popup-internal-box");
    addEventListener("popupshowing", function() {
        var [menuitem] = Array.filter(popup.childNodes, function(menuitem) menuitem.hasAttribute("selected"));
        var boxCenter = box.boxObject.screenY + box.boxObject.height / 2;
        var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height / 2;
        box.scrollByPixels(menuitemCenter - boxCenter);
    }, false, popup);
  })();  
  
  // Считать и показывать количество вкладок ....
  function count(e) {
     try { window.clearTimeout( tabTimeout ) } catch(e) {};
     tabTimeout = window.setTimeout(function() {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
        alltabs.label = ( all > visible ? gBrowser.visibleTabs.length + '/' : '' ) + all;
     }, 50 );
  };
  count();

  // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
  var tabs = gBrowser.tabContainer;
  addEventListener("TabOpen", count, false, tabs);
  addEventListener("TabClose", count, false, tabs);
  function getChangeTabGroup() {
    addEventListener("TabHide", function c(e) {
      count();
      setTimeout(function () {
        getChangeTabGroup()
      }, 50 );
      removeEventListener(e.type, c, false, tabs);
    }, false, tabs);
  };
  getChangeTabGroup();
  
})();

bunda1
Замечательно, спасибо.
А как немного расширить по горизонтали зону нажатия? а то когда одиночная цифра, трудно попадать

Inko7 пишет:

bunda1
Замечательно, спасибо.
А как немного расширить по горизонтали зону нажатия? а то когда одиночная цифра, трудно попадать

Как расширить, изменить цвет фона или что ?

bunda1
огромное спасибо - то, что нужно

bunda1 пишет:

Как расширить, изменить цвет фона или что ?

когда курсор подводишь, то выделяется зона всей кнопки и вот она узковата получается...
спасибо, но уже сам поправил с помощью margin-left
теперь всё просто супер!

Вопрос: как сделать «звёздочку» кастом баттона в таком же стиле дизайна, как и остальные кнопки [firefox]?

DarkHeavy
Может не правильно понял, просто заменить звездочку на нужную иконку. Редактировать -Изображение-Обзор, не?

villa7
О! Спасибо, надо будет попробовать ;) Я считал, что «обзор» это не для изображения, а для вставки кода из какого-то файла текстового. Даже не додумался её нажать.

Заменил. Всё работает.

DarkHeavy
Желательно ещё  конвертировать в base64 нажав на кнопку рядом, тогда иконка не будет привязана к местоположению на диске.

villa7
Я её в папку с профайлом [firefox] засунул. Но за совет спасибо ;) Нажму завтра, когда на работу приду ;)

okkamas_knife
Да там картинка на сотен байт :)

Кроме того, не думаю, что сейчас такие уж слабые компы, чтобы заметить скорость загрузки картинки ;) Но всё равно спасибо ;)

DarkHeavy
А если картинка не одна? Да и самое узкое место ЛЮБОЙ системы — подсистема хранения данных.

Показывать количество открытых табов в адресной строке+ ( Firefox 24+)
Автор: bunda1
Версия: от 19.04.2016.
Описание: Код создаёт кнопку в адресной строке которая показывает количество всех открытых табов и количество открытых табов текущей группы вкладок. Кнопка открывает меню со списком вкладок текущей группы, в меню название текущей вкладки отображается красным цветом а не прочитанные вкладки синим цветом. Меню вкладок даёт возможность левым кликом переключится на нужную вкладку и правым кликом удалять вкладки не закрывая меню. Меню вкладок автоматически закрывается при уводе курсора, длительность увода можно установить в коде.

Скриншот:
http://i78.fastpic.ru/big/2016/0419/d1/8d82a05862ef7b24b5547a28ed51fdd1.png

Использование: создайте новую Custom Buttons кнопку и положите код в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Показывать количество открытых табов в адресной строке +, от 19.04.2016. .....................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel");
   tabCounter.id = "tabCounter";
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   tabCounter.setAttribute("context", "event.stopPropagation()");
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore( tabCounter, urlbarIcons.firstChild);
   addDestructor(()=> tabCounter.remove() );


   // Отслеживать клик на счетчике ....
   tabCounter.onclick =e=> {
      if ( e.target.localName == "menuitem" ) return;

      tabCounter.textContent = ""; // удалить старое меню  
      
      // создать новое меню всех вкладок текущей группы
      var menu = tabCounter.appendChild(document.createElement("menupopup"));
      gBrowser.visibleTabs.forEach((tab, i)=> {
         var mItem = document.createElement("menuitem");
         mItem.index = i;
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");      
         ["label", "image", "selected", "unread"].forEach(atrr=> mItem.setAttribute(atrr, tab.getAttribute(atrr)) );
         menu.appendChild(mItem);
      });         
 
      // автоматически закрывать меню при ухода курсора, длительность увода - 450 мс
      menu.setAttribute("onmouseover", "this.m = false");    
      menu.setAttribute("onmouseleave", "this.m = true; setTimeout(()=> this.m && this.hidePopup(), 450)");
      
      // отслеживать клики на пунктах меню
      menu.onmouseup =e=> {
         e.preventDefault();
         var mItem = e.target;
         var tab = gBrowser.visibleTabs[mItem.index];
         if ( e.button == 0 ) {
              mItem.removeAttribute('unread');
              [...menu.children].forEach(node=> node.removeAttribute('selected') );
              mItem.setAttribute('selected', true);
              gBrowser.selectedTab = tab;
              }
         else
              {
              gBrowser.removeTab(tab);
              mItem.remove();
              [...menu.children].forEach((node, i)=> node.index = i );
              var selectTab = gBrowser.visibleTabs.filter(tab=> tab.hasAttribute('selected') )[0];
              menu.children[selectTab._tPos].setAttribute('selected', true);
              }
      };

      // фокус на активную вкладку в меню при открытии
      var box = document.getAnonymousElementByAttribute(menu, "class", "popup-internal-box");
      addEventListener("popupshowing", ()=> {
         var boxCenter = box.boxObject.screenY + box.boxObject.height / 2;  
         var menuitem = [...menu.children].filter(node=> node.getAttribute("selected", "true") )[0];
         menuitem.setAttribute('_moz-menuactive', true);  
         var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height / 2;
         box.scrollByPixels(menuitemCenter - boxCenter);
      }, false, menu);            
      
      menu.showPopup(tabCounter, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabCounter:hover { color: #FF1493 !important; }\
      #tabCounter > menupopup scrollbox { overflow-y: auto !important; }\
      #tabCounter > menupopup > menuitem[unread="true"]:not(:hover) { color: blue !important; }\
      #tabCounter { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
      #tabCounter > menupopup > menuitem[selected="true"] { color: red !important; font-weight: bold !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) ); 
   
   
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout(count.timeout) } catch(e) {};
     count.timeout = window.setTimeout(()=> {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
        tabCounter.label = (all > visible ? visible + '/' : '') + all;
     }, 350);
   };
   count();


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs);
   addEventListener("TabClose", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(()=> getChangeTabGroup(), 50); 
         removeEventListener(e.type, c, false, tabs); 
      }, false, tabs);
   };
   getChangeTabGroup();
})();

Автор молодец! Очень нужная вещь, особенно последний вариант кнопки!

Я не совсем уверен, что моя просьба точно по теме, но имхо - где-то близко.
Был такой аддон "Load Tabs Progressively", но для новых версий ФФ (для 25-й - точно) он устарел и недоступен. Он ограничивал число одновременно загружаемых вкладок (чтобы загружалось не более К вкладок одновременно), а остальные - по мере завершения загрузки предыдущих. Он также ограничивал общее число непрочитанных вкладок, то есть вкладки сверх общего числа непрочитанных (N) - вообще не показывались - только по мере прочтения предыдущих.
Поэтому даже если открывать сразу все закладки какого-то немаленького букмаркфолдера - это не перегружало бы браузер.
Можно ли добавить эту функциональность (в виде сниппета, т.е., чтобы её можно было "пришить" к другим кнопкам, напр. "Memory monitor")?

Дело в том, что она не требует интеракции с пользователем - эти ограничители пользователь смог бы "забить" в коде один раз и если раз в сто лет решит изменить их, то может и отредактировать эти границы в коде кнопки куда он этот сниппет "пришил".

Если эта просьба не относится к этой теме - заранее извиняюсь, но поиск по "ограничение количества табов" ничего не дал, а по "количество табов" дал эту тему.

difabor
Всё это можно но сложно, но сложно. Попробуй подправить это расширение.

Тему вверх! :) На дворе уж 2015 год.
И я был крайне удивлён, обнаружив этот код, да притом ещё рабочий до сих пор!
Уж сколько я перепробовал расширений с официального сайта дополнений - устроило всего лишь одно! И то отвалилось при переходе на Firefox 40.0.2: https://addons.mozilla.org/ru/firefox/addon/open-tab-count-widget/ . Видимо, автор просто забыл про него :(

А с этой кнопкой счётчик стал даже ещё функциональней. Фактически, их там 2 :) А ранее был только один - общий.
Некоторое время думал - куда убрать кнопку, чтоб не занимала место? Решение простое - просто убрал её на ту панель, которая всегда скрыта :D

bunda1, персональное спасибо от меня!

bunda1
А можно изменить цвет кол-ва вкладок в адресной строке, например, синим или любым другим цветом.? Так с кнопкой Memory Monitor трудно различить на некоторых сайтах.
http://i.imgur.com/XaQRBdh.png

xrun1

#tabCounter{color:#00f !important;}

villa7
Спасибо, всё раскрасил. :)

Уважаемый bunda1,
а как определить - закреплена вкладка (pinned) или нет?

difabor пишет:

а как определить - закреплена вкладка (pinned) или нет?

У такой вкладки есть свойство pinned, вот пример как узнать закреплена ли текущая вкладка:

Выделить код

Код:

alert( gBrowser.mCurrentTab.pinned );

или так:

Выделить код

Код:

// Закрепить-открепить текущую вкладку
var currTab = gBrowser.mCurrentTab;
currTab.pinned ? gBrowser.unpinTab(currTab) : gBrowser.pinTab(currTab);

или вот так:

Выделить код

Код:

// Закрыть все вкладки слева, кроме закреплённых вкладок 
gBrowser.visibleTabs.forEach((tab)=> !tab.pinned && tab._tPos < gBrowser.mCurrentTab._tPos && gBrowser.removeTab(tab));

Большое спасибо!

В рамках борьбы с бессонницей, pure css :D:

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
#TabsToolbar #tabbrowser-tabs .tabbrowser-tab:first-of-type{
  counter-reset: tabbrowser-tab tabbrowser-tab-pinned!important;
}
#TabsToolbar #tabbrowser-tabs .tabbrowser-tab:not([pinned]){
  counter-increment: tabbrowser-tab !important;
}
#TabsToolbar #tabbrowser-tabs .tabbrowser-tab[pinned]{
  counter-increment: tabbrowser-tab-pinned !important;
}
#TabsToolbar #tabbrowser-tabs:after {
  content: counter(tabbrowser-tab-pinned) "/" counter(tabbrowser-tab) !important;
  position: fixed !important;
  display: -moz-box!important;
  -moz-box-align: center!important;
  padding: 2px 0!important;  /* отступы */
  color: lightgreen!important; /* цвет текста */
  font: 600 8px "dejavu sans mono"!important; /* толщина/размер/название шрифта */
  background: none!important; /* цвет фона/прозрачный */
  text-shadow:  0 0 1px rgba(0,0,0,.95), 0 0 4px rgba(0,0,0,.95)!important;  /* тень у текста */
  pointer-events: none!important;
}

https://lh3.googleusercontent.com/-xbJD_etrLRA/VtpcAnUsRNI/AAAAAAAAcKA/zuC8Ouc5jV8/s0/thumb.png

bunda1 пишет:

Показывать количество открытых табов в адресной строке+ ( Firefox 17+)
Автор: bunda1
Версия: от 20.10.2013.

Можно сделать так, чтобы навигация в выпадающем списке стрелками вверх/вниз с клавы начиналась с активной вкладки?

Как вызвать список хоткеем?

bunda1
Что-то кнопка неправильно работает, только сегодня заметил. [firefox] 45.0.1, Custom Buttons 0.0.5.8.9, в остальном профиль дефолтный.
Гифку загрузить не удалось, сделал небольшое видео. https://cloud.mail.ru/public/CGqi/xBNnXGGdp

ifln пишет:

Можно сделать так, чтобы навигация в выпадающем списке стрелками вверх/вниз с клавы начиналась с активной вкладки?

А вот не знаю :/

ifln пишет:

Как вызвать список хоткеем?

Каким именно хоткеем нужно?

18-04-2016 20:19:20

xrun1 пишет:

bunda1
Что-то кнопка неправильно работает, только сегодня заметил.

Да есть такой глюк, завтра исправлю.

xrun1 пишет:

bunda1
Что-то кнопка неправильно работает, только сегодня заметил. [firefox] 45.0.1, Custom Buttons 0.0.5.8.9, в остальном профиль дефолтный.
Гифку загрузить не удалось, сделал небольшое видео. https://cloud.mail.ru/public/CGqi/xBNnXGGdp

Исправил: Показывать количество открытых табов в адресной строке+

bunda1 пишет:

Кнопка открывает меню со списком вкладок текущей группы, в меню название текущей вкладки отображается красным цветом а не прочитанные вкладки синим цветом. Меню вкладок даёт возможность левым кликом переключится на нужную вкладку и правым кликом удалять вкладки не закрывая меню. Меню вкладок автоматически закрывается при уводе курсора, длительность увода можно установить в коде.

А на жест такое меню можно подцепить?

bunda1
Странно, но у меня не показывается в виде № текущего таба / общее количество (как у тебя на скрине).

Выделить код

Код:

        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
        tabCounter.label = (all > visible ? visible + '/' : '') + all;

Только одна цифра - общее количество табов. То есть получается, что all=visible. :(
Профиль дефолтный, Custom Buttons + 1 кнопка. [firefox] 45.0.2.
UPD; Если это сложно - не заморачивайся, мне не принципиально. И так достаточно общего количества и меню при клике. Спасибо.

xrun1 пишет:

bunda1
Странно, но у меня не показывается в виде № текущего таба / общее количество (как у тебя на скрине).

Но чаще всего так и есть...
Они начинают отличаться, когда все табы не умещаются

xrun1 пишет:

bunda1
Странно, но у меня не показывается в виде № текущего таба / общее количество (как у тебя на скрине).

Это не № текущего таба / общее количество, а количество табов в текущей группе вкладок / общее количество вкладок. У тебя групп вкладок нет потому цифра в счетчике одна.

20-04-2016 07:59:38

voqabuhe пишет:

А на жест такое меню можно подцепить?

А на каком расширении?

bunda1 пишет:

Это не № текущего таба / общее количество, а количество табов в текущей группе вкладок / общее количество вкладок. У тебя групп вкладок нет потому цифра в счетчике одна.

Ясно, спасибо.

bunda1 пишет:

А на каком расширении?

FireGestures

bunda1

bunda1 пишет:

Показывать количество открытых табов в адресной строке +, от 19.04.2016

1. А нельзя ли сделать, чтобы в меню отображалась структура дерева вкладок, как это сделано в обычной кнопке списка вкладок, при использовании treestyletab?

скрытый текст
http://s017.radikal.ru/i439/1610/3d/3845c451ba91.png

2. И еще бы, выделение не загруженных вкладок, так же как непрочитанных.
3. И как отодвинуть цифру в адресной строке от того же Memory Monitor или любого другого виджета?

_zt пишет:

1. А нельзя ли сделать, чтобы в меню отображалась структура дерева вкладок, как это сделано в обычной кнопке списка вкладок, при использовании treestyletab?

Не знаю как это сделать.

08-10-2016 18:14:51

_zt пишет:

2. И еще бы, выделение не загруженных вкладок, так же как непрочитанных.

Можно. Какой цвет для непрочитанных?

bunda1

bunda1 пишет:

Можно. Какой цвет для непрочитанных?

Незагруженных. Непрочитанные и так там есть. У меня в CTR так стоит #FFCCCC, в меню наверное лучше #FF6666 или около того и если возможно то курсивом.

_zt пишет:

Незагруженных. Непрочитанные и так там есть. У меня в CTR так стоит #FFCCCC, в меню наверное лучше #FF6666 или около того и если возможно то курсивом.

Выделить код

Код:

// Показывать количество открытых табов в адресной строке, от 16.10.2016. ..................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel");
   tabCounter.setAttribute("id", "tabCounter");
   tabCounter.setAttribute("context", "event.stopPropagation()");
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore(tabCounter, urlbarIcons.firstChild);
   addDestructor(()=> tabCounter.remove() );


   // Отслеживать клик на счетчике ....
   tabCounter.onclick =e=> {
      if ( e.target.localName == "menuitem" ) return;

      tabCounter.textContent = ""; // удалить старое меню  
      
      // создать новое меню всех вкладок текущей группы
      var array = ["label", "image", "selected", "unread", "busy"];
      var menu = tabCounter.appendChild(document.createElement("menupopup"));
      gBrowser.visibleTabs.forEach(tab=> {
         var mItem = menu.appendChild(document.createElement("menuitem"));
         mItem.tab = tab;
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");      
         array.forEach(atrr=> mItem.setAttribute(atrr, tab.getAttribute(atrr)) );
      });
      
      // периодически обновлять открытое меню
      menu.interval = setInterval(()=> menuReload(), 150);
      addEventListener("popuphidden", ()=> clearInterval(menu.interval), false, menu);
      
      // обновить меню
      function menuReload() {
         [...menu.children].forEach(el=> {
            array.forEach(atrr=> el.setAttribute(atrr, el.tab.getAttribute(atrr)) );
         })
      };      
      
      // автоматически закрывать меню при ухода курсора, длительность увода - 450 мс
      menu.onmouseover =()=> this.f = true;    
      menu.onmouseleave =()=> { this.f = false; setTimeout(()=> !this.f && menu.hidePopup(), 450) };
            
      // отслеживать клики на пунктах меню
      menu.onmouseup =e=> {
         e.preventDefault();

         var mItem = e.target, tab = mItem.tab;
         if ( e.button == 0 )
              gBrowser.selectedTab = tab;
         else
              {
              mItem.remove();
              gBrowser.removeTab(tab);
              }
         menuReload();
      };

      // фокус на активную вкладку в меню при открытии
      var box = document.getAnonymousElementByAttribute(menu, "class", "popup-internal-box");
      addEventListener("popupshowing", ()=> {
         var menuitem = [...menu.children].filter(el=> el.getAttribute("selected", "true") )[0];
         menuitem.setAttribute('_moz-menuactive', true);
         var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height/2;
         var boxCenter = box.boxObject.screenY + box.boxObject.height/2;  
         box.scrollByPixels(menuitemCenter - boxCenter);
      }, false, menu);            
      
      menu.showPopup(tabCounter, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabCounter:hover { color: #FF1493 !important; }\
      #tabCounter > menupopup scrollbox { overflow-y: auto !important; }\
      #tabCounter > menupopup > menuitem[unread="true"] { color: blue !important; }\
      #tabCounter { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
      #tabCounter > menupopup > menuitem[selected="true"] { color: red !important; font-weight: bold !important; }\
      #tabCounter > menupopup > menuitem[busy="true"] { color: #FF6666 !important; font-style: italic !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) ); 
   
   
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout(count.timeout) } catch(e) {};
     count.timeout = window.setTimeout(()=> {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
        tabCounter.label = (all > visible ? visible + '/' : '') + all;
     }, 350);
   };
   count();


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs);
   addEventListener("TabClose", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(()=> getChangeTabGroup(), 50); 
         removeEventListener(e.type, c, false, tabs); 
      }, false, tabs);
   };
   getChangeTabGroup();
})();

bunda1
Я вашу мысль понял и для busy действительно работает, но мне хотелось не для "загружаемых", а для "не загруженных". CTR или UnloadTabs или UnloadTab и некоторые другие расширения умеют выгружать вкладки из памяти, вот такие и хотелось бы маркировать.

_zt пишет:

для "загружаемых", а для "не загруженных". CTR или UnloadTabs или UnloadTab и некоторые другие расширения умеют выгружать вкладки из памяти, вот такие и хотелось бы маркировать.

:/

Выделить код

Код:

// Показывать количество открытых табов в адресной строке, от 16.10.2016. ..................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel");
   tabCounter.setAttribute("id", "tabCounter");
   tabCounter.setAttribute("context", "event.stopPropagation()");
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore(tabCounter, urlbarIcons.firstChild);
   addDestructor(()=> tabCounter.remove() );


   // Отслеживать клик на счетчике ....
   tabCounter.onclick =e=> {
      if ( e.target.localName == "menuitem" ) return;

      tabCounter.textContent = ""; // удалить старое меню  
      
      // создать новое меню всех вкладок текущей группы
      var array = ["label", "image", "selected", "unread", "pending"];
      var menu = tabCounter.appendChild(document.createElement("menupopup"));
      gBrowser.visibleTabs.forEach(tab=> {
         var mItem = menu.appendChild(document.createElement("menuitem"));
         mItem.tab = tab;
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");      
         array.forEach(atrr=> mItem.setAttribute(atrr, tab.getAttribute(atrr)) );
      });
      
      // периодически обновлять открытое меню
      menu.interval = setInterval(()=> menuReload(), 150);
      addEventListener("popuphidden", ()=> clearInterval(menu.interval), false, menu);
      
      // обновить меню
      function menuReload() {
         [...menu.children].forEach(el=> {
            array.forEach(atrr=> el.setAttribute(atrr, el.tab.getAttribute(atrr)) );
         })
      };      
      
      // автоматически закрывать меню при ухода курсора, длительность увода - 450 мс
      menu.onmouseover =()=> this.f = true;    
      menu.onmouseleave =()=> { this.f = false; setTimeout(()=> !this.f && menu.hidePopup(), 450) };
            
      // отслеживать клики на пунктах меню
      menu.onmouseup =e=> {
         e.preventDefault();

         var mItem = e.target, tab = mItem.tab;
         if ( e.button == 0 )
              gBrowser.selectedTab = tab;
         else
              {
              mItem.remove();
              gBrowser.removeTab(tab);
              }
         menuReload();
      };

      // фокус на активную вкладку в меню при открытии
      var box = document.getAnonymousElementByAttribute(menu, "class", "popup-internal-box");
      addEventListener("popupshowing", ()=> {
         var menuitem = [...menu.children].filter(el=> el.getAttribute("selected", "true") )[0];
         menuitem.setAttribute('_moz-menuactive', true);
         var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height/2;
         var boxCenter = box.boxObject.screenY + box.boxObject.height/2;  
         box.scrollByPixels(menuitemCenter - boxCenter);
      }, false, menu);            
      
      menu.showPopup(tabCounter, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabCounter:hover { color: #FF1493 !important; }\
      #tabCounter > menupopup scrollbox { overflow-y: auto !important; }\
      #tabCounter > menupopup > menuitem[unread="true"] { color: blue !important; }\
      #tabCounter { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
      #tabCounter > menupopup > menuitem[selected="true"] { color: red !important; font-weight: bold !important; }\
      #tabCounter > menupopup > menuitem[pending="true"] { color: #FF6666 !important; font-style: italic !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) ); 
   
   
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout(count.timeout) } catch(e) {};
     count.timeout = window.setTimeout(()=> {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
        tabCounter.label = (all > visible ? visible + '/' : '') + all;
     }, 350);
   };
   count();


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs);
   addEventListener("TabClose", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(()=> getChangeTabGroup(), 50); 
         removeEventListener(e.type, c, false, tabs); 
      }, false, tabs);
   };
   getChangeTabGroup();
})();

bunda1
Тогда логично бы было, если есть хоть одна не прочитанная вкладка, сделать что бы и цифра в адресной строке менялась на соответствующий цвет.

bunda1
Отлично. Подумайте все же над древовидным отображением вкладок. Вот эта кнопка перехватывает древовидную структуру, но не маркирует элементы. Может у вас получится к ней маркировку прикрутить или наоборот, к своей кнопке прикрутить отображение дерева вкладок.

скрытый текст
http://s017.radikal.ru/i414/1610/c5/e986057bc9fe.png

Здравствуйте. Искал кнопку для вывода меню открытых вкладок, подсказали эту тему. Хороший вариант, единственное что мне не хватает - сортировки типа "история последних используемых вкладок" для быстрого перехода к недавним вкладкам. Т.е. прошлая вкладка будет первым пунктом, позапрошлая вторым, и так далее.

Древовидное отображение вкладок, думаю, не нужно. Для этого ведь есть расширение TreeStyleTab, им можно расположить вкладки слева или справа в древовидном виде, и настроить автоскрытие панели вкладок. А функционала меню вкладок с сортировкой по использованию не нашёл.

rsuan пишет:

Здравствуйте. Искал кнопку для вывода меню открытых вкладок, подсказали эту тему. Хороший вариант, единственное что мне не хватает - сортировки типа "история последних используемых вкладок" для быстрого перехода к недавним вкладкам. Т.е. прошлая вкладка будет первым пунктом, позапрошлая вторым, и так далее.

В меню вкладок первыми будут прочитанные в текущей сессии вкладки отсортированные по времени посещаемости остальные вкладки будут в том порядке как на панели вкладок:

Выделить код

Код:

// Показывать количество открытых табов в адресной строке, от 14.01.2017. ..................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel");
   tabCounter.setAttribute("id", "tabCounter");
   tabCounter.setAttribute("context", "event.stopPropagation()");
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore(tabCounter, urlbarIcons.firstChild);
   addDestructor(()=> tabCounter.remove() );


   // Отслеживать клик на счетчике ....
   tabCounter.onclick =e=> {
      if ( e.target.localName == "menuitem" ) return;

      tabCounter.textContent = ""; // удалить старое меню  
      
      // Создать массив с вкладками и сортировать по посещаемости
      var tabsArray = gBrowser.visibleTabs;
      tabsArray.sort((a, b)=> b.getAttribute('data') - a.getAttribute('data'));

      // создать новое меню всех вкладок текущей группы
      var array = ["label", "image", "selected", "unread", "pending"];
      var menu = tabCounter.appendChild(document.createElement("menupopup"));
      tabsArray.forEach(tab=> {
         var mItem = menu.appendChild(document.createElement("menuitem"));
         mItem.tab = tab;
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");      
         array.forEach(atrr=> mItem.setAttribute(atrr, tab.getAttribute(atrr)) );
      });
      
      // периодически запускать обновление меню
      menu.interval = setInterval(()=> menuReload(), 200);
      addEventListener("popuphidden", ()=> clearInterval(menu.interval), false, menu);
      
      // обновить меню
      function menuReload() {
         [...menu.children].forEach(el=> {
            array.forEach(atrr=> el.setAttribute(atrr, el.tab.getAttribute(atrr)) );
         })
      };      
      
      // автоматически закрывать меню при ухода курсора, длительность увода - 450 мс
      menu.onmouseover =()=> this.f = true;    
      menu.onmouseleave =()=> { this.f = false; setTimeout(()=> !this.f && menu.hidePopup(), 450) };
            
      // отслеживать клики на пунктах меню
      menu.onmouseup =e=> {
         e.preventDefault();

         var mItem = e.target, tab = mItem.tab;
         if ( e.button == 0 )
              gBrowser.selectedTab = tab;
         else
              {
              mItem.remove();
              gBrowser.removeTab(tab);
              }
         menuReload();
      };

      // фокус на активную вкладку в меню при открытии
      var box = document.getAnonymousElementByAttribute(menu, "class", "popup-internal-box");
      addEventListener("popupshowing", ()=> {
         var menuitem = [...menu.children].filter(el=> el.getAttribute("selected", "true") )[0];
         menuitem.setAttribute('_moz-menuactive', true);
         var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height/2;
         var boxCenter = box.boxObject.screenY + box.boxObject.height/2;  
         box.scrollByPixels(menuitemCenter - boxCenter);
      }, false, menu);            
      
      menu.showPopup(tabCounter, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabCounter:hover { color: #FF1493 !important; }\
      #tabCounter > menupopup scrollbox { overflow-y: auto !important; }\
      #tabCounter > menupopup > menuitem[unread="true"],\
      #tabCounter > menupopup > menuitem[pending="true"] { color: blue !important; }\
      #tabCounter { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
      #tabCounter > menupopup > menuitem[selected="true"] { color: red !important; font-weight: bold !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) ); 
   
   
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout(count.timeout) } catch(e) {};
     count.timeout = window.setTimeout(()=> {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
        tabCounter.label = (all > visible ? visible + '/' : '') + all;
     }, 350);
   };
   count();
   
   
   // Добавить к вкладке как аргумент время посещаемости вкладки ....
   addEventListener("TabSelect", (e, tab = e.target)=> { 
      tab.setAttribute('data', Date.now());
   }, true, gBrowser.tabContainer);


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs);
   addEventListener("TabClose", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(()=> getChangeTabGroup(), 50); 
         removeEventListener(e.type, c, false, tabs); 
      }, false, tabs);
   };
   getChangeTabGroup();
})();

rsuan
TreeStyle у меня стоит и именно для него это и нужно (как вы вообще представляете себе дерево без подобного расширения? :dumb: ), так как при свернутых в нем ветвях проблематично искать вкладку, приходится подводить курсор к каждому узлу и просматривать дочки в тултипе, а сплошной список вкладок в меню данной кнопки ни как не облегчает поиск среди сотни вкладок.

Приветствую. После выхода новой версии FF (51.0.1) у вас работает этот счетчик?
У меня сломался.. :(

ag4
Все работает. У Вас точно последняя исправленная версия CustomButtons?

toltec
Поставил отсюда http://custombuttons.sourceforge.net/forum/viewtopic.php?f=5&t=3743 и теперь работает.
Спасибо!

bunda1
Доброе утро а можно сделать что то похоже на это?
http://i.imgur.com/LJskY5G.png
показывает сколко слева и справа + общее колличество(18) и номер текущей вкладки(11).
это я сделал в https://addons.mozilla.org/ru/firefox/addon/tab-counter/?src=api
хотелось бы отказаться от расширение.

mahtanoronra пишет:

bunda1
Доброе утро а можно сделать что то похоже на это?
http://i.imgur.com/LJskY5G.png

Выделить код

Код:

// Показывать количество открытых табов в адресной строке, от 16.10.2016. ..................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel");
   tabCounter.setAttribute("id", "tabCounter");
   tabCounter.setAttribute("context", "event.stopPropagation()");
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore(tabCounter, urlbarIcons.firstChild);
   addDestructor(()=> tabCounter.remove() );


   // Отслеживать клик на счетчике ....
   tabCounter.onclick =e=> {
      if ( e.target.localName == "menuitem" ) return;

      tabCounter.textContent = ""; // удалить старое меню  
      
      // создать новое меню всех вкладок текущей группы
      var array = ["label", "image", "selected", "unread", "pending"];
      var menu = tabCounter.appendChild(document.createElement("menupopup"));
      gBrowser.visibleTabs.forEach(tab=> {
         var mItem = menu.appendChild(document.createElement("menuitem"));
         mItem.tab = tab;
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");      
         array.forEach(atrr=> mItem.setAttribute(atrr, tab.getAttribute(atrr)) );
      });
      
      // периодически запускать обновление меню
      menu.interval = setInterval(()=> menuReload(), 200);
      addEventListener("popuphidden", ()=> clearInterval(menu.interval), false, menu);
      
      // обновить меню
      function menuReload() {
         [...menu.children].forEach(el=> {
            array.forEach(atrr=> el.setAttribute(atrr, el.tab.getAttribute(atrr)) );
         })
      };      
      
      // автоматически закрывать меню при ухода курсора, длительность увода - 450 мс
      menu.onmouseover =()=> this.f = true;    
      menu.onmouseleave =()=> { this.f = false; setTimeout(()=> !this.f && menu.hidePopup(), 450) };
            
      // отслеживать клики на пунктах меню
      menu.onmouseup =e=> {
         e.preventDefault();

         var mItem = e.target, tab = mItem.tab;
         if ( e.button == 0 )
              gBrowser.selectedTab = tab;
         else
              {
              mItem.remove();
              gBrowser.removeTab(tab);
              }
         menuReload();
      };

      // фокус на активную вкладку в меню при открытии
      var box = document.getAnonymousElementByAttribute(menu, "class", "popup-internal-box");
      addEventListener("popupshowing", ()=> {
         var menuitem = [...menu.children].filter(el=> el.getAttribute("selected", "true") )[0];
         menuitem.setAttribute('_moz-menuactive', true);
         var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height/2;
         var boxCenter = box.boxObject.screenY + box.boxObject.height/2;  
         box.scrollByPixels(menuitemCenter - boxCenter);
      }, false, menu);            
      
      menu.showPopup(tabCounter, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabCounter:hover { color: #FF1493 !important; }\
      #tabCounter > menupopup scrollbox { overflow-y: auto !important; }\
      #tabCounter > menupopup > menuitem[unread="true"],\
      #tabCounter > menupopup > menuitem[pending="true"] { color: blue !important; }\
      #tabCounter { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
      #tabCounter > menupopup > menuitem[selected="true"] { color: red !important; font-weight: bold !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) ); 
   
   
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout(count.timeout) } catch(e) {};
     count.timeout = window.setTimeout(()=> {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length, num = gBrowser.mCurrentTab._tPos; 
        tabCounter.label = num + "(" + (num+1) + " из " + ((all > visible ? visible + '/' : '') + all) + ")" + (visible-num);
     }, 350);
   };
   count();


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs);
   addEventListener("TabClose", count, false, tabs);
   addEventListener("TabSelect", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(()=> getChangeTabGroup(), 50); 
         removeEventListener(e.type, c, false, tabs); 
      }, false, tabs);
   };
   getChangeTabGroup();
})();

Обновил на версию 52.2.1 esr (была 45.9 esr), счётчик в адресной строке пропал. Код использую крайний.

Ребята, а можете достать из этого кода только счетчик открытых вкладок и все, в виде кнопки?

bunda1, сделай, пожалуйста, версию, которая просто показывает общее число вкладок в окне без дробей, без подразделения на группы.

becool пишет:

bunda1, сделай, пожалуйста, версию, которая просто показывает общее число вкладок в окне без дробей, без подразделения на группы.

Выделить код

Код:

// Показывать количество открытых табов в адресной строке, от 16.10.2016. ..................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("statusbarpanel");
   tabCounter.setAttribute("id", "tabCounter");
   tabCounter.setAttribute("context", "event.stopPropagation()");
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   var urlbarIcons = document.getElementById("urlbar-icons"); 
   urlbarIcons.insertBefore(tabCounter, urlbarIcons.firstChild);
   addDestructor(()=> tabCounter.remove() );


   // Отслеживать клик на счетчике ....
   tabCounter.onclick =e=> {
      if ( e.target.localName == "menuitem" ) return;

      tabCounter.textContent = ""; // удалить старое меню  
      
      // создать новое меню всех вкладок текущей группы
      var array = ["label", "image", "selected", "unread", "pending"];
      var menu = tabCounter.appendChild(document.createElement("menupopup"));
      [...gBrowser.tabs].forEach(tab=> {
         var mItem = menu.appendChild(document.createElement("menuitem"));
         mItem.tab = tab;
         mItem.setAttribute("class", "menuitem-iconic bookmark-item");      
         array.forEach(atrr=> mItem.setAttribute(atrr, tab.getAttribute(atrr)) );
      });
      
      // периодически запускать обновление меню
      menu.interval = setInterval(()=> menuReload(), 200);
      addEventListener("popuphidden", ()=> clearInterval(menu.interval), false, menu);
      
      // обновить меню
      function menuReload() {
         [...menu.children].forEach(el=> {
            array.forEach(atrr=> el.setAttribute(atrr, el.tab.getAttribute(atrr)) );
         })
      };      
      
      // автоматически закрывать меню при ухода курсора, длительность увода - 450 мс
      menu.onmouseover =()=> this.f = true;    
      menu.onmouseleave =()=> { this.f = false; setTimeout(()=> !this.f && menu.hidePopup(), 450) };
            
      // отслеживать клики на пунктах меню
      menu.onmouseup =e=> {
         e.preventDefault();

         var mItem = e.target, tab = mItem.tab;
         if ( e.button == 0 )
              gBrowser.selectedTab = tab;
         else
              {
              mItem.remove();
              gBrowser.removeTab(tab);
              }
         menuReload();
      };

      // фокус на активную вкладку в меню при открытии
      var box = document.getAnonymousElementByAttribute(menu, "class", "popup-internal-box");
      addEventListener("popupshowing", ()=> {
         var menuitem = [...menu.children].filter(el=> el.getAttribute("selected", "true") )[0];
         menuitem.setAttribute('_moz-menuactive', true);
         var menuitemCenter = menuitem.boxObject.screenY + menuitem.boxObject.height/2;
         var boxCenter = box.boxObject.screenY + box.boxObject.height/2;  
         box.scrollByPixels(menuitemCenter - boxCenter);
      }, false, menu);            
      
      menu.showPopup(tabCounter, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabCounter:hover { color: #FF1493 !important; }\
      #tabCounter > menupopup scrollbox { overflow-y: auto !important; }\
      #tabCounter > menupopup > menuitem[unread="true"],\
      #tabCounter > menupopup > menuitem[pending="true"] { color: blue !important; }\
      #tabCounter { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
      #tabCounter > menupopup > menuitem[selected="true"] { color: red !important; font-weight: bold !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) ); 
   
   
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout(count.timeout) } catch(e) {};
     count.timeout = window.setTimeout(()=> {
        tabCounter.label = gBrowser.tabs.length;
     }, 350);
   };
   count();


   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs);
   addEventListener("TabClose", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(()=> getChangeTabGroup(), 50); 
         removeEventListener(e.type, c, false, tabs); 
      }, false, tabs);
   };
   getChangeTabGroup();
})();

http://www.kolobok.us/smiles/big_standart/good2.gif
Премного благодарен!

На 57 не работает, можно поправить

broker пишет:

На 57 не работает, можно поправить

А у тебя Сustom Buttons на Firefox 57 вообще работает?

bunda1

А у тебя Сustom Buttons на Firefox 57 вообще работает?

Да! В теме Сustom Buttons  Infocatcher и Dumby поделились "распорками" "костылями" все работает:D .Со всех кнопок не работают кнопки: папка загрузки,Кнопка для управления масштабом страницы в адресной строке,Показывать потребление памяти в адресной строке,Показывать количество открытых табов в адресной строке.
Думал так и останусь на 48 но не все так страшно.Save+ Работает обновил кнопку все пучком:cool: