"Не закрывать вкладку" в контекстном меню вкладки( SeaMonkey )
Автор: bunda1
Версия: от 21.05.2019.
Описание: добавляет новый пункт Не закрывать эту вкладку в контекстное меню вкладки, который блокирует закрытие вкладки и меняет стиль названия вкладки.

Скриншот:
f4dbde1bb688b9a9a88f0df82f8c40b6.jpg

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

Выделить код

Код:

// "Не закрывать эту вкладку" в контекстном меню вкладки SeaMonkey, от 21.05.2019. ................
(()=> {
   
   if ( this.hasAttribute("initialized") ) return;

   // Создать новый пункт меню ....               
   var menuitem = document.createElement("menuitem");
   menuitem.setAttribute("type", "checkbox");
   menuitem.setAttribute("label", "Не закрывать вкладку");
   menuitem.onclick =()=> {
     var tab = document.popupNode;
     tab.hasAttribute("tabProtect") ? tab.removeAttribute("tabProtect") : tab.setAttribute("tabProtect", true);
   };
   addDestructor(()=> menuitem.remove());
   
   
   // Добавить новый пункт меню в контекстного меню вкладки ....      
   addEventListener("popupshowing", (e, targ = e.originalTarget)=> {
      if (targ.getAttribute('anonid') != 'tabContextMenu') return;
      targ.insertBefore(menuitem, targ.children[2]); // перед вторым пунктом контекстного меню

      var tab = targ.triggerNode;
      menuitem.hidden = !tab.linkedBrowser.currentURI.scheme.startsWith("http");             
   }); 


   // Стиль для защищённой вкладки ....
   var str = '\
      .tabbrowser-tab[tabProtect="true"] {\
         color: blue !important;\
         font-style: italic !important;\
   }';
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   var uri = makeURI("data:text/css," + encodeURIComponent(str));
   sss.loadAndRegisterSheet(uri, 0);     
   addDestructor(()=> sss.unregisterSheet(uri, 0));
 
 
   // Запретить закрывать защищенные вкладки изменив внутреннюю функцию Firefox ....
   var
      src = "gBrowser.removeTab = " + gBrowser.removeTab.toString(),
      str = '{\n\n if (aTab.hasAttribute("tabProtect")) return;',
      res = src.replace("{", str);
   eval(res);
   addDestructor(()=> eval(src));


   // Восстанавливать атрибут для защищённой вкладки после старта браузера ....
   Cc["@mozilla.org/suite/sessionstore;1"].getService(Ci.nsISessionStore).persistTabAttribute("tabProtect");

})();

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

iDev.Pi пишет

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

Например пооткрывает человек кучу вкладок и некоторые заблокирует и потом сможет спокойно все лишние закрыть одним жестом или кликом.
Кстати закрепление вкладки даёт похожую возможность но лично мне не удобно что вкладка уезжает куда то.

bunda1 Попробовал твою кнопку. Вот что обнаружил:
1. При перезагрузке браузера, если открыты несколько вкладок, то все, кроме активной будут заблокированы.
2. Еще одна мелочь - в контекстном меню вкладки появляется два пункта "Не закрывать вкладку", не смертельно - легко устраняется.
И вопрос: Как перенести кнопку блокировки вправо (вместо стандартного крестика)?

Andrey_Krropotkin
Да после обновления FF22 на FF23 многое поломалась. Буду исправлять.

bunda1
Если заблокировать вкладку, затем прикрепить ее, тогда вкладку можно закрыть.

Northtech
Да кнопка глючная попробую завтра исправить.

обнова будет?:blush:

Исправил "Не закрывать вкладку" в контекстном меню вкладки для FF42+