Открыть все закладки из одного сайта( Firefox 24 + )
Автор: bunda1
Версия: от 03.08.2016.
Описание: Kод добавляет в контекстное меню закладок новый пункт Открыть все закладки из одного сайта который открывает все закладки, из всех папок закладок, сайт которых совпадает с сайтом выделенный закладки. Код по умолчанию открывает закладки не загружая страниц но в настройках в начале кода можно переключить на открытие закладок с загрузкой страниц. Также в настройках кода можно включить удаление открываемых закладок, эта полезно если нужно перенести закладки в другую папку. Удаление закладок надо подтвердить кликом на сплывающую подсказку.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Открыть все закладки из одного сайта, от 03.08.2016. ..................
(()=> {
   var deletePlaces = false;   // удалять закладки 
   var notLoading = true;      // открывать закладки не загружая страниц
   var showAlert = false;      // показать в сообщение количество открытых закладок
   var maxOpenBook = 30;       // максимальное количество одновременно открываемых закладок

   var library = "chrome://browser/content/places/places.xul";
   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);  


   // Создать новый пункт в контекстном меню закладок ....
   function setMenuitem(doc) {
      var sep = doc.getElementById("placesContext_openSeparator");
      var con = doc.getElementById('placesContext');
      var mItem = con.insertBefore(document.createElement("menuitem"), sep);
      mItem.setAttribute("label", "Открыть все закладки из одного сайта");
      //mItem.setAttribute("class", "menuitem-iconic");
      //mItem.setAttribute("src", "chrome://custombuttons/skin/stdicons/rbutton.png");
      mItem.setAttribute("selectiontype", "any");
      mItem.setAttribute("hideifnoinsertionpoint", "true");
      mItem.onclick =()=> openPlaces(doc, mItem);
      addDestructor(()=> mItem.remove());
   };
   setMenuitem(document);
   
   
   // Открыть все закладки домен которых совпадает с доменом выделенный закладки ....
   function openPlaces(doc, mItem) {
      var node = PlacesUIUtils.getViewForNode(doc.popupNode).selectedNode;
      var domain = getDomain(node.uri);
      var array = [];

      // получить массив с данными о закладках домен которых совпадает с доменом выделенный закладки
      function chooseBookmarks(id = 1) {
         var folder = PlacesUtils.getFolderContents(id).root;

         folder.QueryInterface(Ci.nsINavHistoryContainerResultNode);
         folder.containerOpen = true;

         for ( var i = 0; i < folder.childCount; i++ ) {
               var child = folder.getChild(i), uri = child.uri;
   
               PlacesUtils.nodeIsFolder(child)
               ? chooseBookmarks(child.itemId)
               : uri.startsWith("http") && getDomain(uri) == domain && array.push(child);
               }
                       
         folder.containerOpen = false;
      }
      chooseBookmarks();

      // через подтверждение удалить все закладки id которых находится в массиве
      deletePlaces && alertsService.showAlertNotification(mItem.getAttribute('src') || self.image, "Кликни чтобы удалить все " + array.length + " закладки сайта закладки!", domain, true, "", (s, t)=> { 
         t == 'alertclickcallback' && array.forEach(m=> PlacesUtils.bookmarks.removeItem(m.itemId));
      }, "");
      
      // открыть закладки из массива в вкладках, с паузами если закладок очень много
      function f() {
         for ( var i = 0; i < array.length; ++i ) {
               var {uri, title, icon} = array[i];    
               
               // добавить вкладку с указанными данными не загружая страницу
               if ( notLoading ) {
                   var tab = gBrowser.addTab();
                   var ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
                   ss.setTabState(tab, JSON.stringify({entries: [{ url: uri, title: (!title ? uri : title)}], lastAccessed: 0, index: 1, hidden: false, attributes: {} }));
                   icon && tab.setAttribute("image", icon);
                   }
               else 
                   gBrowser.addTab(uri); // добавить вкладку загружая страницу

               // пауза в цикле через установленное количество циклов 
               if ( i && i % maxOpenBook == 0 ) {
                    setTimeout(()=> gen.next(), 150);
                    yield 0;
                    }
               
               // всплывающая подсказка показывает количество открытых закладок    
               if ( showAlert && !deletePlaces && array.length == i+1 && i > maxOpenBook )
                    alertsService.showAlertNotification(mItem.getAttribute('src') || self.image, "Открыл " + array.length + " закладки", null);
               }
               yield 0;
      }
      var gen = f();
      gen.next(); 
   };
   
   
   // Получить домен из адреса ....
   function getDomain(uri) { 
      try { return Services.eTLD.getBaseDomain(Services.io.newURI(uri, null, null)) } 
      catch(e) { return "" };
   };


   // Наблюдатель следит за открытием библиотеки в окне и добавляет там новый пункт в контекстном меню закладок ....
   function observer(subject) {
      subject.addEventListener("load", (e, doc = e.target)=> {
         doc.URL == library && setMenuitem(doc);
      });
   };
   Services.ww.registerNotification(observer);
   addDestructor(()=> Services.ww.unregisterNotification(observer) );


   // Обработчик следит за открытием библиотеки в вкладке и добавляет там новый пункт в контекстном меню закладок ....
   addEventListener("DOMContentLoaded", (e, doc = e.target)=> {
      doc.location == library && !doc.hidden && setMenuitem(doc);
   }, false, gBrowser);
})();
bunda1 пишет

Kод добавляет в контекстное меню закладок новый пункт Открыть все закладки из одного сайта

Добрый день. Установил кнопку всё работает корректно , открывает все закладки из одного сайта. Но есть небольшая проблема , закладки вызывает но не загружает, пока не откроешь вкладку. Очень похоже на режим " Не загружать без запроса ". Как сделать загрузку открываемых закладок сразу после команды "Открыть все закладки из одного сайта". Заранее спасибо.

Duche пишет

Как сделать загрузку открываемых закладок сразу после команды "Открыть все закладки из одного сайта".

В вначале кода в:

Выделить код

Код:

var notLoading = true;      // открывать закладки не загружая страниц

Измени true на false

bunda1 пишет

Измени true на false

Отлично . Спасибо за работу!