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

Скриншот:
8d82a05862ef7b24b5547a28ed51fdd1.png

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

Выделить код

Код:

// Показывать количество открытых табов в адресной строке, от 10.05.2019. ..................
(()=> {  
   // Создать в адресной строке счётчик вкладок ....
   var tabCounter = document.createElement("toolbarbutton");
   tabCounter.setAttribute("id", "tabCounter");
   tabCounter.setAttribute("context", "event.stopPropagation()");
   tabCounter.setAttribute("tooltiptext", "Показать меню всех вкладок"); 
   var urlbarIcons = document.getElementById("page-action-buttons"); 
   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.openPopup(tabCounter, "after_start")           
   };


   // Css стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      /* Стиль для кнопки */\
      #tabCounter:hover { color: #FF1493 !important; }\
      /* Стиль добавляет текст на кнопку */\
      #tabCounter .toolbarbutton-icon { display: none !important; }\
      #tabCounter .toolbarbutton-text { display: -moz-box !important; }\
      #tabCounter { -moz-box-orient: horizontal !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 умеет выводить количество открытых табов в текущей группе по отношению к общему числу табов (во всех группах)
b32i.png
и при этом этот набор чисел объединяется с кнопкой меню "Список всех вкладок", при нажатии на которую выпадает список вкладок в активной группе
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.
Описание: Код создаёт кнопку в адресной строке которая показывает количество всех открытых табов и количество открытых табов текущей группы вкладок. Кнопка открывает меню со списком вкладок текущей группы, в меню название текущей вкладки отображается красным цветом а не прочитанные вкладки синим цветом. Меню вкладок даёт возможность левым кликом переключится на нужную вкладку и правым кликом удалять вкладки не закрывая меню. Меню вкладок автоматически закрывается при уводе курсора, длительность увода можно установить в коде.

Скриншот:
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 трудно различить на некоторых сайтах.
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;
}

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?

скрытый текст
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
Отлично. Подумайте все же над древовидным отображением вкладок. Вот эта кнопка перехватывает древовидную структуру, но не маркирует элементы. Может у вас получится к ней маркировку прикрутить или наоборот, к своей кнопке прикрутить отображение дерева вкладок.

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

mahtanoronra пишет

bunda1
Доброе утро а можно сделать что то похоже на это?
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();
})();

good2.gif
Премного благодарен!

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

broker пишет

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

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

bunda1

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

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

broker пишет

Показывать потребление памяти в адресной строке

Мне помогли починить её на руборде, спасибо gyra и другим пользователям... Только с положением её относительно остальных элементов в урл не так всё просто:

скрытый текст
jplxlrvzez7tgmppmrw9xuszfyw.png

Сдвинуть бы относительно других элементов... Сама она двигается изменением стиля, например
скрытый текст

Выделить код

Код:

margin-right: -8px !important;
  margin-top: 2px !important;


Но при этом попадает под те элементы, которые там в урл находятся.

Оригинал самой кнопки (той, которой у меня) я на форуме найти не могу. :angel:
Если надо — могу выслать свой вариант. Цвет, шрифт и действия по нажатиям на счётчик подстроите под себя.

Исправил Показывать количество открытых табов в адресной строке для Firefox 57.

Coroner

Мне помогли починить её на руборде, спасибо gyra и другим пользователям... Только с положением её относительно остальных элементов в урл не так всё просто:

Поделитесь кнопкой, Спасибо.

broker
У меня нормально заработала (в FF 58) Memory Monitor( Firefox 45+ ) после замены var urlbarIcons = document.getElementById("urlbar-icons"); на var urlbarIcons = document.getElementById("page-action-buttons");

adidharma
Я уже нашел кнопку. но все равно спасибо.

adidharma пишет

broker
У меня нормально заработала (в FF 58) Memory Monitor( Firefox 45+ ) после замены var urlbarIcons = document.getElementById("urlbar-icons"); на var urlbarIcons = document.getElementById("page-action-buttons");

Хорошо, спасибо.

adidharma пишет

У меня нормально заработала (в FF 58) Memory Monitor( Firefox 45+ ) после замены var urlbarIcons = document.getElementById("urlbar-icons"); на var urlbarIcons = document.getElementById("page-action-buttons");

Заработать-то заработала, только вот показывает непонятно что. Если сложить память всех процессов [firefox] в Диспетчере задач и сравнить с тем, что выдаёт кнопка - разница приличная. Я, возможно, что-то неправильно понимаю :blush:

19727696_s.png

Viatcheslav пишет

Заработать-то заработала, только вот показывает непонятно что.

Да, это я не учёл - проверял с отключенной e10s. С включённой и правда ерунда получается. :sick: Но тут уже саму кнопку надо переделывать, насколько понимаю?

скрытый текст
Печально с этой e10s...:( Некоторые кнопки перестали работать - Копировать ссылку(BBCode)+*, Текстовые смайлы и Вставка символа в текстовое поле. Может, кому встречались фиксы? По форуму поискал - что-то ничего не нашёл, а самостоятельно поправить не получается (есть похожие рабочие кнопки - Link  Master (Context menu) и BB Code Menu)

* Эта не работает и при откл. мультипроцессности.

Viatcheslav,adidharma
Господа, для меня счетчик несет чисто символически значение, у меня прописано если больше 600mb запускается afom и сбрасывает память. Тормозов особо то не заметил, было много споров насчет эффективности, но для себя решил так как у меня ram 3gb а мозилка на некоторых сайтах прожорлива, то пусть держит в тонусе.

broker пишет

у меня прописано если больше 600mb запускается afom и сбрасывает память

Если можно, в этом месте, пожалуйста, подробнее - где прописано и чем сбрасывает? Спасибо

Viatcheslav
Вот сам код когда то на мою просьбу bunda1 написал за что спасибо большое. В css поправите для себя, Afom положите в папку Soft в профиле ее надо создать.

скрытый текст

Выделить код

Код:

var memoryDisplay = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("page-action-buttons");
   urlbarIcons.insertBefore( memoryDisplay, urlbarIcons.lastChild ); // перед первой иконкой адресной строки
            
   memoryDisplay.id = "memoryDisplay";
   memoryDisplay.label = getMemory() + ' MB';
   memoryDisplay.style.cssText = "-moz-appearance: none; border: 0; padding: 0; margin-right:-6px; margin-left: -1px;"; // Css стиль для счётчика
     self.timer = setInterval(function() {
     var memory = getMemory();
      memoryDisplay.label = memory + ' MB';
      if ( memory > 600 ) {
           var file= Components.classes["@mozilla.org/file/directory_service;1"].
  getService(Components.interfaces.nsIProperties).
  get("ProfD", Components.interfaces.nsIFile);
           file.initWithPath(file.path + "\\Soft\\afom.exe"); 
           file.launch();
           }
   }, 2000 ); 
     
   // Всплывающая подсказка у счётчика отображает заполнение дискового кеша......................................
   var k = 100, mb = 1024 * 1024, str = "",
   cs = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService),
   visitor = { visitDevice: addInfo };

   function addInfo(device, info) {
      str += (str ? "\n" : "") + device[0].toUpperCase() + device.slice(1) + " Cache:  " +
      [info.totalSize, info.maximumSize].map(function(num) Math.round(k * num / mb) / k + " MB").join(" / ");
   };

   memoryDisplay.onmouseenter = function() {
     str = "";
     cs.visitEntries(visitor);
     memoryDisplay.tooltipText = "Л: Подробно показать потребление памяти в вкладке"  + "\n\n" + str;
   };
   
   
   ///////////// Получить всю занимаемую оперативную память в MB .............................................////////////
   function getMemory() {            
      var reporterManager = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
      try {
          var e = reporterManager.enumerateReporters();
          while ( e.hasMoreElements() ) {
                  var mr = e.getNext().QueryInterface(Ci.nsIMemoryReporter);
                  self[mr.path] = mr;
                  }
          var memory = self["resident"].amount;
          } 
      catch(e) { var memory = reporterManager.resident; } // FF26 - Nightly
      
      return ( Math.round( memory/1048576 ) );
   };      
   
   
   // По клику подробно показать потребление памяти в вкладке, автор кода 'Dumby' .........................
   memoryDisplay.onclick = function(e) {
      if ( e.button ) return;
       var memoryTab = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("about:memory") ); 
          
       // oбработчик ждет пока откроется "about:memory", удаляет себя и нажимает кнопку на странице
       memoryTab.addEventListener("pageshow", function c(e) {         
          this.removeEventListener( e.type, c );           

          setTimeout(function() { try { e.originalTarget.getElementById('measureButton').click() } catch(e) {} }, 0);      
       });  
   };
   
   
   // Удалять счётчик памяти и другие изменения ............................................................
   addDestructor(function() { 
      urlbarIcons.removeChild( memoryDisplay )
      try { window.clearTimeout( self.timer ) } catch(e) {};
   });


здесь лежит http://rgho.st/6TbY4J2Kx Afom.exe возможно будет ругаться антивирус! оно выдрано с расширения не помню как называлось. Напомню то не панацея но если RAM мало можно попробовать.

broker, спасибо ПРЕБОЛЬШОЕ ;) Хочу уточнить - этот код

broker пишет

скрытый текст

Выделить код

Код:

var memoryDisplay = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("page-action-buttons");
   urlbarIcons.insertBefore( memoryDisplay, urlbarIcons.lastChild ); // перед первой иконкой адресной строки
            
   memoryDisplay.id = "memoryDisplay";
   memoryDisplay.label = getMemory() + ' MB';
   memoryDisplay.style.cssText = "-moz-appearance: none; border: 0; padding: 0; margin-right:-6px; margin-left: -1px;"; // Css стиль для счётчика
     self.timer = setInterval(function() {
     var memory = getMemory();
      memoryDisplay.label = memory + ' MB';
      if ( memory > 600 ) {
           var file= Components.classes["@mozilla.org/file/directory_service;1"].
  getService(Components.interfaces.nsIProperties).
  get("ProfD", Components.interfaces.nsIFile);
           file.initWithPath(file.path + "\\Soft\\afom.exe"); 
           file.launch();
           }
   }, 2000 ); 
     
   // Всплывающая подсказка у счётчика отображает заполнение дискового кеша......................................
   var k = 100, mb = 1024 * 1024, str = "",
   cs = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService),
   visitor = { visitDevice: addInfo };

   function addInfo(device, info) {
      str += (str ? "\n" : "") + device[0].toUpperCase() + device.slice(1) + " Cache:  " +
      [info.totalSize, info.maximumSize].map(function(num) Math.round(k * num / mb) / k + " MB").join(" / ");
   };

   memoryDisplay.onmouseenter = function() {
     str = "";
     cs.visitEntries(visitor);
     memoryDisplay.tooltipText = "Л: Подробно показать потребление памяти в вкладке"  + "\n\n" + str;
   };
   
   
   ///////////// Получить всю занимаемую оперативную память в MB .............................................////////////
   function getMemory() {            
      var reporterManager = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
      try {
          var e = reporterManager.enumerateReporters();
          while ( e.hasMoreElements() ) {
                  var mr = e.getNext().QueryInterface(Ci.nsIMemoryReporter);
                  self[mr.path] = mr;
                  }
          var memory = self["resident"].amount;
          } 
      catch(e) { var memory = reporterManager.resident; } // FF26 - Nightly
      
      return ( Math.round( memory/1048576 ) );
   };      
   
   
   // По клику подробно показать потребление памяти в вкладке, автор кода 'Dumby' .........................
   memoryDisplay.onclick = function(e) {
      if ( e.button ) return;
       var memoryTab = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("about:memory") ); 
          
       // oбработчик ждет пока откроется "about:memory", удаляет себя и нажимает кнопку на странице
       memoryTab.addEventListener("pageshow", function c(e) {         
          this.removeEventListener( e.type, c );           

          setTimeout(function() { try { e.originalTarget.getElementById('measureButton').click() } catch(e) {} }, 0);      
       });  
   };
   
   
   // Удалять счётчик памяти и другие изменения ............................................................
   addDestructor(function() { 
      urlbarIcons.removeChild( memoryDisplay )
      try { window.clearTimeout( self.timer ) } catch(e) {};
   });

для Custom Buttons, или его прописать в userChrome.css?

Viatcheslav
Код для Custom Buttons, найдите строку "memoryDisplay.style.cssText" ето и есть сss стиль для счётчика там поправите для себя.

broker пишет

оно выдрано с расширения не помню как называлось.

afom.exe выдран из Обсуждение расширений » AFOM :)
Пишут что аналогично config.trim_on_minimize=true

Coroner
Да точно, давно было дело.

broker пишет

Да точно, давно было дело.

Не совсем по теме, но коли разговор зашёл... Не пробовали Tab Suspender (memory saver) ?
По логике оно должно бы память экономить, но вот эффекта я что-то не замечаю.

Coroner пишет

Не пробовали Tab Suspender (memory saver) ?

Нет, я пользуюсь только Afom дисковый кеш вырубил, SSD жалко остальное в память. Если открыть браузер и почитать новости, почту проверить  кушает около 470мб, а вот ютуб и несколько форумов до 900мб получается. Afom не позволяет отжырать сколько, Вы попробуйте и будет видно так счетчик постоянно мониторить потребление памяти.

broker пишет

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

Я пробовал когда-то. Но видимо из-за старого железа (отсутствия SSD) "восстановление" сброшенной памяти происходит довольно медленно, в результате работа с браузером замедляется больше, чем плюнуть на это и пусть ест сколько хочет (всё равно больше 800 не ест).
Попробую сейчас на 57. Кстати, у меня точно такой же файл :) Думал может версия другая.

Народ есть кнопка которая работает на последней esr? Привык уже до боли.

На 66 работало, на 66.03 работает некорректно

скрытый текст

Выделить код

Код:

/*Initialization Code*/


// Показывать количество открытых табов в адресной строке +, от 27.11.2017. ................................
(function () {  
 
//var tabCounter=this.id;
//var urlbar = document.getElementById("page-action-buttons");
var button = document.getElementById("tabCounter");   
        
 self.onclick = function(e) {
  
  if ( e.button == 0 ) return PanelUI.showSubView('allTabsMenu-allTabsView', this);
 };
   // Стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
            %button% { -moz-appearance: none !important; border: 0 !important; margin-right: -4px !important; }\
            %button% {color: #4800FF !important;}\
            %button% .toolbarbutton-icon {width: -0px !important; background-color: RGB(235, 226 ,210) !important}\
            %button% .toolbarbutton-text {\
      display: -moz-box !important; margin-left: -8px !important; color: #4800FF !important; font-weight: bold !important;\
   }\
      %button% {\
     -moz-box-orient: horizontal !important;\
   }\
   '.replace(/%button%/g, "#" + _id) ));
   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() {
     try { window.clearTimeout( tabTimeout ) } catch(e) {};
     tabTimeout = window.setTimeout(function() {
        var all = gBrowser.tabs.length, visible = gBrowser.visibleTabs.length; 
      // self.label = ( all > visible ? gBrowser.visibleTabs.length + '/' : '' ) + all;
      self.label = 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();
   
})()


Помогите исправить

Поправьте пож-та кнопку для 60+

SanchiZ пишет

Поправьте пож-та кнопку для 60+

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

10-05-2019 17:29:37

Andrey_Krropotkin пишет

На 66 работало, на 66.03 работает некорректно

:/

Выделить код

Код:

// Показывать количество открытых табов в адресной строке +, от 10.05.2019. ................................
(function () {  

   self.onclick = function(e) {  
      if ( e.button == 0 ) return PanelUI.showSubView('allTabsMenu-allTabsView', this);
   };

   // Стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
            %button% { -moz-appearance: none !important; border: 0 !important; margin-right: -4px !important; }\
            %button% {color: #4800FF !important;}\
            %button% .toolbarbutton-icon {width: -0px !important; background-color: RGB(235, 226 ,210) !important}\
            %button% .toolbarbutton-text {\
      display: -moz-box !important; margin-left: -8px !important; color: #4800FF !important; font-weight: bold !important;\
   }\
      %button% {\
     -moz-box-orient: horizontal !important;\
   }\
   '.replace(/%button%/g, "#" + _id) ));
   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() {
     try { window.clearTimeout( tabTimeout ) } catch(e) {};
     tabTimeout = window.setTimeout(function() {
        self.label = gBrowser.visibleTabs.length;
     }, 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();
   
})()