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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№1295118-11-2018 00:09:28

suz191
Участник
 
Группа: Members
Зарегистрирован: 03-01-2017
Сообщений: 61
UA: Firefox 63.0

Re: Custom Buttons

Пока исправят кнопки, выйдет новый ff и опять всё отвалится. Мартышкин труд, блин.

Я уже устал от этого FF... Проблема на проблеме! Постоянные костыли... А самое главное что проц жрет не померно и память засирает!
Попытался уйти с relaes на esr так теперь и тут палки в колесах... Переход просто так не возможен...
Отваливаются все контейнеры исчезли значки дополнений! Это вообще какой-то кошмар!:sick:

Отредактировано suz191 (18-11-2018 00:09:56)

Отсутствует

 

№1295218-11-2018 08:09:16

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 228
UA: Firefox 63.0

Re: Custom Buttons

suz191

исчезли значки дополнений

удалить extensions.json в папке профиля

Отсутствует

 

№1295318-11-2018 08:46:53

suz191
Участник
 
Группа: Members
Зарегистрирован: 03-01-2017
Сообщений: 61
UA: Firefox 63.0

Re: Custom Buttons

momo2000 пишет

suz191

исчезли значки дополнений

удалить extensions.json в папке профиля

Да! Это решило вопрос с дополнениями! Появились! Спасибо огромное :) А контейнеры и куки перекинуть как-нибудь можно?

Добавленно!

Всё я прикрутил... Ура... :lol:

Контейнеры и куки не отвалились... Если кому интересно метод ниже :blush:


скрытый текст
Правим containers.json

Берем из профиля RELEAS у вас там будут свои цифры! Главное чтоб начало и конец не изменились в ESR, а само описание контейнеров подставляем из нужного!

{"version":2,"lastUserContextId":12,"identities": это начало забираем эту середину тут конец ,{"userContextId":42434545695,"public":false,"icon":"","color":"","name":"userContextIdInternal.webextStorageLocal","accessKey":""}]}

Правим в профиле ESR

{"version":8,"lastUserContextId":9,"identities": это начало вставляем её сюда тут конец ,{"userContextId":9,"public":false,"icon":"","color":"","name":"userContextIdInternal.thumbnail","accessKey":""}]}

Не забываем добавить к профилю cookies.sqlite
собственно все можно пользоваться, после этого куки и контейнеры не исчезнут! :D
Мы только что перешли с releas на esr без потерь и потерпевших :)


Найден еще один глюк!

Не работает клик правой кнопки Исследовать элемент

Востанвливаем

скрытый текст
Открываем ваш prefs.js
Открываем prefs.js из чистого проинстсталированного профиля ESR
Ищем всем пункты начинающие со слова devtools они все идут в одном ряду
Пример:
user_pref("devtools.chrome.enabled", false);

Забираем их из чистого и ставим в prefs.js вместо своих которые там есть и плевать что их там больше чем в новом. Выделяйте все и ставьте другие. :)
Всё кнопка работает! Исследовать страничку можно))))


Посижу недельку посмотрю лучше ли он! Во всяком случае возьни должно быть меньше :)
А то вот честно достали они уже, то нос удлинят, то уши пришьют, а то другое место бывает укоротят... :blush:
Всем спасибо Огромное!!!

Отредактировано suz191 (25-11-2018 08:47:13)

Отсутствует

 

№1295421-11-2018 14:06:52

ezh
Участник
 
Группа: Members
Зарегистрирован: 17-11-2017
Сообщений: 19
UA: unknown 0.0

Re: Custom Buttons

Подскажите, плз, а как перенести все кнопки из старого профиля в новый?
Я не нашел никаких опций для импорта/экспорта. :(
Надо только кнопки перенести из старого профиля..

Ещё проблема, скопировал плагин из старого профиля в новый, вручную 1 кнопку перенес, всё точно также, а она не работает.

Отредактировано ezh (21-11-2018 14:45:16)

Отсутствует

 

№1295521-11-2018 16:06:34

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 55.0

Re: Custom Buttons

ezh пишет

Подскажите, плз, а как перенести все кнопки из старого профиля в новый?

В папке старого профиля скопируй папку custombuttons и вставь в новый профиль, само расширение уже должно быть установлено. А потом нужные кнопки выведи на панели.

Отсутствует

 

№1295622-11-2018 17:02:20

drage2
Забанен
 
Группа: Members
Откуда: Донецк
Зарегистрирован: 23-11-2017
Сообщений: 392
UA: Firefox 63.0

Re: Custom Buttons

Господа специалисты опять лажа , не работает context Search в 63... Где там собака зарыта?

скрытый текст
/*Initialization Code*/
// Context Search, от 29.01.2014. ................................
(function () {
   var searchService = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); 

   var searchSelect = document.getElementById('context-searchselect'); 
   searchSelect.collapsed = false; // удалить стандартный пункт меню для поиска

   
   // Создать новый пункт меню для поиска ....
   var contextMenu = document.getElementById("contentAreaContextMenu");
   var menu = contextMenu.insertBefore( document.createElement('menu'), searchSelect ); // над каким пунктом меню показывать
   menu.setAttribute("class", "menu-iconic");
   
   // устанавливать иконку, название и поисковик для нового пункта меню
   function setMenu() { 
      menu.engine = searchService.currentEngine;
      menu.setAttribute("label", "Искать в...");
         };
   setMenu();   

   // наблюдатель за стандартным пунктом меню 'Копировать' прячет меню поиска
   var copy = document.getElementById('context-copy'); 
   var setHiddenMenu = new MutationObserver(function() {
          menu.hidden = copy.hidden || copy.disabled;         
   });
   setHiddenMenu.observe( copy, { attributes: true, attributeFilter: ["hidden", "disabled"] } );
   
   
   // Создать подменю с поисковиками .... 
   var menuPopup = menu.appendChild( document.createElement("menupopup") ); 
   menuPopup.setAttribute('style', 'overflow: scroll'); 
     
   // создать пункты в подменю
   function setItemsToMenuPopup(e) {
      menuPopup.textContent = "";     

      var engines = searchService.getVisibleEngines({});
      engines.forEach(function( engine ) {
         var mItem = document.createElement("menuitem");
         mItem.setAttribute("label", engine.name );
         mItem.setAttribute("class", "menuitem-iconic");
         mItem.setAttribute("src", engine.iconURI.spec );
         mItem.engine = engine;
         menuPopup.appendChild( mItem );
      });

   }; 
   setItemsToMenuPopup();
   
   
   // Установить действие для клика на меню и подменю ....
   menu.setAttribute("onmouseup", "\
      var background = ( event.button == 0 ) ? false : true;\
      var clip = gClipboard.read();\
      goDoCommand('cmd_copy');\
      setTimeout(function() {\
         document.getElementById('contentAreaContextMenu').hidePopup();\
         var submission = event.target.engine.getSubmission( gClipboard.read(), null );\
         gBrowser.loadOneTab( submission.uri.spec, null, null, submission.postData, background, false );\
         gClipboard.write( clip );\
      }, 0);\
   ");     
       
   
   // Наблюдатель за изменениями в поисковиках пересоздаёт меню и подменю .... 
   var getEngineModified = {
      observe: function(subject, topic, data) { 
         if ( /changed|removed|current/.test( data ) ) { setMenu(); setItemsToMenuPopup() };             
      }
   };
   Services.obs.addObserver( getEngineModified, "browser-search-engine-modified", false );   
   
   
   // Удалять наблюдатели и меню, показать стандартный пункт ....
   addDestructor(function() {
      contextMenu.removeChild( menu );           
      setHiddenMenu.disconnect();
      Services.obs.removeObserver( getEngineModified, "browser-search-engine-modified", false );
       
      searchSelect.collapsed = false; 
   });   

})(document.getElementById("contentAreaContextMenu") );

Отсутствует

 

№1295724-11-2018 04:05:18

suz191
Участник
 
Группа: Members
Зарегистрирован: 03-01-2017
Сообщений: 61
UA: Firefox 60.0

Re: Custom Buttons

drage2
Переходите на ESR с этого релизистого мутанта:sick::usch::rolleyes: Пока они полностью совместимы и имеют одинаковую обертку... В ESR практически все работает и он кушает поменьше ресурсов. Там ещё ни кто не нагадил пока... :blush::music:

Отредактировано suz191 (24-11-2018 04:15:46)

Отсутствует

 

№1295824-11-2018 05:10:45

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 592
UA: unknown 0.0

Re: Custom Buttons

suz191 пишет

Переходите на ESR

Я тоже долго мудохался, а потом перешел на WаterFox. Ето по сути та же  ESR но основан на ФФ 56.

Отсутствует

 

№1295924-11-2018 06:14:10

suz191
Участник
 
Группа: Members
Зарегистрирован: 03-01-2017
Сообщений: 61
UA: Firefox 60.0

Re: Custom Buttons

Ultima2m
Я ушел на BASILISK т.к. там не изгажен imakros, и полностью работает Custom Buttons, а основной браузер с соц сетями перевел из RELEAS в ESR там тоже Custom Buttons работает нормально и нет бреда с изменением функций.
WаterFox тоже можно попробовать, тоже хороший баузер, менее прожорливый и почти тот же ESR только немного пониже :)
Может когда люди по убегают до них хоть дойдет, что они творят :D Хотя и это не поможет это мировая тенденция засрать все так, чтоб комп зависал и вы бежали покупать новую технику!:music:

Отредактировано suz191 (24-11-2018 06:22:38)

Отсутствует

 

№1296029-11-2018 19:55:45

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 62.0

Re: Custom Buttons

Как можно сделать так, чтобы он не обращался к локальным путям... а обращался сразу с профиля или с папки [firefox]?
Что надо изменить в_var file=Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);

Выделить код

Код:

try{document.getElementById("context-viewimage").setAttribute("onclick","gBrowser.selectedTab=gBrowser.addTab(checkForMiddleClick(this,event))");}
catch(e){ };var closer={observe: function(subject,topic,data){if(data=="shutdown"){
            var file=Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
file.initWithPath("X:\\Firefox\\Profile\\g.vbs");file.launch();
//file.initWithPath("..\\Profile\\g.vbs");file.launch(); //вот как тут
file.initWithPath("X:\\Firefox\\Profile\\SQL.vbs");file.launch();}}};
Services.obs.addObserver(closer,"quit-application",false); /**/

Upd: Спасибо Vitaliy V.

Выделить код

Код:

//[+?] AutoDelSql+trash
try{document.getElementById("context-viewimage").setAttribute("onclick","gBrowser.selectedTab=gBrowser.addTab(checkForMiddleClick(this,event))");}
catch(e){};var closer={observe:function(subject,topic,data){if(data=="shutdown"){
var file=Services.dirsvc.get("ProfD",Ci.nsIFile); //file.append("g.vbs");
file.append("SQL.vbs");if(file.exists())file.launch();}}};
Services.obs.addObserver(closer,"quit-application",false); /**/

Отредактировано func4ptch4 (01-12-2018 20:27:20)

Отсутствует

 

№1296101-12-2018 12:36:49

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 388
UA: Firefox 52.0

Re: Custom Buttons

Как автоматически вырезать текст из заголовков вкладок, ненужное начало типа: Смотреть бесплатно… | Форум 'название'… и т.п?

или просто приведите пример изменения заголовка вкладки по событию: addEventListener('TabOpen'…

Отсутствует

 

№1296201-12-2018 13:25:53

okkamas_knife
We are the Borg.       Resistance is futile.
 
Группа: Members
Зарегистрирован: 21-10-2009
Сообщений: 9558
UA: Seamonkey 2.14

Re: Custom Buttons

получаешь вкладку,меняешь у неё label
var tab=какойто код выдающий вкладку
var txt=tab.getAttribute("label")
txt=чтото делаем с текстом
tab.setAttribute("label",txt)
кактотак


я помню те времена когда обновления программ убирали проблемы и исправляли баги, а не добавляли их.
toxID:05AB9B827D896AACEE7FF4573A02FB8F025F46ADC856B98F65BC1BA9BD21A81DC98BA9C36CE3

Отсутствует

 

№1296303-12-2018 18:08:51

Резидент
Участник
 
Группа: Members
Зарегистрирован: 08-12-2014
Сообщений: 50
UA: Firefox 63.0

Re: Custom Buttons

Подскажите пожалуйста.
Можно ли с помощью Custom Buttons сделать подобное как в File and Folder Shortcuts для FF 63+ ?

Описание
hbdceJC.png

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

Отсутствует

 

№1296406-12-2018 20:43:59

Артик
Участник
 
Группа: Members
Зарегистрирован: 14-03-2016
Сообщений: 64
UA: Firefox 61.0

Re: Custom Buttons

Всем привет. В общем, у меня все кнопки на панели вкладок, а все остальные панели полностью скрыты. Но на панели вкладок не работают дополнения типа Робоформ, Таб Сессион Менеджер, и так далее. Когда открываю панель адресной строки, всё работает, когда закрываю панель адресной строки, снова перестаёт работать. Как исправить эту проблему? Как сделать, чтобы все кнопки, дополнени и т.д. работали на панели вкладок при закрытых других вкладок? Кто знает?

Отсутствует

 

№1296510-12-2018 23:36:10

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2123
UA: Firefox 52.0

Re: Custom Buttons

Dumby пишет

На Firefox 65 всё будет немного иначе.

Да, из Firefox 65 вырезали аддон-менеджерские коды
обслуживавшие bootstrapped extensions, и теперь и на этот
последний вид расширений Наследия лиса смотрит бараном.
Таким образом — новый расклад.

Код для конфигурационного файла. Состоит из двух частей.
Часть 1:
  Антиподписячество и разрешение на paxmod'ы (aka WebExperiment).
  Код упрощён до уровня перестановки настроек и флагов. Что-то вроде правки omni.ja
  Примечания:
    1. Настройка jsloader.shareGlobal должна быть в дефолтном значении true.
    2. Размещение каких-либо других кодов перед этим строго не рекомендуется.
        Пусть он исполнится первым, а затем уже все остальные (если есть).
        Игнорируйте, если точно знаете что делаете.
    3. У всего неподписанного в manifest.json должен быть указан id.
        Если отсутствует — указываем.
Часть 2:
  Запускатор Custom Buttons (см. далее).

config.js

Выделить код

Код:

//
try {(nsvo => {
    var data = {
        MOZ_REQUIRE_SIGNING: false,
        MOZ_ALLOW_LEGACY_EXTENSIONS: true,
        get MOZ_UNSIGNED_SCOPES() {
            return 31; // AddonManager.SCOPE_ALL
        }
    };
    var o = Cu.getGlobalForObject(nsvo).Object, {freeze} = o;
    o.freeze = obj => {
        if (Components.stack.caller.filename != "resource://gre/modules/AppConstants.jsm")
            return freeze(obj);
        for(let key in data)
            o.defineProperty(obj, key, o.getOwnPropertyDescriptor(data, key));
        return (o.freeze = freeze)(obj);        
    }
    lockPref("extensions.legacy.enabled", true);
    lockPref("xpinstall.signatures.required", false);
    lockPref("extensions.langpacks.signatures.required", false);
    
})(Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}));}
catch(ex) {Cu.reportError(ex);}

//
try {({
    ids: new Set([
        "custombuttons@xsms.org",
    ]),
    topics: [
        "toolbox-update-addon-options",
        "final-ui-startup",
        "quit-application-granted",
    ],
    get gXPIProvider() {
        delete this.gXPIProvider;
        return this.gXPIProvider = Cu.import(
            "resource://gre/modules/addons/XPIProvider.jsm", {}
        );
    },
    init(obs) {
        this.obs = obs;
        for(var topic of this.topics)
            obs.addObserver(this, topic, false);
    },
    destroy() {
        for(var topic of this.topics)
            this.obs.removeObserver(this, topic);
    },
    observe(subj, topic) {
        if (topic != this.topics[0]) return this.destroy();

        var {id} = subj.wrappedJSObject;
        if (!this.ids.has(id)) return;
        this.ids.size == 1 ? this.destroy() : this.ids.delete(id);

        var rootURI = this.gXPIProvider.getURIForResourceInFile(
            this.gXPIProvider.XPIProvider.activeAddons.get(id).addon.file, ""
        );
        Cu.import(rootURI.resolve("startup.jsm"), {}).start(rootURI);
    }
}).init(Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService));}
catch(ex) {Cu.reportError(ex);}


Custom Buttons. Фейковый WebExtensions.

На борту имеется paxmod-стафф, так что, надеюсь, теоретически,
может работать и без запускатора, только на физической правке omni.ja,
а в Firefox Developer Edition вообще только на настройках.

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

Семёрка в номере версии лишь для того, чтобы отличалось чисто визуально (начертательно).
Как признак обратной несовместимости. Возможно будет работать на Firefox 63.

custom_buttons-0.0.7.0.0.1-fx.xpi.

Отсутствует

 

№1296611-12-2018 00:10:05

dezhnev
Участник
 
Группа: Members
Зарегистрирован: 21-04-2016
Сообщений: 72
UA: Firefox 63.0

Re: Custom Buttons

Ясно чего все бутстрапы поотваливались :/

Отсутствует

 

№1296711-12-2018 00:32:31

Karn
Участник
 
Группа: Members
Зарегистрирован: 11-12-2018
Сообщений: 45
UA: Firefox 63.0

Re: Custom Buttons

Dumby
Пытаюсь установить custom_buttons-0.0.7.0.0.1-fx.xpi в портабельный FF 63, но он не может быть установлен из-за подписи. Файлы config.js и config-prefs.js закинул в D:\Firefox\App\Firefox64\ и D:\Firefox\App\Firefox64\defaults\pref\. Не знаете в чём проблема?

Отсутствует

 

№1296811-12-2018 08:43:58

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2123
UA: Firefox 52.0

Re: Custom Buttons

Karn пишет

Не знаете в чём проблема?

Конечно нет, откуда?
Могу ещё раз пересказать, с диагностическим уклоном.

скрытый текст
В папке, где лежит firefox.exe, есть папка defaults, а в ней папка pref.
В этой папке, рядом с channel-prefs.js, создаём файл config-prefs.js

Название не столь существенно, а вот расширение должно быть js,
то есть config-prefs.js, а не какой-нибудь config-prefs.js.txt

Важно: кодировка должна быть без BOM, иначе работать не будет.

Убеждаемся, что все три строки на месте и сохраняем.

Выделить код

Код:

pref("general.config.obscure_value", 0);
pref("general.config.filename", "config.js");
pref("general.config.sandbox_enabled", false);

Затем, в папке, где лежит firefox.exe, создаём файл config.js
Кладём в него эти две строки и сохраняем.

Выделить код

Код:

//
Cu.reportError("CONFIG.JS TEST");

Перезапускаем Firefox и открываем Консоль браузера (Ctrl+Shift+J).
Там, в самом начале, смотрим, появилось ли наше сообщение (примерно такое).

Если появилось, значит конфигурационный файл, как таковой, работает.

Теперь заменяем содержимое config.js кодом, сохраняем и перезапускаем Firefox.
В about:config включаем настройку devtools.chrome.enabled
Снова открываем Консоль браузера.
Внизу, в js-терминале вводим запрос, жмём Enter и смотрим ответ (примерно такой).

Выделить код

Код:

AppConstants.MOZ_UNSIGNED_SCOPES

Если ответ 31, значит код работает.

На Панели меню - Файл > Работать автономно
На странице about:addons - Расширения > кнопка-шестерёнка > Установить дополнение из файла…

Я проделал всё это на чистом FirefoxPortable 63.0.3 (64-бит).
Custom Buttons 0.0.7.0.0.1 установился и работает.

Отсутствует

 

№1296911-12-2018 20:00:29

Karn
Участник
 
Группа: Members
Зарегистрирован: 11-12-2018
Сообщений: 45
UA: Firefox 63.0

Re: Custom Buttons

Dumby
Спасибо большое за пересказ, благодаря тесту понял, что проблема в config.js коде, который взял из FAQ - Как отключить проверку цифровых подписей в дополнениях Firefox. :D Всё установил, но не работает моя любимая кнопка Autocopy от bunda1. :usch: :lol:

Отредактировано Karn (11-12-2018 20:21:28)

Отсутствует

 

№1297012-12-2018 11:00:54

Mishania
Участник
 
Группа: Members
Зарегистрирован: 22-10-2011
Сообщений: 356
UA: unknown 0.0

Re: Custom Buttons

А для 60 ESR не подскажите как установить? Вчера поставил первый раз, вроде запустилось хоть и писало что дополнение не совместимо, но сегодня отпало всё.
Делал так. И присоединюсь к Karn, Autocopy не работает, а без него как без рук.

Отредактировано Mishania (12-12-2018 18:32:41)

Отсутствует

 

№1297112-12-2018 15:06:52

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 57.0

Re: Custom Buttons

у меня вот такой автокопи работает

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

Выделить код

Код:

this.closest("toolbarpaletteitem") || (script => {
    var id = `CB${_id.slice(20)}:Autocopy`, pid = id + "Parent";
    var nsvoStr = `Components.utils.import("resource://gre/modules/Services.jsm", {})`;
    var nsvo = eval(nsvoStr), {Services} = nsvo, parent = nsvo[pid];
    if (!parent) {
        var cid = id + "Child", u = code => "data:," + encodeURIComponent(code);
        var pref = "CB.Autocopy.settings", topic = "quit-application-granted";
        var PREF_ENABLED = 1, PREF_BLINK = 2, PREF_RESET = 4;

        (parent = nsvo[pid] = {
            init() {
                this.readSettings();
                if (!this[PREF_ENABLED]) return;
                this.initChild();
                if (this[PREF_RESET]) this.setObserver(true);
            },
            destroy(reason) {
                var ud = reason[5] == "e";
                if (ud || !this.obsAdded) this.saveSettings();
                delete nsvo[pid];
                if (reason == "delete") Services.prefs.clearUserPref(pref);
                if (!this[PREF_ENABLED]) return;

                this.destroyChild();
                if (ud && this[PREF_RESET]) this.setObserver(false);
            },
            get processURL() {
                delete this.processURL;
                this.frameURL = u(`${nsvoStr}["${cid}"].init(this);`);
                return this.processURL = u(script.replace(/%ID%/g, cid)
                    .replace("%NSVO%", nsvoStr).replace("%BLINK%", this[PREF_BLINK])
                );
            },
            get frameURLDestroy() {
                delete this.frameURLDestroy;
                this.processURLDestroy = u(`${nsvoStr}["${cid}"].forget();`);
                return this.frameURLDestroy = u(`${nsvoStr}["${cid}"].destroy(this);`);
            },
            initChild() {
                Services.ppmm.loadProcessScript(this.processURL, true);
                Services.mm.loadFrameScript(this.frameURL, true);
            },
            destroyChild() {
                Services.mm.removeDelayedFrameScript(this.frameURL);
                Services.mm.loadFrameScript(this.frameURLDestroy, false);
                Services.ppmm.removeDelayedProcessScript(this.processURL);
                Services.ppmm.loadProcessScript(this.processURLDestroy, false);
            },
            readSettings() {
                this.prefVal = Services.prefs.getIntPref(pref, 3);
                for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET])
                    this[setting] = Boolean(this.prefVal & setting);
            },
            saveSettings() {
                var settings = 0;
                for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET])
                    if (this[setting]) settings += setting;
                if (this.prefVal != settings)
                    Services.prefs.setIntPref(pref, settings);
            },
            btns: new Set(),
            register(btn) {
                this.btns.add(btn);
                btn._handleClick = this.click;
                btn.oncontextmenu = this.context;
                this.setImg(btn, this[PREF_ENABLED]);
            },
            unregister(btn, reason) {
                this.btns.delete(btn);
                if (!this.btns.size) this.destroy(reason);
            },
            setImg(btn, state) {
                btn.ownerDocument.getAnonymousElementByAttribute(
                    btn, "class", "toolbarbutton-icon"
                ).src = state
                    ? "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
                    : "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
            },
            click() {
                var newState = parent[PREF_ENABLED] = !parent[PREF_ENABLED];
                for(var btn of parent.btns) parent.setImg(btn, newState);
                newState ? parent.initChild() : parent.destroyChild();
                if (parent[PREF_RESET]) parent.setObserver(newState);
            },
            context(e) {
                if (e.ctrlKey || e.shiftKey) return;
                if (e.detail > 1) return parent.popup.hidePopup();
                if (!this.contains(parent.popup)) this.appendChild(parent.popup);
                e.preventDefault();
                parent.popup.openPopup(this, "after_start");
            },
            get popup() {
                var win = Services.wm.getMostRecentWindow("navigator:browser");
                var doc = win.document, popup = doc.createElement("menupopup");
                popup.setAttribute("onclick", "event.stopPropagation();");
                popup.setAttribute("oncommand", "handleCommand(event.target);");
                for(var [lab, pref] of win.Object.entries({
                    "Выделенный текст мигает при автокопировании": PREF_BLINK,
                    "Выключать автокопирование при выходе из браузера": PREF_RESET
                })) {
                    var menuitem = popup.appendChild(doc.createElement("menuitem"));
                    menuitem.setAttribute("label", lab);
                    menuitem.setAttribute("type", "checkbox");
                    if (this[menuitem.pref = pref]) menuitem.setAttribute("checked", true);
                }
                popup.handleCommand = menuitem => {
                    var newState = this[menuitem.pref] = menuitem.hasAttribute("checked");
                    if (!this[PREF_ENABLED]) return;

                    if (menuitem.pref == PREF_BLINK)
                        Services.ppmm.broadcastAsyncMessage(cid + ":FromParent", {blink: newState});
                    else if (menuitem.pref == PREF_RESET)
                        this.setObserver(newState);
                }
                delete this.popup; return this.popup = popup;
            },
            obsAdded: false,
            setObserver(set) {this.obsAdded = set
                ? Services.obs.addObserver(this, topic, false)
                : Services.obs.removeObserver(this, topic);
            },
            observe() {
                Services.obs.removeObserver(this, topic);
                this[PREF_ENABLED] = false;
                this.saveSettings();
            }
        }).init();
    }
    parent.register(this);
    addDestructor(reason => parent.unregister(this, reason), parent);

})(`(nsvo => (nsvo["%ID%"] = {
    x: -1, y: -1, d: false,
    handleEvent(e) {e.button || this[e.type](e);},
    mousedown(e) {this.x = e.screenX; this.y = e.screenY, this.down = true;},
    mouseup(e) {
        var {down} = this; this.down = false; if (!down) return;
        if (e.screenX == this.x && e.screenY == this.y && (e.detail == 1 || e.target.matches(
            "textarea[disabled],input[disabled],button,select,summary"
        )))
            return;
        var name = e.originalTarget.nodeName;
        if (/^(?:(?:xul:)?(?:slider|scrollbarbutton)|resizer)$/.test(name))
            return;
        this.x = this.y = -1;
        var win = this.getFocusedWin(e.target.ownerGlobal);
        var sel = win.getSelection();
        if (sel.toString()) {
            this.cm.doCommand("cmd_copy", null, win);
            this.blinkEnabled && this.blink(win, e.detail > 1);
        }
    },
    blinkEnabled: %BLINK%,
    blink(win, pause) {
        if (pause) return win.setTimeout(() => this.blink(win), 100);
        var sc = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
            .getInterface(Components.interfaces.nsIWebNavigation)
            .QueryInterface(Components.interfaces.nsIDocShell)
            .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
            .getInterface(Components.interfaces.nsISelectionDisplay)
            .QueryInterface(Components.interfaces.nsISelectionController);
        sc.setDisplaySelection(sc.SELECTION_OFF);
        sc.repaintSelection(sc.SELECTION_NORMAL);
        win.setTimeout(() => {
            sc.setDisplaySelection(sc.SELECTION_ON);
            sc.repaintSelection(sc.SELECTION_NORMAL);
        }, 150);
    },
    getFocusedWin(win) {
        var focusedWin = {};
        var elm = Services.focus.getFocusedElementForWindow(win.top, true, focusedWin);
        return focusedWin.value;
    },
    get cm() {
        delete this.cm;
        return this.cm = Components.classes["@mozilla.org/embedcomp/command-manager;1"]
            .getService(Components.interfaces.nsICommandManager);
    },
    count: 0,
    init(cfmm) {
        this.count += 1;
        cfmm.addEventListener("mousedown", this);
        cfmm.addEventListener("mouseup", this);
        cfmm.addEventListener("unload", this);
        if (this.count == 1)
            this.cpmm.addMessageListener("%ID%:FromParent", this);
    },
    destroy(cfmm) {
        this.count -= 1;
        cfmm.removeEventListener("mousedown", this);
        cfmm.removeEventListener("mouseup", this);
        cfmm.removeEventListener("unload", this);
        if (!this.count)
            this.cpmm.removeMessageListener("%ID%:FromParent", this);
    },
    receiveMessage(msg) {
        if ("blink" in msg.data) this.blinkEnabled = msg.data.blink;
    },
    unload(e) {this.destroy(e.target);},
    forget: () => delete nsvo["%ID%"]

}).cpmm = this)(%NSVO%);`);


но я не знаю, может он обрезаный какой-то

6e8c34d7ef89bba8a33fa6862588a4b4.th.png

Отсутствует

 

№1297212-12-2018 15:17:48

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 63.0

Re: Custom Buttons

sonyas75
Да, эта кнопка работает на FF60+, но на FF64 перестала работать.
Может кто из спецов подправит код?

Отредактировано Garalf (12-12-2018 15:20:03)

Отсутствует

 

№1297312-12-2018 15:20:36

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 57.0

Re: Custom Buttons

Garalf
ну там спрашивали про 60 я и отписал про 60 :) хотя я и 60 не пользую. установлена, недонастроена и ладно.

Отсутствует

 

№1297412-12-2018 18:30:07

Mishania
Участник
 
Группа: Members
Зарегистрирован: 22-10-2011
Сообщений: 356
UA: unknown 0.0

Re: Custom Buttons

sonyas75
http://take.ms/ucTB3 - у меня сам CB отлетел.

Отсутствует

 

№1297512-12-2018 20:35:37

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 57.0

Re: Custom Buttons

Mishania
я вот этот конфиг.джс от Dumby ставил на 60
https://forum.mozilla-russia.org/viewtopic.php?pid=757088#p757088

Отредактировано sonyas75 (12-12-2018 20:35:57)

Отсутствует

 

Board footer

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