Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№157604-10-2016 08:50:13

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4780
UA: Firefox 24.0

Re: Обсуждение кнопок CB

voqabuhe пишет:

bunda1
А как бы самому задать путь создания папок?

Это как?

Отсутствует

 

№157704-10-2016 12:31:03

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2447
UA: Firefox 52.0

Re: Обсуждение кнопок CB

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

Отсутствует

 

№157804-10-2016 21:35:06

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4780
UA: Firefox 24.0

Re: Обсуждение кнопок CB

voqabuhe пишет:

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAEFBwcD5TTywYtQTQHAAAAAAECAgAAAAABAgEDAAAAACZKJaoakiP/K4A0ywIAAAIBAQAAAAAAAAAAAAAAAQEBAQAAAAwaIj8ZrvD9GLr382eet7eKfnt7SkI9PBgQCg4CAAUAJGYouiDSL/87r0DbCgMABwAAAQACAgICAAAAAQMDBAAXFRYjGh8mahGR2O8fx///Ic3//obh/P+s2PD/W7HZ6CKe4NcvmWr7Ercb/0+6P++PTBBXCwUAAwAAAQAAAAAABQYHAxodHzcaFBdLDHrD3ifN//8oxvf6Hsb/+xeLff0FjED/DqRQ/x+hM/8KkhX/Qb1J+nS3UOtUoUjRNHg9vw0NDgEjIiUUIBMRHBstN0sep9/pLNH//y/O+v430v//E3pB/xClAP440zf9Ps1I/zekQv9EpE7/S79j/2jQeP9dpmL/DQ0OAR4jJxAfZoJ2I73u7i/T//8y0Pz+NdT8/zrX//8yp4r/O7ps/2jXlP9/5Iz/YdRr/2KoZf51mWP/Y4JY6ERbR70AAAAAGmV6ckbo//9D5v7+ONf+/jbV/P482f3/P9z9/0Df//9x4/7/fuP//2rTm/903Hj/Zp1f++q7jP+XelyoAAAAAAEBAQEAAQEBECQkITR8h3tJx+DZTN///0Hd/P5D4P3/YOf8/670/P+l8///asiV/3fKev9xnG7778qc/5yDY6gAAAAAAAAAAAAAAAAAAQEBAAAAAAAGBwA0oMfGTOn//4fs/PzN+P//l/D8/7T8//96u5//ZZVl/4Ocfvv84Lz/nIRkqAAAAAAAAAAAAAAAAAECAgIBBgcIAAAAAESAm6Jv5///1vv9++38///u+Pr/3PDz/+Di2v/j1rr/6Ne8+//v0P+ei3KoAAAAAAAAAAAAAAAAAAAAAAIDAwMAAAAAiJiho2zT///L9/z7+f3+//77+v/u7O7/7+Ta///qzP/35Mn7//PX/6KUgagAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACuqKWijdv//87t+Pv/////+fv7/+zu8P/t5dz//OrQ//np0fv/+d//o5eGqAAAAAAAAAAAAAAAAAAAAAADAwMEAAAAAKampaL/////+vr6+////v/8/Pv/7e7v/+/n3v//79f//O3Y+//+6P+kmoqoAAAAAAAAAAAAAAAAAAAAAAMDAwQAAAAApKSkoP/////4+fj5/f39/v39/f7z9Pb/8Oni///z4P/88eD7///y/6SdkKgAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACrq6ui//////v7+/v///////////7///728ez8+vHi/Prz5fn///n/pJ6VpwAAAAAAAAAAAAAAAAAAAAACAgIDAAAAAF5eXlrGxsXE0tLS0erq6un6+vr5////////////////+/v4+/////+opZ2oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwICExMTEisrKylHR0dFaGdnZYmKi4inpqam19TP2pGOiI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0423%u043A%u0430%u0436%u0438%u0442%u0435%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0434%u043B%u044F%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0438%20%u043F%u043E%u0434%u043F%u0430%u043F%u043E%u043A%20%u0441%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u043D%u044B%u043C%u0438%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u043C%u0438%20..........%0Avar%20parentFolderName%20%3D%20%22%22%3B%0A%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%0Athis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20var%20parentFolderId%20%3D%20%28parentFolderName%20%3D%3D%20%22%22%29%20%3F%203%20%3A%20getBookFolderId%28parentFolderName%29%3B%0A%20%20%20var%20folderName%20%3D%20new%20Date%28%29.toLocaleFormat%28%22%25d.%25m.%25Y%20%25H%3A%25M%3A%25S%22%29%3B%20%20%20%20%20%0A%20%20%20PlacesUtils.bookmarks.createFolder%28parentFolderId%2C%20folderName%2C%20-1%29%3B%0A%0A%20%20%20var%20folderId%20%3D%20getBookFolderId%28folderName%29%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20getTabsInfo%28%29.forEach%28m%3D%3E%20%0A%20%20%20%20%20%20PlacesUtils.bookmarks.insertBookmark%28folderId%2C%20m.uri%2C%20-1%2C%20m.label%29%29%3B%0A%0A%20%20%20var%20parentFolder%20%3D%20%28parentFolderId%20%3D%3D%203%29%20%3F%20%22%u041F%u0430%u043D%u0435%u043B%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%22%20%3A%20parentFolderName%3B%0A%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20.showAlertNotification%28self.image%2C%20self.label%2C%20%22%u0414%u043E%u0431%u0430%u0432%u0438%u043B%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3A%20%22%20+%20parentFolder%20+%20%22%20%3E%20%22%20+%20folderName%29%3B%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20id%20%u043F%u0430%u043F%u043A%u0438%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20..........%20%0Afunction%20getBookFolderId%28folderName%2C%20id%20%3D%201%29%20%7B%0A%20%20%20var%20folder%20%3D%20PlacesUtils.getFolderContents%28id%29.root%3B%0A%0A%20%20%20for%20%28%20var%20i%20%3D%200%3B%20i%20%3C%20folder.childCount%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20child%20%3D%20folder.getChild%28i%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20%21PlacesUtils.nodeIsFolder%28child%29%20%29%20continue%3B%20%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20child.title%20%3D%3D%20folderName%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.result%20%3D%20child.itemId%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getBookFolderId%28folderName%2C%20child.itemId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%0A%20%20%20return%20self.result%3B%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043C%u0430%u0441%u0441%u0438%u0432%20%u0441%20%u0430%u0434%u0440%u0435%u0441%u0430%u043C%u0438%20%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%u043C%u0438%20%u0432%u043A%u043B%u0430%u0434%u043E%u043A%20..........%20%0Afunction%20getTabsInfo%28%29%20%7B%0A%20%20%20var%20array%20%3D%20%5B%5D%2C%20seenURIs%20%3D%20%5B%5D%3B%0A%20%20%20%0A%20%20%20%5B...gBrowser.tabs%5D.forEach%28tab%3D%3E%20%7B%0A%20%20%20%20%20%20var%20label%20%3D%20tab.label%3B%0A%20%20%20%20%20%20var%20uri%20%3D%20tab.linkedBrowser.currentURI.spec%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20seenURIs%5Buri%5D%20%29%20return%3B%20//%20%u0441%u0442%u043E%u043F%20%u0435%u0441%u043B%u0438%20%u0442%u0430%u043A%u043E%u0439%20%u0430%u0434%u0440%u0435%u0441%20%u0443%u0436%u0435%20%u0431%u044B%u043B%0A%20%20%20%20%20%20seenURIs%5Buri%5D%20%3D%20true%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20array.push%28%7B%20uri%3A%20Services.io.newURI%28uri%2C%20null%2C%20null%29%2C%20label%3A%20label%20%7D%29%3B%0A%20%20%20%7D%29%3B%0A%0A%20%20%20return%20array%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№157904-10-2016 22:05:59

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2447
UA: Firefox 52.0

Re: Обсуждение кнопок CB

bunda1
Ага, спасибо. А как бы ещё сделать, чтобы папки создавалась вверху списка закладок?

Отредактировано voqabuhe (04-10-2016 22:08:03)

Отсутствует

 

№158004-10-2016 22:08:49

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4780
UA: Firefox 24.0

Re: Обсуждение кнопок CB

voqabuhe пишет:

bunda1
Ага, спасибо. А как бы ещё сделать, чтобы папка создавалась вверху списка закладок?

Выделить код

Код:

   PlacesUtils.bookmarks.createFolder(parentFolderId, folderName, -1);

на

Выделить код

Код:

   PlacesUtils.bookmarks.createFolder(parentFolderId, folderName, 0);

Отсутствует

 

№158104-10-2016 22:17:58

broker
Участник
 
Группа: Members
Зарегистрирован: 23-06-2015
Сообщений: 98
UA: unknown 0.0

Re: Обсуждение кнопок CB

bunda1
Здравствуйте, можно реализовать ету кнопку как "Добавить закладки в" или "Собрать закладки в" когда в меню ПКМ правим кликом пишем назву папки?
вот код кнопки которой я пользуюсь, имеется ввиду кнопка которая обсуждалась выше Quick bookmarks. только не закладку в папку а закладки.

Выделить код

Код:

// "Добавить как закладку в папку" в контекстном меню на странице, от 11.06.2016. ..................
((contextMenu, pref)=> {
   
   // Создать новый пункт в контекстном меню на странице ....
   var menuitem = contextMenu.appendChild(document.createElement("menuitem"));   
   menuitem.setAttribute("id", "context-addBookmark");
   menuitem.setAttribute("label", "Добавить закладку в: " + getFolderName());  
   addDestructor(()=> menuitem.remove());
   
   
   // Обрабатывать клики на пункте меню ....    
   addEventListener("click", e=> {     
      if ( e.button == 0 ) {  // ЛКМ добавить закладку
           gContextMenu.onLink 
           ? addBookmark(gContextMenu.getLinkURI(), gContextMenu.linkText(), gContextMenu.onLink) // на ссылке
           : addBookmark(gBrowser.selectedBrowser.webNavigation.currentURI, getDocTitle());       // на странице
           } 
      
      if ( e.button == 2 ) {  // ПКМ изменить папку для закладок 
           contextMenu.hidePopup();
                    
           var val = custombuttons.promptBox(menuitem.label, 'Отмена вернёт значение по умолчанию');
           var newFolder = val[0] ? val[1] : defaultFolder;           

           cbu.setPrefs(pref, convertFromUnicode("UTF-8", newFolder));
           menuitem.setAttribute("label", "Добавить закладку в: " + newFolder);            
           
           Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService).
           showAlertNotification("chrome://global/skin/icons/information-16.png", newFolder, "Папка для добавления закладок");           
           }                  
   }, false, menuitem);


   // Получить заголовк страницы или название вкладки ....
   function getDocTitle() {
      var docTitle = content.document.title || gBrowser.mCurrentTab.label;       
      var docTitle = docTitle.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
      return docTitle.substring(0, 50);
   };
   
   
   // Получить из 'about:config' название папки для добавления закладок ....
   function getFolderName() {
      try { return Services.prefs.getComplexValue(pref, Ci.nsISupportsString).data } 
      catch(e) { return "Новая папка" }; // папка по умолчанию 
   };


   // Получить Id нужной папки закладок .... 
   function getBookFolderId(folderName, parentId = 3, res = false) {
      var parentFolder = PlacesUtils.getFolderContents(parentId).root;
      for ( var i = 0; i < parentFolder.childCount; i++ ) {
            var child = parentFolder.getChild(i);            
            if ( child.title == folderName ) {
                 res = child.itemId;
                 break;
                 }
            }      
      return res; 
   }; 
   
            
   // Добавить текущую страницу или ссылку в папку закладок ....
   function addBookmark(url, label, link) {
      var folderName = getFolderName();
      var folderId = getBookFolderId(folderName);
      
      !folderId && PlacesUtils.bookmarks.createFolder(3, folderName, -1); // создать папку если не существует
      PlacesUtils.bookmarks.insertBookmark(folderId, url, 0, label);
 
      var image = gBrowser.mCurrentTab.image || "chrome://global/skin/icons/information-16.png";
      Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService).
      showAlertNotification(image, label, 'Добавил закладку в папку: ' + folderName);
   };
   
})(document.getElementById("contentAreaContextMenu"), "CB.bookmarkFolderForSaving");

Отредактировано broker (04-10-2016 22:52:58)

Отсутствует

 

№158204-10-2016 22:35:31

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4780
UA: Firefox 24.0

Re: Обсуждение кнопок CB

broker пишет:

bunda1
Здравствуйте, можно реализовать ету кнопку как "Добавить закладки в" или "Собрать закладки в" когда в меню ПКМ правим кликом пишем назву папки?

Не понял.

Отсутствует

 

№158304-10-2016 22:54:04

broker
Участник
 
Группа: Members
Зарегистрирован: 23-06-2015
Сообщений: 98
UA: unknown 0.0

Re: Обсуждение кнопок CB

bunda1
Выше я отредактировал вопрос.

Отсутствует

 

№158404-10-2016 23:08:29

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2447
UA: Firefox 52.0

Re: Обсуждение кнопок CB

bunda1 пишет:

на

Спасибо.

Отсутствует

 

№158505-10-2016 21:35:42

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4780
UA: Firefox 24.0

Re: Обсуждение кнопок CB

broker пишет:

bunda1
Здравствуйте, можно реализовать ету кнопку как "Добавить закладки в" или "Собрать закладки в" когда в меню ПКМ правим кликом пишем назву папки?
вот код кнопки которой я пользуюсь, имеется ввиду кнопка которая обсуждалась выше Quick bookmarks. только не закладку в папку а закладки.

:/

Выделить код

Код:

// "Добавить закладки в" в контекстном меню на странице, от 05.10.2016. ..................
(()=> {
   var pref = "CB.bookmarkFolderForSaving";
   var image = "chrome://global/skin/icons/information-16.png";
   var contextMenu = document.getElementById("contentAreaContextMenu"); 
   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);    
  
  
   // Создать новый пункт в контекстном меню на странице ....
   var menuitem = contextMenu.appendChild(document.createElement("menuitem"));   
   menuitem.setAttribute("id", "context-addBookmark");
   menuitem.setAttribute("label", "Добавить закладки в: " + getFolderName());  
   addDestructor(()=> menuitem.remove());
   
   
   // Обрабатывать клики на пункте меню ....    
   addEventListener("click", e=> {     
      
      // ЛКМ добавляет все открытие вкладки в папку закладок
      if ( e.button == 0 ) {  
           var folderName = getFolderName();
           var folderId = getBookFolderId(folderName);
      
           if ( !folderId ) {          // создать папку если не существует
                PlacesUtils.bookmarks.createFolder(3, folderName, -1); 
                var folderId = getBookFolderId(folderName);
                }

           getTabsInfo().forEach(m=> 
              PlacesUtils.bookmarks.insertBookmark(folderId, m.uri, -1, m.label));
 
           alertsService.showAlertNotification(image, 'Добавил все открытие вкладки в папку закладок:', folderName);
           } 
      
      // ПКМ устанавливает папку для сохранение закладок 
      if ( e.button == 2 ) {  
           contextMenu.hidePopup();
                    
           var val = custombuttons.promptBox(menuitem.label, 'Отмена вернёт предыдущую папку');
           var newFolder = val[0] ? val[1] : getFolderName();           

           cbu.setPrefs(pref, convertFromUnicode("UTF-8", newFolder));
           menuitem.setAttribute("label", "Добавить закладки в: " + newFolder);            
           
           alertsService.showAlertNotification(image, "Папка для добавления закладок:", newFolder);           
           }
                  
   }, false, menuitem);
   
   
   // Получить из 'about:config' название папки для добавления закладок ....
   function getFolderName() {
      try { return Services.prefs.getComplexValue(pref, Ci.nsISupportsString).data } 
      catch(e) { return "Новая папка" }; // папка по умолчанию 
   };


   // Получить id папки закладок .... 
   function getBookFolderId(folderName, id = 1) {
      var folder = PlacesUtils.getFolderContents(id).root;

      for ( var i = 0; i < folder.childCount; i++ ) {
            var child = folder.getChild(i);
            if ( !PlacesUtils.nodeIsFolder(child) ) continue; 

            if ( child.title == folderName ) {
                 self.result = child.itemId;         
                 break;
                 }
            else 
                 getBookFolderId(folderName, child.itemId);
            }
  
      return self.result; 
   };


   // Получить массив с адресами и названиями вкладок .... 
   function getTabsInfo() {
      var array = [], seenURIs = [];
   
      [...gBrowser.tabs].forEach(tab=> {
         var label = tab.label;
         var uri = tab.linkedBrowser.currentURI.spec;
      
         if ( seenURIs[uri] ) return; // стоп если такой адрес уже был
         seenURIs[uri] = true;
      
         array.push({ uri: Services.io.newURI(uri, null, null), label: label });
      });

      return array;
   };
   
})();

Отсутствует

 

№158606-10-2016 01:11:22

broker
Участник
 
Группа: Members
Зарегистрирован: 23-06-2015
Сообщений: 98
UA: unknown 0.0

Re: Обсуждение кнопок CB

О спасибо:D мастер bunda1

Отсутствует

 

№158711-10-2016 00:20:40

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 182
UA: Firefox 46.0

Re: Обсуждение кнопок CB

bunda1
В кнопке Открыть выделенный текст в внешнем текстовом редакторе имеется небольшой недочет:
если начать выделять текст в поле одного code и закончить в поле другого, то получаем в редакторе огрызок последнего,
если начать выделять текст в поле одного code и закончить за пределами второго, в пределах сообщения, то в редакторе получаем текст который не был выделен и идет сразу после выделения, или вообще абракадабру,,
если начать выделять текст в поле одного code и закончить за пределами второго, до каонца сообщения, то получаем сообщение "В начале выделите текст".
Ну и так далее. Проверял только на своем профиле, так что возможно конфликт. Ну, а если нет, то может получится пофиксить?

Отсутствует

 

№158808-11-2016 21:51:39

xoreax
Забанен
 
Группа: Members
Зарегистрирован: 07-11-2016
Сообщений: 54
UA: Firefox 32.0

Re: Обсуждение кнопок CB

Может кто-нить посмотреть почему эта кнопка на ХП работает нормально  , а на W7 ... тоже работает, но неправильно. Заместо регулировки яркости - регулирует "бледность", чтоли.
Кнопка колесиком мыша регулируется яркость страницы, по СКМ - сбросс :

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

Выделить код

Код:

/* Initialization 
 *  This Source Code Form is subject to the terms of the Mozilla Public
 *  License, v. 2.0. If a copy of the MPL was not distributed with this
 *  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

/*
    Based on 'Global - Pseudo Brightness Control' userstyle
    http://userstyles.org/styles/45663
    by luckymouse
    http://userstyles.org/users/14255
    License under Public Domain Dedication
    http://creativecommons.org/publicdomain/zero/1.0/
*/

const prefName = "custombutton.darken.darkLevel";

function getDarkLevel() {
  try {
    return cbu.ps.getIntPref(prefName);
  } catch (ex) {
    return 0;
  }
}

function getOpacity(aDarkLevel) {
  var opacity = 0;
  if (aDarkLevel === 50)
    opacity = aDarkLevel / 100;
  else
    opacity = (100 - aDarkLevel) / 100;
  return opacity;
}

function mouseWheel(aEvent) {
  var darkLevel = getDarkLevel();
  if (aEvent.detail > 0) {          // Scroll down
    if (darkLevel < 100)
      darkLevel++;                  // Increase number if value < 100
    else
      aEvent.stopPropagation();     // else stop (max = 100)
  }
  else {                            // Scroll up
    if (darkLevel > 0)
      darkLevel--;                  // Decrease number if value > 0
    else
      aEvent.stopPropagation();     // else stop (min = 0)
  }
  gBrowser.style.opacity = getOpacity(darkLevel);
  cbu.ps.setIntPref(prefName, darkLevel);
}

this.onclick = function onclick(aEvent) {
  if (aEvent.button !== 1)
    return;
  gBrowser.style.opacity = "1";
  cbu.ps.setIntPref(prefName, 0);
}

this.addEventListener("DOMMouseScroll", mouseWheel);

 var browser = document.getElementById("browser");
 browser.style.backgroundColor = "black";
gBrowser.style.opacity = getOpacity(getDarkLevel());

// this.tooltipText = this.name + "\n" + this.Help;
this.tooltipText = "ЛКМ(нажатие) Night Style - тёмный стиль для страниц\n\
\+\n\
Darken page - Затемнение страницы колесом\n\
Колесо Верх  - Ярче\n\
Колесо Вниз - Темнее\n\
-------------------------------------\n\
СКМ [middle-click ] - Сброс яркости ";

Отсутствует

 

№158908-11-2016 21:58:45

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4780
UA: Firefox 24.0

Re: Обсуждение кнопок CB

xoreax пишет:

Может кто-нить посмотреть почему эта кнопка на ХП работает нормально  , а на W7 ... тоже работает, но неправильно.

Замени тему W7 на упрощенную или классическую. Или есть вот такая кнопка:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0423%u043C%u0435%u043D%u044C%u0448%u0438%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u043D%u0430%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%u0445%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Eykp/xgyMv8YMTH/GDEx/xgxMf8YMTH/GDEx/xgxMf8YMTH/GDEx/xgxMf8YMTH/GDIy/xMpKf8AAAD/AAAA/1Cop/9Nrqv/SKKf/0mkof9JpKH/SaSh/0mkof9JpKH/SaSh/0mkof9JpKH/SKKf/02uq/9QqKf/AAAA/wAAAP9OoqH/PpSQ/zWFgf83iIT/N4iE/zeIhP83iIT/N4iE/zeIhP83iIT/N4iE/zWFgf8+lJD/TqKh/wAAAP8AAAD/U6in/0WgnP88ko3/PpWQ/z6VkP8+lZD/PpWQ/z6VkP8+lZD/PpWQ/z6VkP88ko3/RaCc/1Oop/8AAAD/AAAA/1asrP9HpKD/PpaR/0CZlP9AmZT/QJmU/0CZlP9AmZT/QJmU/0CZlP9AmZT/PpaR/0ekoP9WrKz/AAAA/wAAAP9ZsLH/SKmj/0Calf9CnZj/Qp2Y/0KdmP9CnZj/Qp2Y/0KdmP9CnZj/Qp2Y/0Calf9IqaP/WbCx/wAAAP8AAAD/XLW1/0uuqP9Cn5n/RKKc/0SinP9Eopz/RKKc/0SinP9Eopz/RKKc/0SinP9Cn5n/S66o/1y1tf8AAAD/AwMD/2C4uv9OtK//RKWf/0aoov9GqKL/Rqii/0aoov9GqKL/Rqii/0aoov9GqKL/RKWf/060r/9guLr/AwMD/1NSUv9qw8T/V8XE/1O+u/9Uv73/VL+9/1S/vf9Uv73/VL+9/1S/vf9Uv73/VL+9/1O+u/9XxcT/asPE/1NSUv9XVlb/bcfI/1vLyv9XxML/WMXE/1jFxP9YxcT/WMXE/1jFxP9YxcT/WMXE/1jFxP9XxML/W8vK/23HyP9XVlb/VlVU/3DMzf9f0ND/WsnH/1vKyf9bysn/W8rJ/1vKyf9bysn/W8rJ/1vKyf9bysn/WsnH/1/Q0P9wzM3/VlVU/1ZUVP9zz9H/YtfV/13Qzf9e0c7/XtHO/17Rzv9e0c7/XtHO/17Rzv9e0c7/XtHO/13Qzf9i19X/c8/R/1ZUVP9WVFT/d9PW/2Xc2/9f1dP/YdbU/2HW1P9h1tT/YdbU/2HW1P9h1tT/YdbU/2HW1P9f1dP/Zdzb/3fT1v9WVFT/VlRU/3nV2P9j39z/XdjU/1/Z1f9f2dX/X9nV/1/Z1f9f2dX/X9nV/1/Z1f9f2dX/XdjU/2Pf3P951dj/VlRU/1ZUVP9/4+f/ePX2/3Xu7/927/D/du/w/3bv8P927/D/du/w/3bv8P927/D/du/w/3Xu7/949fb/f+Pn/1ZUVP9XVlb/YXt8/2aBg/9mgIL/ZoCC/2aAgv9mgIL/ZoCC/2aAgv9mgIL/ZoCC/2aAgv9mgIL/ZoGD/2F7fP9XVlb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041B%u041A%u041C%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20%u0441%u0442%u0438%u043B%u044C%20..........%0Athis._handleClick%20%3D%28%29%3D%3E%20setStyleForPages%28%20cbu.setPrefs%28s%2C%20%21cbu.getPrefs%28s%29%29%20%29%3B%0A%0A%0A//%20%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u0435%u043D%u044F%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0432%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%u0445%20%u0438%20%u0441%u0442%u0438%u043B%u0435%20..........%0Athis.onwheel%20%3De%3D%3E%7B%0A%20%20%20var%20i%20%3D%20cbu.getPrefs%28l%29%2C%0A%20%20%20%20%20%20%20i%20%3D%20e.deltaY%20%3C%200%20%3F%20i%20+%20step%20%3A%20i%20-%20step%3B%0A%20%20%20if%20%28%200%20%3C%3D%20i%20%26%26%20i%20%3C%3D%2099%20%29%20cbu.setPrefs%28l%2C%20i%29%3B%0A%0A%20%20%20setStyleForPages%28%20cbu.setPrefs%28s%2C%20true%29%20%29%3B%0A%7D%3B%0A%0A%0A//%20%u0418%u0441%u043F%u0440%u0430%u0432%u0438%u0442%u044C%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%u0443%20%u0441%20position%20%u0434%u043B%u044F%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%20..........%0AaddEventListener%28%22mouseover%22%2C%20e%3D%3E%7B%0A%20%20%20if%20%28%20e.button%20%7C%7C%20e.target.localName%20%21%3D%3D%20%27img%27%20%29%20return%3B%20%20%0A%20%20%20%0A%20%20%20var%20img%20%3D%20e.target%2C%20node%20%3D%20img%3B%0A%20%20%20if%20%28%20getPosition%28img%29%20%3D%3D%20%27absolute%27%29%20%7B%20img.setAttribute%28%27currentPosition%27%2C%20%27true%27%29%3B%20return%3B%20%7D%3B%20%20%0A%0A%20%20%20while%28%20node%20%3D%20node.parentNode%20%29%20%7B%0A%20%20%20%20%20%20if%20%28%20getPosition%28node%29%20%3D%3D%20%27relative%27%20%29%20break%3B%0A%20%20%20%20%20%20if%20%28%20getPosition%28node%29%20%3D%3D%20%27absolute%27%29%20%7B%20img.setAttribute%28%27parentPosition%27%2C%20%27true%27%29%3B%20break%3B%20%7D%3B%20%20%20%0A%20%20%20%7D%3B%0A%20%20%20%20function%20getPosition%28node%29%20%7B%20try%20%7B%20return%20getComputedStyle%28node%2C%20%27%27%29.position%20%7D%20catch%28e%29%20%7B%20return%20%22%22%20%7D%20%7D%3B%20%20%0A%20%20%20%3B%0A%7D%2C%20false%2C%20gBrowser%29%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20css%20%u043A%u043E%u0434%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u043F%u0440%u0430%u0432%u043A%u0430%20..........%0Avar%20step%20%3D%202%2C%0A%20%20%20%20s%20%3D%20%22CB.darken%22%2C%0A%20%20%20%20help%20%3D%20self.getAttribute%28%27Help%27%29%2C%0A%20%20%20%20l%20%3D%20%22CB.darken.level%22%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0432%20about%3Aconfig%20%u0435%u0441%u043B%u0438%20%u043E%u043D%u0438%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20..........%0Acbu.isPref%28l%2C%2028%29%3B%0Acbu.isPref%28s%2C%20false%29%3B%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043D%u0430%u0441%u0442%u0440%u043E%u0435%u043A%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29.%0A%20%20%20src%20%3D%20%21cbu.getPrefs%28s%29%20%3F%20self.image%20%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/NTU1/z8/P/89PT3/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv89PT3/Pz8//zU1Nf8AAAD/AAAA/6Ghof+YmJj/ioqK/42Njf+NjY3/jY2N/42Njf+NjY3/jY2N/42Njf+NjY3/ioqK/5iYmP+hoaH/AAAA/wAAAP+dnZ3/hISE/3R0dP94eHj/eHh4/3h4eP94eHj/eHh4/3h4eP94eHj/eHh4/3R0dP+EhIT/nZ2d/wAAAP8AAAD/qKio/5OTk/+CgoL/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+CgoL/k5OT/6ioqP8AAAD/AAAA/6+vr/+ampr/iYmJ/42Njf+NjY3/jY2N/42Njf+NjY3/jY2N/42Njf+NjY3/iYmJ/5qamv+vr6//AAAA/wAAAP+1tbX/oqKi/5GRkf+VlZX/lZWV/5WVlf+VlZX/lZWV/5WVlf+VlZX/lZWV/5GRkf+ioqL/tbW1/wAAAP8CAgL/vb29/6mpqf+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+Xl5f/qamp/729vf8CAgL/AAAA/8PDw/+xsbH/n5+f/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/n5+f/7Gxsf/Dw8P/AAAA/zo6Ov/Pz8//xMTE/7a2tv+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7a2tv/ExMT/z8/P/zo6Ov9aWlr/2dnZ/9PT0//Jycn/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Jycn/09PT/9nZ2f9aWlr/U1NT/9/f3//a2tr/z8/P/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/z8/P/9ra2v/f39//U1NT/1RUVP/m5ub/4+Pj/9jY2P/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9jY2P/j4+P/5ubm/1RUVP9UVFT/7u7u/+3t7f/i4uL/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/i4uL/7e3t/+7u7v9UVFT/VFRU/+/v7//y8vL/5+fn/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fn//Ly8v/v7+//VFRU/1RUVP/8/Pz//////////////////////////////////////////////////////////////////Pz8/1RUVP9WVlb/kJCQ/5WVlf+VlZX/lpaW/5aWlv+Wlpb/lpaW/5aWlv+Wlpb/lpaW/5aWlv+VlZX/lZWV/5CQkP9WVlb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%22%3B%20%0A%7D%3B%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%29%3B%0A%0A%0A//%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20..........%0Afunction%20setStyleForPages%28%29%20%7B%0A%20%20%20var%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0A%20%20%20var%20css%20%3D%20help.replace%28/value/g%2C%20cbu.getPrefs%28l%29/100%20%29%3B%20%20%20%20%20%20%0A%20%20%20var%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%29%3B%20%0A%20%20%20%0A%20%20%20try%20%7B%20sss.unregisterSheet%28previousUri%20%7C%7C%20uri%2C%200%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20previousUri%20%3D%20uri%3B%0A%20%20%20%0A%20%20%20cbu.getPrefs%28s%29%20%26%26%20sss.loadAndRegisterSheet%28uri%2C%200%29%3B%0A%7D%3B%0Acbu.getPrefs%28s%29%20%26%26%20setStyleForPages%28%29%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%20%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%5Cn%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u043E%u0436%u043D%u043E%20%u043C%u0435%u043D%u044F%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B@-moz-document%20url-prefix%28http%3A//%29%2C%20url-prefix%28https%3A//%29%2C%20url-prefix%28ftp%3A//%29%2C%20url-prefix%28file%3A//%29%2C%0Aurl-prefix%28chrome%3A//%29%2C%20url-prefix%28about%29%20%7B%0A%20%20%20browser%7B%20background%3A%20LightGray%20%21important%3B%20%7D%20%20%20%0A%20%20%20%0A%20%20%20/*%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%u0439%20%u0438%20%u0434%u0440%u0443%u0433%u0438%u043C%u0438%20%u044D%u043B%u0435%u043C%u0435%u043D%u0442%u0430%u043C%u0438%20%u043F%u0441%u0435%u0432%u0434%u043E%u044D%u043B%u0435%u043C%u0435%u043D%u0442%20%u0441%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u043D%u043E%u0439%20%u043F%u0440%u043E%u0437%u0440%u0430%u0447%u043D%u043E%u0441%u0442%u044C%u044E%20*/%0A%20%20%20html%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0432%u0435%u0431%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%20%u043D%u0435%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20about%3A%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%2C%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20DOM%20%u0438%20%u0441%u0442%u0438%u043B%u0435%u0439%20*/%0A%20%20%20%23appbar-content%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u043F%u0430%u043D%u0435%u043B%u044C%20%u0441%u0432%u0435%u0440%u0445%u0443%20%u043D%u0430%20youtube%20*/%0A%20%20%20%23txbTextNodeValue%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0440%u0430%u0448%u0438%u0440%u0435%u043D%u0438%u0435%20DOM%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20*/%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23editor%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20DOM%20%u0438%20%u0441%u0442%u0438%u043B%u0435%u0439%20*/%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23profiles-list%3Aafter%2C%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23options-panel%3Aafter%2C%0A%20%20%20window%3Anot%28%5Bclass%3D%22theme-dark%22%5D%29%20%23editor%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23style-editor-chrome%3Aafter%2C%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23network-inspector-view%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20.cbeditor-textbox%3Aafter%2C%20%23newtab-window%3Aafter%2C%20%20%20%20%20%20%20%20%20%20/*%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%20%u0421%u0412%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u043D%u043E%u0432%u0430%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%20*/%0A%20%20%20treecols%3Anot%28%5Bid%3D%22placeContentColumns%22%5D%29%3Aafter%2C%20%20%20%20%20%20%20%20%20/*%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438%2C%20%u0438%u0441%u0442%u043E%u0440%u0438%u044F%2C%20%u0431%u0438%u0431%u043B%u0438%u043E%u0442%u0435%u043A%u0430%2C%20about%3Aconfig%20*/%0A%20%20%20%23devtools-webconsole%3Aafter%2C%20%23ConsoleBox%3Aafter%2C%20%20%20%20%20%20%20%20%20%20/*%20%u043A%u043E%u043D%u0441%u043E%u043B%u044C%20%u043E%u0448%u0438%u0431%u043E%u043A%2C%20%u0432%u0435%u0431%20%u043A%u043E%u043D%u0441%u043E%u043B%u044C%20%u043E%u0448%u0438%u0431%u043E%u043A%20*/%0A%20%20%20%5Btitle%3D%22%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%22%5D%5BhasBrowserHandlers%3D%22true%22%5D%3Aafter%2C%20%20%20/*%20%u0440%u0430%u0437%u043D%u044B%u0435%20about%3A%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20*/%0A%20%20%20%5Bid%3D%22permissions-page%22%5D%3Aafter%2C%20%5Bid%20%3D%22tabsList%22%5D%3Aafter%2C%0A%20%20%20%5Bid%3D%22contentAreaDownloadsView%22%5D%3Aafter%2C%20%5Bid%3D%22addons-page%22%5D%3Aafter%20%20%20%0A%20%20%20%7B%0A%20%20%20%20%20content%3A%20%22%22%20%21important%3B%0A%20%20%20%20%20position%3A%20fixed%20%21important%3B%0A%20%20%20%20%20top%3A%200%3B%20bottom%3A%200%3B%20left%3A%200%3B%20right%3A%200%3B%0A%20%20%20%20%20background%3A%20%23000%20%21important%3B%0A%20%20%20%20%20z-index%3A%2099999999%20%21important%3B%0A%20%20%20%20%20pointer-events%3A%20none%20%21important%3B%0A%20%20%20%20%20opacity%3A%20value%20%21important%3B%0A%20%20%20%7D%0A%20%20%20%0A%20%20%20/*%20%u043E%u0442%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0443%u043C%u0435%u043D%u044C%u0448%u0435%u043D%u0438%u0435%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u043A%u0438%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u0437%u0430%u0442%u0435%u043C%u043D%u0435%u043D%u0438%u044F%20%20*/%0A%20%20%20%23comments-test-iframe%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u043A%u043E%u043C%u0435%u043D%u0442%u0430%u0440%u0438%u0438%20%u043D%u0430%20youtube%20*/%0A%20%20%20%0A%20%20%20/*%20%u043E%u0442%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0443%u043C%u0435%u043D%u044C%u0448%u0435%u043D%u0438%u0435%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20*/%0A%20%20%20svg%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22img%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22rel%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22ytp-thumbnail%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bid%3D%22watch7-sidebar-modules%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22right_block%20video_right%20video_today%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22photo%22%5D%3Ahover%2C%0A%20%20%20img%3Ahover%3Anot%28%5Bparentposition%5D%29%3Anot%28%5Bcurrentposition%5D%29%3Anot%28%5Bid%3D%22keyboard_picture%22%5D%29%3Anot%28%5Bid%3D%22mpiv-preview%22%5D%29%3Anot%28%5Bid%3D%22splashoverlay%22%5D%29%3Anot%28%5Bclass%3D%22prew%22%5D%29%3Anot%28%5Bclass%3D%22rel%22%5D%29%0A%20%20%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20position%3A%20relative%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%20%20%20img%5Bparentposition%5D%3Ahover%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20position%3A%20relative%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%20left%3A%200px%3B%20bottom%3A%200px%3B%0A%20%20%20%7D%0A%20%20%20img%5Bcurrentposition%5D%3Ahover%20%7B%20%0A%20%20%20%20%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%0A%20%20%20/*%20%u043F%u043E%u043B%u043E%u0441%u0430%20%u043F%u043E%u0438%u0441%u043A%u0430%20%u043D%u0430%20youtube%20*/%0A%20%20%20%23yt-masthead-container%20%7B%20background%3A%20LightGray%20%21important%3B%20%7D%0A%0A%20%20%20/*%20%u0438%u0441%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0432%u0438%u0434%u0435%u043E%20*/%0A%20%20%20embed%5Bflashvars%5D%2C%20%20%0A%20%20%20div%5Bclass%3D%22html5-video-container%22%5D%2C%0A%20%20%20*%5Btype*%3D%22application/x-silverlight%22%5D%2C%0A%20%20%20*%5Btype*%3D%22application/x-shockwave-flash%22%5D%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%7D%0A%0A/*%20%u0438%u0441%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0435%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20%u044D%u043B%u0435%u043C%u0435%u043D%u0442%u044B%20%u043D%u0430%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%u043D%u044B%u0445%20%u0441%u0430%u0439%u0442%u0430%u0445%20%u0434%u043B%u044F%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u043A%u0438%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u0437%u0430%u0442%u0435%u043C%u043D%u0435%u043D%u0438%u044F%20*/%20%0A@-moz-document%20domain%28politobzor.net%29%20%7B%20%0A%20%20%20html%5Bxmlns%3D%22http%3A//www.w3.org/1999/xhtml%22%5D%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%20%20%20.item%20%7B%20background%3A%20LightGray%20%21important%3B%20%7D%0A%7D%0A@-moz-document%20url-prefix%28http%3A//translate.google.com/translate%29%20%7B%20%0A%20%20%20html%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%7D%0A@-moz-document%20url%28about%3Ahealthreport%29%2C%20url%28about%3Asessionrestore%29%2C%20url%28about%3Awelcomeback%29%20%7B%20%0A%20%20%20html%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%7D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№159008-11-2016 22:11:09

Coroner
Участник
 
Группа: Members
Зарегистрирован: 29-10-2012
Сообщений: 3512
UA: Firefox 49.0

Re: Обсуждение кнопок CB

xoreax
Поглядите этот вариант. Использую на Win7, правда не знаю что он регулирует : яркость или бледность :)

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

Выделить код

Код:

/*
 *  This Source Code Form is subject to the terms of the Mozilla Public
 *  License, v. 2.0. If a copy of the MPL was not distributed with this
 *  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

/*
    Based on 'Global - Pseudo Brightness Control' userstyle
    http://userstyles.org/styles/45663
    by luckymouse
    http://userstyles.org/users/14255
    License under Public Domain Dedication
    http://creativecommons.org/publicdomain/zero/1.0/
*/

const prefName = "custombutton.darken.darkLevel";

var domain = content.location.hostname;

var css = '@-moz-document domain("' + domain + '") {\
html > scrollbar { background: #A9A9A9 !important; }\
html { background: #005500 !important; opacity: .99 !important; }\
}';

function getDarkLevel() {
  try {
    return cbu.ps.getIntPref(prefName);
  } catch (ex) {
    return 0;
  }
}

function getOpacity(aDarkLevel) {
  var opacity = 0;
  if (aDarkLevel === 50)
    opacity = aDarkLevel / 100;
  else
    opacity = (100 - aDarkLevel) / 100;
  return opacity;
}

function mouseWheel(aEvent) {
  var darkLevel = getDarkLevel();
  if (aEvent.detail > 0) {          // Scroll down
    if (darkLevel < 100)
      darkLevel++;                  // Increase number if value < 100
    else
      aEvent.stopPropagation();     // else stop (max = 100)
  }
  else {                            // Scroll up
    if (darkLevel > 0)
      darkLevel--;                  // Decrease number if value > 0
    else
      aEvent.stopPropagation();     // else stop (min = 0)
  }
  gBrowser.style.opacity = getOpacity(darkLevel);
  cbu.ps.setIntPref(prefName, darkLevel);
}

this.onclick = function onclick(aEvent) {
  if (aEvent.button !== 1)
    return;
  gBrowser.style.opacity = "1";
  cbu.ps.setIntPref(prefName, 0);
}

this.addEventListener("DOMMouseScroll", mouseWheel);

var browser = document.getElementById("browser");
browser.style.backgroundColor = "black";
gBrowser.style.opacity = getOpacity(getDarkLevel());

this.tooltipText = this.name + "\n" + this.Help;

Отсутствует

 

№159108-11-2016 22:58:09

xoreax
Забанен
 
Группа: Members
Зарегистрирован: 07-11-2016
Сообщений: 54
UA: Firefox 32.0

Re: Обсуждение кнопок CB

Понятно. Все так и есть, если убрать Аеро , работает кнопка. Причина в Аеро.

Coroner - работает! Класс! тоже нет, если с Аеро. будем думать.
Благодарю.

Отредактировано xoreax (08-11-2016 23:09:07)

Отсутствует

 

№159209-11-2016 00:06:56

Coroner
Участник
 
Группа: Members
Зарегистрирован: 29-10-2012
Сообщений: 3512
UA: Firefox 49.0

Re: Обсуждение кнопок CB

xoreax
Не может быть в цветовом профиле дело ? Не меняли его ( gfx.color_management.display_profile ) ?
Может попробовать gfx.color_management.mode в 0 выставить ?

Отсутствует

 

№159313-11-2016 02:04:52

andry252
Участник
 
Группа: Members
Зарегистрирован: 22-03-2011
Сообщений: 42
UA: Firefox 48.0

Re: Обсуждение кнопок CB

Подскажите, почему у меня кнопка Save snapshot to html  https://forum.mozilla-russia.org/viewtopic.php?pid=588588#p588588, как-то непонятно работает?
Когда выделяю всю страницу, то сохраняется только (как правило) шапка ну или верхушка. Но если начать выделять не всю страницу, а части или даже всю но не затрагивая часть макушки, то сохраняет как надо.
Уже достало каждый раз мышкой выкорчевывать какие-то части, чтобы страница скопировалась, как надо. Кнопка очень удобная но эти глюки все портят.

Отсутствует

 

№159413-11-2016 03:07:24

SendInfo
.
 
Группа: Members
Зарегистрирован: 14-02-2011
Сообщений: 271
UA: Firefox 42.0

Re: Обсуждение кнопок CB

andry252 пишет:

выделяю всю страницу

Попробуй ничего не выделять. Просто нажми кнопку для сохранения всей страницы.

Отредактировано SendInfo (13-11-2016 03:09:19)

Отсутствует

 

№159516-11-2016 19:25:50

xoreax
Забанен
 
Группа: Members
Зарегистрирован: 07-11-2016
Сообщений: 54
UA: Palemoon 26.0

Re: Обсуждение кнопок CB

Coroner пишет:

Не может быть в цветовом профиле дело ? Не меняли его ( gfx.color_management.display_profile ) ?
Может попробовать gfx.color_management.mode в 0 выставить ?

пробовал все, ничего не работает. В w7 с Aero невозможно применить цвет к .... не знаю как правильно, "свойству" или "элементу" browser, этим способом.

Выделить код

Код:

...
var browser = document.getElementById("browser");
browser.style.backgroundColor = "#000";  // вот тут и не применяется цвет к элементу.
gBrowser.style.opacity = getOpacity(getDarkLevel());
...

Я сделал кнопку  отдельную, в качестве эксперимента - и она работает в случае Aero :

Выделить код

Код:

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);  

  var uri = makeURI("data:text/css," + encodeURIComponent("browser{background-color:#000 !important;opacity:.88;"));


   if ( sss.sheetRegistered(uri, sss.AGENT_SHEET) ) sss.unregisterSheet(uri, sss.AGENT_SHEET);
     else 
        sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);

Пытаюсь объединить , но получается слабо :)  мало знаний-опыта. Получается, надо грузить цвет для browser с AGENT_SHEET :sick:  ибо кнопка регулирует значение прозрачности правильно - цвет не применяется просто (в случае Aero).

Кнопка bunda1 работает всегда. Но там по-другому все сделано. Благодарю, bunda1.

Отредактировано xoreax (16-11-2016 19:29:43)

Отсутствует

 

№159624-11-2016 13:06:02

broker
Участник
 
Группа: Members
Зарегистрирован: 23-06-2015
Сообщений: 98
UA: unknown 0.0

Re: Обсуждение кнопок CB

Здравствуйте, не работает пункт "Сохранить всю страницу как PNG" и другие пункти связаные с PNG.  Почините пожалуйста FF48.

Выделить код

Код:

// Save+, от 01.03.2015. ................................

// Настройка функций кликов мыши ................................
this.onclick = function(e) {      
     if ( e.button == 0 ) menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft"); 
};



// Объявляем настройки и переменные для этой вкладки ................................
var addSiteNameToShortcuts = false; // true => добавлять название домена к названию ярлыка

var button = this;
const file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
const iosService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
const directoryService = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties);
const foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);


 
// Создать меню для кнопки ................................
var array = [
       { label: "Добавить url и сохранить страницу в html", func: "savePage", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAyMjIzwyMjFeLi0tVS8vLlcuLy9XLS4uVywsLFUuLi5aKSkpUggICBMAAAAAAgICAQAAAAAAAAAAAAAAABQTEyOgoJ/yysvL/s3Pz/7Z293/4OPk/+bp6f/t7u7/5eXl/LOysv97e3vLFRUWJQAAAAACAgIDAAAAAAAAAAA8PDxSz9HT/83Qz/fLx8T8z7+5/M/AsPzez8n89e3r/PDx8fyusLL43dzc/52dndMWFhY2AAAAAAICAgIAAAAAODg5T8bEv/+9o476vIR1/7WDcv+uj3v/spCA/8Wqk//Gtab/rqyq/+Pk5fn19fX+np6e4BQUFCgAAAAAAAAAAC4uJU29oYj/wLao+tLDqf/Mv7P/yLik/7zEvP/F0cr/v62Y/6+Kef/Z2NP/6Ors+d3c3P97e3vNBAQEDgIDAAZhRCuYxaSb/8Gvqfu2inL/vIF0/7FmUv+ygG//waaX/8m8tP/CoIn/vqOF/9zg3//l5ef7ycnJ/zY2Nm0hFw08rGJD/6BlYf2mWUD/rW9g/7aNff+ZRyL/pmxR/7RyWv+qaEz/uYR0/69kSf/k1tD//////Ozs6/1iYmK4WTMck61mVv+Yemj8hjsg/51bQ/+wem//n084/6+pq/+3p6H/l0Ux/4lFOf+gWDr/zq2X//b7/fzo6Oj/YWBgsXpXSbnMsp//wNC8/I9jWv+WX1X/tn5w/7iKfv/Tzc7/ztXc/513bf+MSjH/rWJG/7iRd//o7Oz85OPl/2BgYLN1aFqu2tO+/7ejnvyohYD/ybGb/7q1ov/HwrX/7/Lr//T19v/Hzs3/p4V0/6hvW/+6gHf/4uDh/N3e3v9hYWC0dWNPuaVXRP6cfWv8w7Gz/8vHsv/U2dP/4OHf//b08//9/Pv/3drZ/7rBw/+0ppv/wZ2F/9zc3PzW1tj/ZWRktE1HPW2oa1f/lX1t/cTP0v/Ew8T/3Nvd/9LR0//W1tf/5OXl/+/t6v/i6vD/wK+i/8y2o//b3t/81NTU/2FhYbMMDAsPsZ2a1tDX2P++vL390c/P/+Dh4P/b29r/09PS/9rY1//6+Pf/8PP3/8Kqlf/c0sv/3N7g/NTU1P9iYmKyAAAAAEY6MmXozcP/5ezt+OHk6Pzt7Oz9+Pj4/urq6/zs7/T8+f///NXGsPzey8P87vDy/OXm5vnf39//ZWVlrgAAAAAGBQQQdFdHy8Wfhv/d18797e7w/+3t7P/y8u7/7N/G/7unff+/uqT/4+Tl/97d3v/c3Nz/sLCw+h8fH0IBAQABAAEBABEVFx8vJB1cWy8ciZNrU8itknHrkWdIxUsqFnEnJSBRMjQ3WS8uL1csLCtVMjIyXiIiIj4BAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="},
       { label: "Сохранить всю страницу как PDF", func: "savePageToPDF", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYUw4pJt3V/+Rb1D8lnFP/55zTf+VcVH/lXJS/5VyUv+VclL/lXJS/5VyUv+VclL/k3BR/J56Wv9cRzSkAAAAAJNvUKTto2L/4ppe/uehZf/Pmmr/noZv/9Scav/Wl17/1plh/9eZYf/XmWH/15lh/9eZYf/WmGD/2Jlg/suRXP9mRiuk8rWA/397dP1akKn/rqqi/3LF3f8Mntj/4dLJ///+9f/48u3/9e7n//bt5v/47+f/+O/n//jv5//rvZP/1ZJX/a9/VP9+lrD8AIvz/xOt+f8Douv/ALb6/wC28/9tmar/z8jJ//Lq5/////7//v////n9///6/P3//////+Ta0P/PjVP/pnpT/IWds/+aiXj/5efl/8Px//951/3/LMz//wCx8/8GltL/NIu3/4ycqf/l29L////+//n6+//8/v//3tXM/8+OVP+oe1P/6K57/86QWP/r6Ob////////++v/r9/z/oOb9/zDL//8Arf//AI/r/ydysv+hpqr//PTr///////d1Mz/0I5U/6h7U//osH//wo5g/+fm5P/7/f//9vf5//z7+////vv/9/r8/5Dc/P8Oqv7/AJf//wF02v9ffZ7/8Ojh/+Ha1P/NjFL/qHtT/+ewf//Ej1//7O3r///////+/v7//v7+//f5+v/6+vv////8/8Tq/f8hp/7/AJH//wB18/8/bqj/1MGu/9mXXv+leVH/569+/8iSYv+/tKn/wLew/8O5sf/P0M////////7+/v/3+fv////7/9Hv/v8hoP3/AIn//wB4/v84ZqL/w4NH/619VP/nsYD/x45c/9W5of/bv6j/0Jxt/6J/YP+spqD/2N3i//7////6+/3///76/8vr/v8Slv7/AIb+/wBz//83VH7/nW1B/+ewfv/Fjl7/7Ozr///////9+/r/9d7K/9Ghdv+jd1D/pJ6Y/+jt8f/9///////7/6fb/v8Ahv7/AYD//wRp6f95YlT/57B//8SOXv/n5uT//v7///r7/P/8/v////////XRsv/DhEv/loBu/9DX3P/9/v/////7/2O6/f8Afv//FnTU/5JtTf/nsH//xY9e/+jn5f/+/f//+fj5//n4+P/5+Pn/+/////Xbxf/Wj1D/nX1h/+Ll6P////7/3+/3/w+V//8tcbP/qHJB/+WuffzCjV7/5efn///////+/v7//////////////v7///////XRsP/TnW3/8fT3//////////z/ddD//0Nxl/+zdkH88LmH/9CRWP2+qJT/0M7N/8/Jxv/Pysf/z8rH/8/Kxv/Py8n/zsO6/7+pmP/PzMv/zsnG/9bNyP+nsK7/h4R3/b2BT/+Sb1Ck7qxw/9GSW/69hlb/wYhX/8CIV//AiFf/wIhX/8CIVv/BiVj/xI1d/8CIVv/BiFf/vYZW/9STW/7ppmv/bE80pAAAAACUd16k+sui/+7AmPzwwpr/8MKa//DCmv/wwpr/8MKa//DCmf/vwZj/8MKa//DCmv/uwJj8+cui/5N3XaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить выделенный текст как txt файл", func: "saveSelectionToTxt", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAQE6AAAAZAAAAGgAAAJmAAACZgAAAGYAAABmAAAAZgAAAGYAAABmAAAAZgAAAGYAAABlAAAAaQABAmYAAQEjAAAAADlVkOdVcKHxVXKi8kdklPJLZpfyU3Cg8lJvn/JRbZ7yUW+g8lFun/JRbp/yUG6e8lVyofFVdKjzLkV45wAAAFABAQEAaIzF/3y34v9wsuL/cJe0/0lpgv9bjLP/dLLh/2+v3v9sq9v/cK3d/3Gv3v9sqtv/b7Df/4G77P9VcqT2AAAAVAMDAQBnir/+ZqfU/pDB4/7a3uD+j46N/kxYXv6To6/+1er4/tXp+P7J3/D+1ej4/svg8v6Gut/9aqzd/lhxnvAAAABSAwIBAGaIvv9pptX/ocfj//f4/P/P0tX/g4CA/1xZWf+Woqr/2uz8/9Hl+f/W5fT/2Of3/5fC4v5tq93/Vm+e8QAAAFIDAgEAaYm+/3mw2/+iyeX/9Pn8/+z0+//IzNL/d3h5/0tMTv+Mkpn/xdvs/9Hp/f/O4PL/msXk/nmz4/9XcJ/xAAAAUgMDAQBti7//k7/h/6fL5v/v9fn/4u73/9Dk9P+8wMT/YGpx/zJJWv94iJf/ztzo/9Pp/P+ZwuD+gLfk/1dwnvEAAABSAwMBAHOPwf+myub/sNHp//j7/P/6/P3/8fr///r39P+sxdP/IXWq/xJJcv+NjZD/0+Lu/6TN7f6Ft+L/WXGf8QAAAFIDAwEAd5LD/7PR6/+ZxOP/0ePx/97r9f/Y5/L/3e32/8Tc7f9gseT/CHK3/zBYdv+HiY7/lL/f/pLE7/9bcJ3xAAAAUgMDAQB4k8P/xNvx/5/F5f+kyOX/qMrn/6TH5f+kyOX/sM/q/5e51P9Mm83/GHm3/xxIav9fdYf+pMvs/1x1pfIAAABTAwMBAHmSxf/O4/T/y9/y/8Hb9P/C3PX/wNv0/7vW7/+93ff/utDm/42fsf9Gjbn/EXS2/ytSbv6Fj5r/WnGc8gAAAFICAwEBepPE/tHk9f/S5PX/vMjV/7fCzP+3w8//uMPP/7XBzP+6ytf/qa+4/3h/hv9Ghaz/JoO+/jNXdP82PVnyAAAAVgACAgCBmcb/2+r3/dHh8fyPkpX/kI6N/5yam/+dnJ3/paWk/6enpf+sr6//mpSR/3Bubf9SjbD8H4C+/QsrSvcCAAB/AAAAA3yVx//j8///3u/7/52gpf6pqKf+uLm5/rq7u/7Ly8v+ycnI/paWlf6LjY/+np2f/Xh+g/5gnL7/MX+y/xcgJ80BAgNNN1OUs6W84fDA1O73mJyj/ainpv+2trb/t7e4/8fHyP/Fxsb/kZGQ/4eGhP+vucT/j6G+/W53k/NlkbnwNoOv/AgiNb8CCBsQDRo/YwsaO3B0d33arKyp9q2trfWvr6/2u7u79ru7vPawr7H1sbCt9nJ2gOQIGD6bFCFEYB0qPE1Bf6SpEz9cggAAAAMCAQEBAQAAADIyMmlDQ0ONQUFBhUFBQYVCQkGFQkJBhUhISIRNTU2OKysrZAEAAAUBAQAAAgEAAAkEAAEDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить всю страницу как PNG", func: "WebScreenShot.captureAll", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAiAcFBa4KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwsJCaECAQE/BQMDAAAAAJUgICD4V1ZW/2FhYf5hYWH/YmFh/2BgYP9fX1//X19f/19fX/9gYGD/YmFh/2FhYf9gYGD+ZmVl/1RSUuIVFBQtCgkJy1paWv+Li4v9h4eH/oiIiP6FhYX+i4uL/pKSkv6Sk5P+kpKS/ouLi/6FhYX+iIiI/oiIiP6Hh4f7lZaW/25tbYQNDQ3OcHBw/5KSkv6Li4v/i4uL/5mZmf+EhIT/ZGRk/1tbWv9kZGT/hISE/5mZmf+Li4v/jY2N/4yMjPyWl5f/iomJjQ4NDc13d3f/m5ub/pWVlf+goKD/XFxc/ygoKP8fHyD/GBsb/yAhIv8pKSn/W1tb/6CgoP+Wlpb/lpaW/J6env+Jh4eMDg4OzX1+fv+ioqL+qqqq/1hYWP8ZGRn/Ghwb/x4dHP8mIh//FhQR/xUWF/8aGhr/WFhY/6urq/+cnJz8pKSk/4qJiYwPDg7Ng4OD/7W1tf6MjIz/Ghoa/xYYGP8uKCb/ZEAo/5xyOP++saL/RD45/xISE/8bGxv/jY2N/6+vr/ypqan/ioiIjA8PD82IiIj/xMTE/l1cXP8LDAz/JiId/1o3LP9ADgD/mGog//Dt6P/VysX/Ih4Z/wsMDf9eXl7/v7+//K6urv+KiYmMEA8PzY+Pj//Kysr+SEhH/wEDBv9MPi7/hlES/3dCAP+VZAn/tJVO/7eVXf9OQTL/AAIE/0pJSf/FxcX8tLS0/4qJiYwQEBDNm5ub/9/e3/5SUlL/AAAA/0M7Mf/aya7/ybiO/5RmEf9aIAD/cjkX/z80KP8AAAD/U1JS/9nZ2fzAwMD/i4qKjBEREc2oqKn/8O/w/oeGhv8AAAD/DAsK/6qkof/17uj/nW8l/14eCf9hPTr/ExUU/wAAAP+Hh4f/6urq/MzMzf+Mi4uMERERzbCwsv/r6uz+3Nzd/yoqKv8AAAD/ExEP/2heU/9yWjv/UD0u/xcXFv8AAAD/Kioq/93d3v/l5eb81NTV/4yLi4wSERHNuLm5/+/v8P7z8/P/xsbG/yAgIP8AAAD/AQEB/wAAAP8BAQH/AAAA/yAgIP/Gxsb/9PT0/+np6vzb29v/jIuLjBIREc2+vb7/+Pj5/uvr7P/7+/v/4ODg/3Nyc/8uLi7/Hh4d/y0sLP9zc3P/4ODg//v7+//s7O3/8/P0/OHg4f+Mi4uLFBMTyMPDw//////7+Pj4/ff29v38/Pz9/////fr6+v3u7u79+vr6/f////38/Pz99/b2/fn5+f37+/v53t7e/5KSko4GBgZ7m5yc//j4+P/w8fH/8fLy//Dw8P/u7u7/8vLy//X19f/y8vL/7u7u//Dw8P/x8vL/8vLy/uXl5f/BwcH+k5GRUAAAAAQeHR1yb25uxn59fcZ9fHzGfXx8xn18fMZ9e3vGfHt7xn17e8Z9fHzGfXx8xn18fMZ9fHzGgH9/xYmIiGVaV1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить видимую часть страницы как PNG", func: "WebScreenShot.capturePage", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAiAcFBa4KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwsJCaECAQE/BQMDAAAAAJUgICD4V1ZW/2FhYf5hYWH/YmFh/2BgYP9fX1//X19f/19fX/9gYGD/YmFh/2FhYf9gYGD+ZmVl/1RSUuIVFBQtCgkJy1paWv+Li4v9h4eH/oiIiP6FhYX+i4uL/pKSkv6Sk5P+kpKS/ouLi/6FhYX+iIiI/oiIiP6Hh4f7lZaW/25tbYQNDQ3OcHBw/5KSkv6Li4v/i4uL/5mZmf+EhIT/ZGRk/1tbWv9kZGT/hISE/5mZmf+Li4v/jY2N/4yMjPyWl5f/iomJjQ4NDc13d3f/m5ub/pWVlf+goKD/XFxc/ygoKP8fHyD/GBsb/yAhIv8pKSn/W1tb/6CgoP+Wlpb/lpaW/J6env+Jh4eMDg4OzX1+fv+ioqL+qqqq/1hYWP8ZGRn/Ghwb/x4dHP8mIh//FhQR/xUWF/8aGhr/WFhY/6urq/+cnJz8pKSk/4qJiYwPDg7Ng4OD/7W1tf6MjIz/Ghoa/xYYGP8uKCb/ZEAo/5xyOP++saL/RD45/xISE/8bGxv/jY2N/6+vr/ypqan/ioiIjA8PD82IiIj/xMTE/l1cXP8LDAz/JiId/1o3LP9ADgD/mGog//Dt6P/VysX/Ih4Z/wsMDf9eXl7/v7+//K6urv+KiYmMEA8PzY+Pj//Kysr+SEhH/wEDBv9MPi7/hlES/3dCAP+VZAn/tJVO/7eVXf9OQTL/AAIE/0pJSf/FxcX8tLS0/4qJiYwQEBDNm5ub/9/e3/5SUlL/AAAA/0M7Mf/aya7/ybiO/5RmEf9aIAD/cjkX/z80KP8AAAD/U1JS/9nZ2fzAwMD/i4qKjBEREc2oqKn/8O/w/oeGhv8AAAD/DAsK/6qkof/17uj/nW8l/14eCf9hPTr/ExUU/wAAAP+Hh4f/6urq/MzMzf+Mi4uMERERzbCwsv/r6uz+3Nzd/yoqKv8AAAD/ExEP/2heU/9yWjv/UD0u/xcXFv8AAAD/Kioq/93d3v/l5eb81NTV/4yLi4wSERHNuLm5/+/v8P7z8/P/xsbG/yAgIP8AAAD/AQEB/wAAAP8BAQH/AAAA/yAgIP/Gxsb/9PT0/+np6vzb29v/jIuLjBIREc2+vb7/+Pj5/uvr7P/7+/v/4ODg/3Nyc/8uLi7/Hh4d/y0sLP9zc3P/4ODg//v7+//s7O3/8/P0/OHg4f+Mi4uLFBMTyMPDw//////7+Pj4/ff29v38/Pz9/////fr6+v3u7u79+vr6/f////38/Pz99/b2/fn5+f37+/v53t7e/5KSko4GBgZ7m5yc//j4+P/w8fH/8fLy//Dw8P/u7u7/8vLy//X19f/y8vL/7u7u//Dw8P/x8vL/8vLy/uXl5f/BwcH+k5GRUAAAAAQeHR1yb25uxn59fcZ9fHzGfXx8xn18fMZ9e3vGfHt7xn17e8Z9fHzGfXx8xn18fMZ9fHzGgH9/xYmIiGVaV1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить фрейм на странице как PNG", func: "WebScreenShotByClick.init", image: "data:image/x-icon;base64,AAABAAEAIBkAAAEAIAAMDQAAFgAAACgAAAAgAAAAMgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29fT/2tra/8jIyP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8jIyP/a2tr/9vX0/+zs7P/ak0b/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/9qTRv/s7Oz/7Ozs/+J9Dv/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+/6SdmP/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/+vn4//z7+v/6+fj/4n0O/+zs7P/s7Oz/4n0O//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/aFtT//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//j39v/ifQ7/7Ozs/+zs7P/ifQ7/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P9oW1P/7+zq/+/s6v/v7Or/8O3r//Dt6//w7ev/8O3r//Dt6//w7ev/8O3r/+/s6v/w7ev/9fTy/+J9Dv/s7Oz/7Ozs/+J9Dv/49/b/+Pf2//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4/2hbU//q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/y8O//4n0O/+zs7P/s7Oz/4n0O//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/aFtT/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe//Dt6//ifQ7/7Ozs/+zs7P/ifQ7/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P9oW1P/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/7uro/+J9Dv/s7Oz/7Ozs/+J9Dv/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx/2hbU//x7+3/8vDv//Hv7f/x7+3/8e/t//Lw7//x7+3/8e/t//Lw7//x7+3/8vDv//Hv7f/29fT/4n0O/+zs7P/s7Oz/4n0O//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//aFtT/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/8vGwf/ifQ7/7Ozs/+zs7P/ifQ7/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f9nWlL/aFtT/2hbU/9nWlL/Z1pS/2hbU/9oW1P/Z1pS/2daUv9oW1P/aFtT/2hbU/9nWlL/pJyX/+J9Dv/s7Oz/7Ozs/+J9Dv/w7ev/8O3r//Dt6//w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Hv7f/w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Dt6//w7ev/4n0O/+zs7P/s7Oz/4n0O/+/s6v/v7Or/7uro/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/u6uj/7+zq/+/s6v/ifQ7/7Ozs/+zs7P/ifQ7/7uro/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7Ojm/+J9Dv/s7Oz/7Ozs/+J9Dv/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/4n0O/+zs7P/s7Oz/4n0O/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/ifQ7/7Ozs/+zs7P/ifQ7/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+J9Dv/s7Oz/7Ozs/+J9Dv/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/4n0O/+zs7P/s7Oz/4n0O/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/ifQ7/7Ozs/+zs7P/ifQ7/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+J9Dv/s7Oz/7Ozs/+J9Dv/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/k39z/4n0O/+zs7P/s7Oz/4n0O/+Lc2f/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/ifQ7/7Ozs/+zs7P/ifQ7/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+J9Dv/s7Oz/9fTy/+J9Dv/8+/r/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/4n0O//X08v/8+/r/6KFU/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ooVT//Pv6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить выбранную область страницы как PNG", func: "WebScreenShotByClipping.init", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAADDn2Hfz5pE/8eVQP7IlkH/yJZB/8iWQf/IlUH/yJVA/8iVQP/IlED/yJQ//8iUP//IlD//yJM+/8iTPv/Hkj3/nI1w//bDbP//8OH//+zW///s1///69b//+rV///p1P//59L//+XQ///izf//38n//9vG///ZxP//1b///dG////Prf/KlkX/88N4/v37///99Pj//fT6//vy9v/68fT/+u/y//rt8P/66u3/+ufq//rl6P/64eT/+93h//3a3//71d7//9LK/86XR//0xHb//vv////18///9fT///f5///4////9f7///P8///v+f//7Pb//+nz///m8f//4eb//9vZ//3Y2v//1Mb/zphH//TGd//+/////Pj1///7///Q58r/m9aV/6TZnv+i15r/otWY/6LTlv+j0pb/mc6M/9DXuf//3+P//Nnc///Wyf/OmUf/9MZ3//7////8+/j//////53WnP+Y5pn/rvGv/6PvpP+e7p//me6b/5nvm/95533/mM+L///j7f/629z//9jL/86ZR//0xnf//v////z9+v//////qtup/8Xzxf/a/tn/z/vO/8n7yf/D+sL/xPvD/6Hzo/+j05b//+Tu//re3///2cz/zplI//XGeP/+/////P36//////+n26f/uvC6/9T71P/K+Mr/xvjG/8D3wP+/+L//nfCf/6LTlf//5u//+t/g///cz//OmUj/9MZ3//7////8/fr//////6rcqv/G9MX/3//f/9n92f/V/NX/0PzQ/9H+0P+s9a7/pdSY///o8f/64OL//9zP/86aSP/0xnf//v////z9+f//////ndid/5TjlP+v7q//qeyp/6jsqf+k7KX/p+6n/4Tlh/+Z0Y7//+r0//rh4v//3tH/zppI//TGd//+/////v77///////Y8Nj/p9+n/6/jr/+t4a3/rd2p/67bpv+u2ab/p9Wc/9jgx///6Oz//OPl///e0f/Omkj/9MV1//7//////fr///78///+/f///////////////////P////j////0+///8fn//+vu///m4v/94+P//97P/86ZSP/zx3v//v/////+/f///////f////v////7////+/////v+///7+///+/f///vz/P/98Pr//+33//3p9///5OL/zppL//a1Sv/0xoL/9cR7//XEfP/1xHz/9cR8//XEfP/1xH3/9cR8//XCev/1wXr/9b94//W9d//1u3X/87l0//y6bP/Llj7/+pMA/vWBAP/1gwD/9YMA//WDAP/1gwD/9YMA//WDAP/1gwD/9YQA//WEAP/1hAD/9YQA//WEAP/zhAH//okA/8qLIv3xpzP/4ptV/+OdU//jnVP/451T/+OdU//jnVP/451T/+OdU//jnVL/451S/+OdUv/jnVL/451S/+GdVf/qnUf/2aRJ/9q0c9/8yn7/98V5/vjGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6/vrIe/+jj2y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { separator: ''},
       { label: "Сохранить значок веб-сайта", func: "saveFavicon", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACPVBMVEX09ff////C3L+Uq8+Vq8+Uqs+Zr9CZrtCZr9Gfu+ear8+mt9JRf8ORxl3t8vfF06+Twojs8/d9otl8o9s+aquZrs/X9KLp8Pft8fZhisf//+DBzN2hveihv+pii8hti9pgicl6oNlojs1zncNsi836/P2duebx8/eYyWqBp+Gn0IKBvlKHsm9qmaVuk8zt7/FEbauEv1Tp7/JdhL9oi9Pl8e2LwlmdsdD7/P76+/3H7ofo8+peh8eHwFaSteZ0pkp2gl7q8/Ohy5OApt2by2eZuOqbuOWaezWuvtd7nN2HvWxul9Ty9feQxV5ljcqBp+JEcLCVtOOo0nR7odx5n9suX6Z1mtBzmtSXyGPv9PewzfOzx+O6zu/s8fd9o95Xfrthi8lYhMN5oNnw9ffw9Pjw9Pf8/f6ewO/m8O9zmdE6aapsjdyUwouPxWPDzd6XteOSs9B5nNVpnpqHt7h/s6F6n9d7ntSTttGHwVh4qp+Ev1HH7ox6qk5wj+Hm8e3t9fOm0IKAtqOBpNrx+P9ljcyhs9FpkM2hv+/u8/fF0eOLu4N+vFKgzX3p9OSFqN13qExekIl4n9j7/P3x9PhxmNDm8e9Vg8Zfkozr8veq0YTX9qL//92AtamOwnHFz96Fot1diMh+pd13ntmatu+YyW/3+/+Tqs5UgcShzJNbhsdTf8GHs7bo8PaXtuqMr+Ty8/SZt+SUqs7r7Ox3ndb9/f7t8feZyXGYyWWCpNbz9PRuiteNtNDn7/V4ntjx8fGo3JqNAAAAv3RSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AEVuhDkAAAD+SURBVBhXY5jHzcUMAqxAICq9bx8D96adDFAgaGQOFOBaH7h7zoqZDTlFyptncAAFWBjyi52CXCI0unRLxcECPhsatbbzmlXMnS60hg0kkOxW0uNrq93tNaFpD1ggUm21QK532ZQdSm1hmXKdDCwdnOWVOi1RjNGMQCCrwMDMJ8NZ4LAynVGPkXFp8zpJBubYmn579wXtqhZb0iwn9a1iWLaViYmJ3891obOwYtLEvcYMGyWAAkwJdv6accEhi8LjGVr11SenpC5f61g3NcO0vjCAIc+DjZ2dnWexddWSbYa9nlkM+8BgWsxsK7FZ1VLzRaACNokmtdnyu1QMQgF7Rlh4zWWTAwAAAABJRU5ErkJggg=="},
       { label: "Запомнить значок веб-сайта как base64", func: "copyFaviconData", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAI2bv/9RVpf/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAACIkvD/Jia6/ywpq/8AAAAAAAAAAAAAAAAAAAD/AAAA/wbwAf90qpv/Ymic/1RWqP9OUKr/W2Ch/2dumf9YYKT/Ly/B/xQP3/8MB9P/JCGb/wAAAAAAAAAAAAAAAAAAAP8G8AH/U5ea/ycr8f8VIP3/HiP4/ywo8v8sIvb/LCL2/ywi9v8KBOj/BQDe/wQAtv8tK4P/AAAAAAAAAAAAAAD/BvAB/3Sqm/9iaJz/Tim3/0UuuP9GPrT/R0ex/zk8uf8gIMz/FRDe/xEMzv8jIJz/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8AAAD/SqOR/yImvP8sLKj/AAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/BvAB/3Sqm/9KW5r/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAABvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAG8AH/AAAAAAAAAP8G8AH/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BvAB/wbwAf8AAAAAAAAA/wAAAP8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAG8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOesQQBjrEGAAaxBwACsQcABrEHDg6xBwAesQcAPrEHAD6xBw8+sQcPprEHD8axBwAGsQQABrEGAAaxB//+sQQ=="},  
       { separator: ''},
       { label: "Сохранить ярлык страницы как…", func: "saveShortcuts('true')", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP8E/yT/BP8k/5XLDv/zqgD/86oA//I1///yNf//86oA//OqAP/zqgD/86oA//OqAP+Vyw7/lcsO/wT/JP8E/yT/BP8k/5XLDv+Vyw7/86oA//OqAP/yNf//8jX///OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//02AP/9NgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/9NgD//TYA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA/wA31v8AN9b/86oA//9If///SH//86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP8AN9b/ADfW//OqAP//SH///0h///OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/5XLDv+Vyw7/86oA//OqAP/zqgD/86oA/0CA//9AgP//86oA/07+9f9O/vX/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP9AgP//QID///OqAP9O/vX/Tv71//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="},
       { label: "Сохранить ярлык страницы без запроса на сохранение", func: "saveShortcuts", image:"data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP8E/yT/BP8k/5XLDv/zqgD/86oA//I1///yNf//86oA//OqAP/zqgD/86oA//OqAP+Vyw7/lcsO/wT/JP8E/yT/BP8k/5XLDv+Vyw7/86oA//OqAP/yNf//8jX///OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//02AP/9NgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/9NgD//TYA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA/wA31v8AN9b/86oA//9If///SH//86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP8AN9b/ADfW//OqAP//SH///0h///OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/5XLDv+Vyw7/86oA//OqAP/zqgD/86oA/0CA//9AgP//86oA/07+9f9O/vX/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP9AgP//QID///OqAP9O/vX/Tv71//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="},
       { separator: ''},
       { label: "Запомнить изображение как base64, в контекстном меню", value: "Save.WebScreenShotOnImage"},
       { label: "Сохранить выделенный текст в файл, в контекстном меню", value: "Save.SelectionToFile" },
       { label: "Открыть выделенный текст в внешнем редакторе, в контекстном меню", value: "Save.TextToEditor"},
            ];

var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m ) {
     if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
     var mItem = document.createElement("menuitem");
     mItem.setAttribute("label", m.label);
     mItem.setAttribute("class", "menuitem-iconic");
     if ( "image" in m ) mItem.setAttribute("image", m.image);
     if ( "value" in m ) { 
          mItem.setAttribute('type', 'checkbox');
          mItem.setAttribute('checked', custombuttons.getPrefs(m.value) );
          mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');                                                      
          }              
     if ( "func" in m ) mItem.addEventListener("command", function(e) { eval(m.func + '(' + ')') }, false);
     menuPopup.appendChild( mItem );
});
addDestructor(function() { menuPopup.parentNode.removeChild( menuPopup ) });



// Сохранить как PNG ................................
WebScreenShot = {
        capture : function(win, x, y, width, height, isCopy){
                var mainWindow = document.getElementById('main-window');
                var scrollbox = document.createElement('scrollbox');
                scrollbox.width = '1';
                scrollbox.height = '1';
                mainWindow.appendChild(scrollbox);
                var canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
                canvas.style.display = 'inline';
                canvas.width = width;
                canvas.height = height;
                scrollbox.appendChild(canvas);

                var ctx = canvas.getContext("2d");
                try {
                    ctx.clearRect(0, 0, width, height);
                    ctx.save();
                    ctx.scale(1.0, 1.0);
                    ctx.drawWindow(win, x, y, width, height, "rgb(255,255,255)");
                    ctx.restore();
                    }
                 catch(e) {
                           alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", button.label, "Не могу сохранить, слишком большая страница", false, "", null, ""); 
                           mainWindow.removeChild(scrollbox);
                           }
                 var url = canvas.toDataURL("image/png");
                 var url = iosService.newURI(url, null, null);
                 var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
                 fp.init(window, "Сохранить как…", fp.modeSave);
                 fp.appendFilters( fp.filterImages );
                 fp.defaultExtension = "png";
                 fp.defaultString = getDocTitle() + ".png";
                 if ( fp.show() == fp.returnCancel || !fp.file ) return;
                 var wbp = Cc['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'].createInstance(Ci.nsIWebBrowserPersist);
                 parseInt(Application.version) < 36
                 ? wbp.saveURI(url, null, null, null, null, fp.file, null)
                 : wbp.saveURI(url, null, null, null, null, null, fp.file, null); // если FF36+
        },
        captureAll : function() {
                var win = content;
                WebScreenShot.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY);
        },
        capturePage : function() {
                var win = content, doc = win.document, body = doc.body, html = doc.documentElement;
                var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft;
                var scrY = (body.scrollTop || html.scrollTop) - html.clientTop;
                WebScreenShot.capture(win, scrX, scrY, win.innerWidth, win.innerHeight);
        },
        // Запомнить изображение на странице как base64 ....
        onImage : function(image) {
                var canvas = document.createElementNS(xhtmlns, 'canvas');
                canvas.width = image.naturalWidth;
                canvas.height = image.naturalHeight;
                var ctx = canvas.getContext('2d');
                ctx.drawImage(image, 0, 0);
                var base64 = canvas.toDataURL();
                gClipboard.write( base64 );
                
                // стиль для изображение на сплывающей подсказке ....
                var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
                var uri = makeURI('data:text/css,'+ encodeURIComponent('#alertImage { height: 25px !important; width: 25px !important; }'));
                sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
                // обработчик удаляет стиль если сплывающая подсказка закрывается ....
                var listener = {
                         observe: function(subject, topic, data) {
                            if ( topic == 'alertfinished') sss.unregisterSheet(uri, sss.USER_SHEET);
                         }
                }
                // всплывающая подсказка ....
                alertsService.showAlertNotification( base64, button.label, "Запомнил изображение как base64", false, "data", listener, "");
         },
};
// Сохранить выбранную область страницы как PNG ....
WebScreenShotByClipping = {
        capture : WebScreenShot.capture,
        handleEvent : function(event){
                if (event.button != 0) return false;
                event.preventDefault();
                event.stopPropagation();
                switch(event.type){
                        case 'mousedown':
                                this.downX = event.pageX;
                                this.downY = event.pageY;
                                this.bs.left = this.downX + 'px';
                                this.bs.top  = this.downY + 'px';
                                this.body.appendChild(this.box);
                                this.flag = true;
                                break;
                        case 'mousemove':
                                if (!this.flag) return;
                                this.moveX = event.pageX;
                                this.moveY = event.pageY;
                                if (this.downX > this.moveX) this.bs.left = this.moveX + 'px';
                                if (this.downY > this.moveY) this.bs.top  = this.moveY + 'px';
                                this.bs.width  = Math.abs(this.moveX - this.downX) + 'px';
                                this.bs.height = Math.abs(this.moveY - this.downY) + 'px';
                                break;
                        case 'mouseup':
                                this.uninit();
                                break;
                }
        },
        init : function(){
                this.win = document.commandDispatcher.focusedWindow;
                if (this.win == window) this.win = content;
                this.doc = this.win.document;
                this.body = this.doc.body;
                if (!this.body instanceof HTMLBodyElement){
                        alert("Can not capture.");
                        return false;
                }
                this.flag = null;
                this.box = this.doc.createElement('div');
                this.bs = this.box.style;
                this.bs.border = '#0f0 dashed 2px';
                this.bs.position = 'absolute';
                this.bs.zIndex = '2147483647';
                this.defaultCursor = getComputedStyle(this.body, '').cursor;
                this.body.style.cursor = 'crosshair';
                this.doc.addEventListener('mousedown', this, true);
                this.doc.addEventListener('mousemove', this ,true);
                this.doc.addEventListener('mouseup', this ,true);
                this.doc.addEventListener('click', this, true);
        },
        uninit : function(){
                var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)];
                this.doc.removeEventListener('mousedown', this, true);
                this.doc.removeEventListener('mousemove', this, true);
                this.doc.removeEventListener('mouseup', this, true);
                this.doc.removeEventListener('click', this, true);
                this.body.style.cursor = this.defaultCursor;
                this.body.removeChild(this.box);
                this.capture.apply(this, pos);
        },
};
// Сохранить фрейм на странице как PNG ....
WebScreenShotByClick = {
        capture : WebScreenShot.capture,
        getPosition : function(){
                var html = this.doc.documentElement;
                var body = this.doc.body;
                var rect = this.target.getBoundingClientRect();
                return [
                        this.win
                        , Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft
                        , Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop
                        , parseInt(rect.width)
                        , parseInt(rect.height)
                ];
        },
        highlight : function(){
                this.orgStyle = this.target.hasAttribute('style')? this.target.style.cssText : false;
                this.target.style.cssText += 'outline: red 2px solid; outline-offset: 2px; -moz-outline-radius: 2px;';
        },
        lowlight : function(){
                if (this.orgStyle) this.target.style.cssText = this.orgStyle;
                else this.target.removeAttribute('style'); 
        },
        handleEvent : function(event){
                switch(event.type){
                        case 'click':
                                if (event.button != 0) return;
                                event.preventDefault();
                                event.stopPropagation();
                                this.lowlight();
                                var pos = this.getPosition();
                                this.capture.apply(this, pos);
                                this.uninit();
                                break;
                        case 'mouseover':
                                if (this.target) this.lowlight();
                                this.target = event.target;
                                this.highlight();
                                break;
                }
        },
        init : function(){
                this.win = content;
                this.doc = content.document;
                this.doc.addEventListener('mouseover', this, true);
                this.doc.addEventListener('click', this, true);
        },
        uninit : function(){
                this.doc.removeEventListener('mouseover', this, true);
                this.doc.removeEventListener('click', this, true);
        },
};


 
// Сохранить ярлык страницы в указанную папку или в последнюю папку сохранения ................................
function saveShortcuts( saveAs ) {
  
     // блокируем создание ярлыков для внутреных страниц FF ....  
     if ( !getDocTitle() ) {   
          alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", button.label, "Не поддерживается", false, "", null, "");
          return;
          }
          
     var pref = "Save.pathToSaveShortcuts";
     var fileName = saveAs ? pathToFile( pref ) : false;
     if ( saveAs && !fileName ) return;        
                  
     // если у таба есть иконка сохранить иконку таба в установленную папку ....
     var favicon = /\.jpg/.test(content.location) ? false : gBrowser.mCurrentTab.image;
     var faviconName = "favicon" + Math.round(Math.random()*1000000000);     
     if ( favicon ) saveFaviconToFolder( faviconName );
     
     /* получить путь для сохранения из 'about:config', добавытъ заголовок страницы и название домена 
        или установленное вручную имя файла и создать ярлык ....*/
     var pathToFolder = Application.prefs.getValue( pref, 0);
     var siteName = addSiteNameToShortcuts ? getSiteName() : "";
     var shortcutName = (!!fileName) ? fileName : ( siteName + getDocTitle() + getCurrentTopicNumber() );
     var path = pathToFolder + shortcutName + ".url";     
     file.initWithPath( path ); 
    
     // адрес страницы в UTF-8 если это протокол 'file' или в 'Punycode' если это .рф домен .... 
     var url = content.document.location;   
     if ( url.protocol == 'file:' ) var url = convertFromUnicode("UTF-8", url);   
     else if ( url.host.slice(-3) == '.рф') var url = Services.io.newURI(url, null, null).asciiSpec;
     
     // текст ярлыка из адреса страницы и пути к иконке таба( если она была ) ....     
     var shortcut = "[InternetShortcut]" + "\r\n" + "URL=" + url;
     var faviconPath = "IconFile=C:\\Documents and Settings\\Favicon\\" + faviconName + ".ico" + "\r\n";
     if ( !favicon ) var faviconPath = "";
     var data = shortcut + "\r\n" + faviconPath + "IconIndex=0";      

     // записать текст в ярлык ....
     foStream.init(file, 0x02|0x08|0x20, 0666, 0);
     foStream.write(data, data.length);
     foStream.close();

     // подсказка ....
     var notification = 'Сохранил ярлык страницы в ' + pathToFolder;
     var image = favicon ? favicon : button.image;
     alertsService.showAlertNotification( image, getDocTitle(), notification, false, "", null, "" );
};



// Установка пути и названия для сохранения ярлыка через диалог сохранения, если отмена отдаст 'false' ................................
function pathToFile( pref ) {     

     // получить предыдущий путь для сохранения из 'about:config' или диск C: ....
     var pathToFile = Application.prefs.getValue( pref, 0 );
     var pathToFile = ( pathToFile == 0 )? "C:\\": pathToFile;

     // диалог создания и установки пути ....     
     var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
     fp.init(window, "Укажите путь к файлу и его название!", fp.modeSave);
     fp.appendFilters( fp.filterAll );
     fp.defaultString = getSiteName() + getDocTitle() + getCurrentTopicNumber();
     file.initWithPath( pathToFile );
     fp.displayDirectory = file;
     
     if ( fp.show() == fp.returnCancel ) return false;
          // убрать название файла из пути к файлу и записать путь в 'about:config' ....
          var filePath = fp.file.path.toString();
          var fileName = fp.file.leafName.toString();
          Application.prefs.setValue( pref, filePath.replace( fileName, "" ) );
         
          return fileName;
};



// Сохранить в указаную папку иконку таба как .ico и без диалога сохранения ................................
function saveFaviconToFolder( faviconName ) {

     var path = "C:\\Documents and Settings\\Favicon\\";
     var favicon = gBrowser.mCurrentTab.image;
     var uri = iosService.newURI( favicon, null, null );

     // создать папку если не существует ....
     file.initWithPath( path );
     if ( !file.exists() || !file.isDirectory() ) file.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
     
     // конвертировать в .ico файл иконку таба и сохранить, спасибо Dumby за этот код ....  
     var path = path + faviconName + ".ico";
     const xhtml = "http://www.w3.org/1999/xhtml";
     var img = document.createElementNS(xhtml, "img");
     var canvas = document.createElementNS(xhtml, "canvas");
     img.src = uri.spec;
     img.onload = function() {

     var width = img.width, height = img.height;
     if (width > 255 || height > 255) return;
     canvas.width = width; canvas.height = height;
     var context = canvas.getContext("2d");
     context.drawImage(img, 0, 0);
     var arr = context.getImageData(0, 0, width, height).data;

     var data = [];
     for ( var y = 0, l = height * 4; y < l; y += 4 ) {
           for ( var x = width * 4; x > 0; x -= 4 ) {
             var pos = x + y * width - 1;
             data.unshift(arr[pos - 1], arr[pos - 2], arr[pos - 3], arr[pos])
             }
        }
     function byte(num) {
            var str = num.toString(2);
            var l = str.length;
            var bytes = [];
            for ( var i = 1; i <= 3; i++ ) {
              var sub = str.substring(l - i * 8, l - (i - 1) * 8);
                  if ( !sub ) sub = "0";
              bytes[i] = parseInt(sub, 2);
              }
          return bytes;
        }
     var bytesLength = byte(data.length + 40);
     var bytesHeight = byte(height * 2);

     var header = [0,0, 1,0, 1,0, img.width, img.height, 0, 0, 1,0, 0,0 , bytesLength[1],bytesLength[2],bytesLength[3],0, 22,0,0,0];
     var info = [40,0,0,0,img.width,0,0,0,bytesHeight[1],bytesHeight[2],0,0,1,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
     var ico = header.concat(info, data);
     file.initWithPath(path);
     var bStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
     foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0);
     bStream.setOutputStream( foStream );
     bStream.writeByteArray(ico, ico.length);
     bStream.close();
     foStream.close();
     }
};



// Добавить адрес наверху страницы и открыть диалог сохранения страницы ................................
function savePage() {
     var sURL = gURLBar.value;
     content.document.body.innerHTML = "<table width=100%><tr><td align=left><small><a target=_blank href=" + 
                                        sURL + ">"+ sURL + "</a></small>\n</td></tr></table>" + content.document.body.innerHTML;
     saveDocument(window.content.document);
};



// Сохранить иконку текущего сайта с диалогом сохранения ................................
function saveFavicon() { saveImageURL(gBrowser.mCurrentTab.image, "save", null, false, false, null, content.document) };



// Скопировать иконку текущего сайта как base64 код ................................
function copyFaviconData() PlacesUtils.favicons.getFaviconDataForPage(
   gBrowser.currentURI,
   function( uri, len, arr, mmt ) {
      if ( !len ) {
           alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", "Save", "Не поддерживается");
           return;
           }
       var base64 = "data:" + mmt + ";base64," + btoa(String.fromCharCode.apply(null, arr))
       gClipboard.write( base64 );
       alertsService.showAlertNotification(base64, "Save", "Запомнил значок веб-сайта как base64");
    }
);



// Сохранить выделенный текст или весь текст на странице как txt файл ................................
function saveSelectionToTxt() {
 
     var sel = getSelect();
     if ( !sel ) document.getElementById("cmd_selectAll").doCommand(); 
     
          // создать название файла из заголовка страницы и текущего времени и сохранить текст ....
     var fileTitle = (getDocTitle() ? getDocTitle() : self.label) + '  ' + (new Date()).toLocaleFormat("%H·%M·%S");
     saveURL("data:text/plain," + encodeURIComponent((content.location.href.startsWith('data:') ? "" : (content.location.href + "\r\n\r\n")) + getSelect()), 
                                  fileTitle + ".txt", null, false, false, null, content.document);

     if ( !sel ) goDoCommand("cmd_selectNone"); 
};



// Сохраняет страницу как PDF файл через сервис 'pdfmyurl.com' ................................
function savePageToPDF() {
   // разрешить страницу для расширения NoScript ....   
   if ( "noscriptUtil" in window ) {
        var autoReload = custombuttons.getPrefs("noscript.autoReload");
        if ( autoReload ) custombuttons.setPrefs("noscript.autoReload", false);
        noscriptOverlay.allowPage();
        if ( autoReload ) setTimeout(function() { custombuttons.setPrefs("noscript.autoReload", true) }, 10)
        }
   // сохранить ....     
   var loc = content.location;
   if (loc.protocol.slice(0, 4) == "http")
   loadURI("http://pdfmyurl.com?url=" + loc);
};    


 
// Добавляем в контекстного меню страницы новые пункты ................................
var contextMenu = document.getElementById("contentAreaContextMenu");

// блокировать дублирование новых пунктов
try { ["baseItem", "saveItem", "editorItem"].forEach(function(n) { contextMenu.removeChild( document.getElementById("content-" + n ) ) }); }
catch(e) { }; 
                              
// в контекстного меню изображений ....
var baseItem = document.createElement("menuitem");
baseItem.id = "content-baseItem";
baseItem.setAttribute("label", "Запомнить изображение как base64");
baseItem.setAttribute("oncommand", "WebScreenShot.onImage( gContextMenu.target )");
contextMenu.appendChild( baseItem ); // как последний пункт меню 

// в контекстного меню выделенного текста ....
var saveItem = document.createElement("menuitem");
saveItem.id = "content-saveItem";
saveItem.setAttribute("label", "Сохранить выделенный текст в файл");
saveItem.setAttribute("oncommand", "document.getElementById('" + this.id + "').saveSelectionToFile()");
contextMenu.insertBefore( saveItem, document.getElementById("context-sep-open") ); // как первый пункт меню 

var editorItem = document.createElement("menuitem");
editorItem.id = "content-editorItem";
editorItem.setAttribute("label", "Открыть выделенный текст в внешнем редакторе");
editorItem.setAttribute("oncommand", "document.getElementById('" + this.id + "').textToEditor()");
contextMenu.insertBefore( editorItem, document.getElementById("context-sep-open") ); // как первый пункт меню 

// устанавливаем где и при каких настройках показывать новые пункты контекстного меню ....
function handlePopupshowing(e) {
   if ( e.target != e.currentTarget ) return;
   var sel = gContextMenu.isTextSelected;;
   saveItem.hidden = !sel || !cbu.getPrefs("Save.SelectionToFile");
   editorItem.hidden = !sel || !cbu.getPrefs("Save.TextToEditor"); 
   baseItem.hidden =  !gContextMenu.onImage || !cbu.getPrefs("Save.WebScreenShotOnImage"); 
}        
addEventListener('popupshowing', handlePopupshowing, false, contextMenu );



// Запомнить изображение как base64 если нажать правой kлавышей мыши в контекстном меню на пункт 'Сохранить изображение как' ................
function handleClick(e) {
   if ( e.button !== 2 ) return;
   WebScreenShot.onImage( gContextMenu.target );
   document.getElementById("contentAreaContextMenu").hidePopup();
};
addEventListener("click", handleClick, false, document.getElementById("context-saveimage") );



// Сохранить выделенный текст в файл на рабочем столе ................................
this.saveSelectionToFile = function() {
     var text = convertFromUnicode("UTF-8", getSelect() ); 
     var textTitle = convertFromUnicode("UTF-8", getDocTitle() ); 
     var time = (new Date()).toLocaleFormat("%H:%M:%S");
     
     // адрес страницы( в UTF-8 если это .рф домен ) ....
     var url = content.document.location;
     if ( /\.рф/.test( url.host ) ) var url = convertFromUnicode("UTF-8", url );
     
     /* создать текст для записи из заголовка страницы и текущего времени,
        адреса страницы и выделенного текста .... */    
     var line = "............................................................................" + "\n";
     var text = line + textTitle + " - " + time + "\n" + url + "\n\n" + text + "\n\n\n";

     // путь к файлу и название файла....
     var file = directoryService.get("Desk", Components.interfaces.nsIFile); 
     file.append("Save - " + (new Date()).toLocaleFormat("%d.%m.%Y") + ".txt");
          
     // создать файл с текстом или добавлять текст в файл ...
     !file.exists() ? foStream.init(file, 0x02|0x08|0x20, 0666, 0) : foStream.init(file, 0x02 | 0x10, 0664, 0);
     foStream.write(text, text.length);
     foStream.close();

     // всплывающая подсказка дает возможность открыть файл если кликнуть на подсказке ....
     var listener = {
         observe: function(subject, topic, data) {
              if ( topic == 'alertclickcallback') file.launch(); // oткрыть файл
         }
     };
     var notification = 'Сохранил выделенный текст в файл на рабочий стол'; 
     var image = gBrowser.mCurrentTab.image ? gBrowser.mCurrentTab.image : button.image;
     alertsService.showAlertNotification( image, notification, "Открыть файл", true, "", listener, "" );
};



/* Функция создаст текстовой файл в папке custombuttons в папке профиля 
   и запишет в файл выделенный текст и откроет файл в редакторе ................................ */
this.textToEditor = function() {
     var text = convertFromUnicode("UTF-8", getSelect() ); 
   
     // устанавить путь к файлу, записать текст, открыть файл ....
     var file = directoryService.get("ProfD", Ci.nsIFile);
     file.append("custombuttons");
     file.append("TextToEditor.txt");     
     foStream.init(file, 0x02|0x08|0x20, 0666, 0);
     foStream.write(text, text.length);
     foStream.close();     
     file.launch(); 
};



// Получить название домена с заглавным первым символом и без приставок( типа .ru и .com ) ................................
function getSiteName() {
     try { var domain = Cc['@mozilla.org/network/effective-tld-service;1'].getService(Ci.nsIEffectiveTLDService)
                                  .getBaseDomain( content.document.documentURIObject ) }
     catch(e) { return "" };                                                                                        
     
     var num = domain.length;     
     if ( domain.slice(num-3, num-2) == '.' ) var siteName = domain.slice(0, num-3); 
     if ( domain.slice(num-4, num-3) == '.' ) var siteName = domain.slice(0, num-4);

     var siteName = siteName.charAt(0).toUpperCase() + siteName.slice(1);

     return siteName + " "; 
};



// Получить номер топика из текущей страницы если он есть иначе ничего ................................
function getCurrentTopicNumber() {
     var currUrl = content.location.toString();
     var array = currUrl.split('=');
     var num = array.length

     if ( num == 1 ) return '';
     
          var val = ( ((num > 2)? ('  ' + array[num-2]): '') + ' - ' + array[num-1]);          
          // заменить недопустимые символы и удалить лишние пробелы 
          var val = val.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");          
          
          return val;
};



/* Получить заголовк страницы или название домена если заголовка у страницы нет
   или название вкладки если домена нет ................................ */
function getDocTitle() {
     var protocol = content.location.protocol;
     if ( ["about:", "chrome:", "jar:", "data:"].indexOf( protocol ) !== -1 ) return false;  
          var docTitle = content.document.title || content.document.domain || gBrowser.mCurrentTab.label;       
          
          // заменить недопустимые символы и удалить лишние пробелы 
          var docTitle = docTitle.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " "); 

          return docTitle.slice(0, 50);
};


    
// Функция отдаст выделенный текст из страницы или текстового поля, если текст не выделен отдаст 'false' ................................
function getSelect() {
     // выделенный текст из страницы ....
     var selection = document.commandDispatcher.focusedWindow.getSelection();
     var anchor = (selection.anchorNode !== null)? selection.anchorNode: false;

     // выделенный текст из 'PRE' ....
     if ( anchor && anchor.parentNode.tagName == 'PRE' ) { 
          var node = selection.focusNode;
          var startPos = selection.anchorOffset;
          var endPos = selection.focusOffset;
          var selection = node.data.substring(startPos, endPos); 
          }
     // выделенный текст из текстового поля ....
     if ( selection.toString().length == 0 ) {
          var theBox = document.commandDispatcher.focusedElement;
         
          if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { 
               var startPos = theBox.selectionStart;
           var endPos = theBox.selectionEnd;
           var selection = theBox.value.substring(startPos, endPos);  
               }
          }
     // исправляем проблему с переносом текста новую строку в стандартном win блокноте ....
     if ( selection.toString().length !== 0 ) {
          var selection = selection.toString();
          var selection = selection.replace(/\u000A/g, "\u000D\u000A");
          var selection = selection.replace(/\u000D\u000D\u000A/g, "\u000D\u000A");     
          }
    
     return ( selection == '') ? false : selection;
};

Отредактировано broker (24-11-2016 13:11:12)

Отсутствует

 

№159724-11-2016 13:29:39

manuk
Участник
 
Группа: Members
Зарегистрирован: 17-10-2010
Сообщений: 202
UA: Firefox 48.0

Re: Обсуждение кнопок CB

broker, давно исправили. Поищи Save+, от 13.09.2016.

Отсутствует

 

№159824-11-2016 17:52:45

broker
Участник
 
Группа: Members
Зарегистрирован: 23-06-2015
Сообщений: 98
UA: unknown 0.0

Re: Обсуждение кнопок CB

manuk
Не знал,спасибо за подсказку.

Отсутствует

 

№159927-11-2016 12:24:56

bezuma
Участник
 
Группа: Members
Откуда: Москва
Зарегистрирован: 26-01-2014
Сообщений: 153
UA: Firefox 50.0

Re: Обсуждение кнопок CB

В [firefox]50 перестало работать перетаскивание закладок в [CB] Session Manager :( Чертовски неудобно стало. Нельзя ли поправить?

Отсутствует

 

№160027-11-2016 14:15:22

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4780
UA: Firefox 24.0

Re: Обсуждение кнопок CB

bezuma пишет:

В [firefox]50 перестало работать перетаскивание закладок в [CB] Session Manager

А где можно найти [CB] Session Manager?

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2011 Mozilla Russia
Язык отображения форума: [Русский] [English]