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

Mozilla Россия — свежие версии программ Mozilla, а также масса полезной информации по каждому продукту.

№1322613-05-2019 20:26:48

fokanik
Участник
 
Группа: Members
Зарегистрирован: 05-02-2014
Сообщений: 268
UA: Firefox 52.0

Re: Custom Buttons

bunda1 пишет:

Для ?

Да!

Отсутствует

 

№1322714-05-2019 21:52:19

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

Re: Custom Buttons

fokanik пишет:

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

Вот попробуй:

Выделить код

Код:

// Сочетания клавиш для сохранения выделенного текста в файл, от 10.05.2019. .............
(()=> {
   addEventListener('keydown', e=> {  // LOG(e.keyCode);
      
      // Ctrl + s  сохранить выделенный текст в файл
      if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 83) ) {
           e.preventDefault();
           saveSelectionToFile();
           }
       
      // Ctrl + alt + s  установить папку для сохранения текста
      if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 83) )
           setPathToFile();
           
   });

   function saveSelectionToFile() {
      var s = "CB.saveSelectionToFile", pref = Services.prefs;
      try { var pathToFile = pref.getStringPref ? pref.getStringPref(s) : pref.getComplexValue(s, Ci.nsISupportsString).data; }
      catch(e) { setPathToFile() };

      var title = convertFromUnicode("UTF-8", getTabLabel());
      var selection = gBrowser.contentDocument.defaultView.getSelection().toString();
      var text = title + "\r\n\r\n" + convertFromUnicode("UTF-8", selection) + "\r\n\r\n\r\n\r\n";
      
      var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
      file.initWithPath(pathToFile);
      
      var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
      file.exists() ? foStream.init(file, 0x02 | 0x10, 0664, 0) : foStream.init(file, 0x02|0x08|0x20, 0666, 0);
      foStream.write(text, text.length);
      foStream.close();
      
      document.activeElement.blur();  
      setTimeout(()=> window.content.focus(), 300);
   };
   
   function setPathToFile() {     
      var fp = window.makeFilePicker();
      fp.init(window, "Создайте текстовой файл для сохранения текста!", fp.modeSave);
      fp.appendFilters(fp.filterText);
      fp.defaultString = getTabLabel();
      fp.open(result => result == fp.returnOK && cbu.setPrefs("CB.saveSelectionToFile", convertFromUnicode("UTF-8", fp.file.path) + ".txt"));
   };
   
   function convertFromUnicode(charset, str) {
      var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
      converter.charset = charset;
      str = converter.ConvertFromUnicode(str);
      return str + converter.Finish();
   };
   
   function getTabLabel() { 
      var label = gBrowser.mCurrentTab.label;      
      var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
      return label.substring(0, 50);
   };
})();

Отсутствует

 

№1322815-05-2019 11:09:45

Chetnik
Забанен
 
Группа: Members
Зарегистрирован: 12-04-2019
Сообщений: 9
UA: unknown 0.0

Re: Custom Buttons

bunda1
Во внешнем редакторе не открывается.  У меня akel Pad заменяет NotePad ///
Как тут рихтануть?

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

Выделить код

Код:

function textToEditor() {
   var text = convertFromUnicode("UTF-16", getSelect()); 
   var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
   file.append("TextToEditor.txt");
   custombuttonsUtils.writeFile(file.path, text);
   file.initWithPath("C:\\Windows\\System32\\notepad.exe");
   file.launch(); 
};

Отредактировано Chetnik (15-05-2019 12:22:16)

Отсутствует

 

№1322915-05-2019 12:23:08

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

Re: Custom Buttons

Выделить код

Код:

function textToEditor() {
   var text = convertFromUnicode("UTF-16", getSelect()); 
   var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
   file.append("TextToEditor.txt");
   custombuttonsUtils.writeFile(file.path, text);
   file.launch(); 
};

И установи akel Pad по умолчанию для .txt

Отсутствует

 

№1323015-05-2019 19:32:26

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 77
UA: Firefox 66.0

Re: Custom Buttons

bunda1 разобрался с кнопкой Save
Нужно было отключить многопроцессорность
browser.tabs.remote.autostart - false
и создать
browser.tabs.remote.autostart.2 - false
и все заработало.

Отсутствует

 

№1323115-05-2019 20:04:33

fokanik
Участник
 
Группа: Members
Зарегистрирован: 05-02-2014
Сообщений: 268
UA: Firefox 52.0

Re: Custom Buttons

bunda1 пишет:

Вот попробуй:

Да, все хорошо, работает, спасибо! Убрал только var title, а то она "троит" по тексту и все что больше 50 знаков в строке - вроде обрезается, ну присмотрюсь еще к ней.

:iron:

Отсутствует

 

№1323215-05-2019 21:01:01

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

Re: Custom Buttons

egorsemenov06 пишет:

bunda1 разобрался с кнопкой Save
Нужно было отключить многопроцессорность
browser.tabs.remote.autostart - false
и создать
browser.tabs.remote.autostart.2 - false
и все заработало.

Ну тогда отлично. Не знал что на FF66 еще можно отключить многопроцессорность.

Добавлено 15-05-2019 21:02:25

fokanik пишет:

все что больше 50 знаков в строке - вроде обрезается, ну присмотрюсь еще к ней.
:iron:

нужно удалить .substring(0, 50);

Отредактировано bunda1 (15-05-2019 21:02:25)

Отсутствует

 

№1323315-05-2019 22:43:59

fokanik
Участник
 
Группа: Members
Зарегистрирован: 05-02-2014
Сообщений: 268
UA: Firefox 52.0

Re: Custom Buttons

bunda1 пишет:

нужно удалить .substring(0, 50);

Ну тогда нужно еще это приделать, но я не знаю где переменные в этом коде объявить:

Выделить код

Код:

      if(last_text_title != title)
         text = "\r\n*****\r\n" + title + "\r\n" + convertFromUnicode("windows-1251", selection); //Пишем разделитель, заголовок и текст
      else 
         text = "\r\n" + convertFromUnicode("windows-1251", selection); //Если заголовок не изменился - пишем только текст
      
      last_text_title = title; //Накосячил тут == скопировал

А все, заработало, только что-то перенос строки заглючил, пришлось дублировать.

:iron:

Отредактировано fokanik (15-05-2019 23:56:29)

Отсутствует

 

№1323417-05-2019 08:51:58

Chetnik
Забанен
 
Группа: Members
Зарегистрирован: 12-04-2019
Сообщений: 9
UA: unknown 0.0

Re: Custom Buttons

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

Выделить код

Код:

      if(last_text_title != title)
         text = "\r\n*****\r\n" + title + "\r\n" + convertFromUnicode("windows-1251", selection); //Пишем разделитель, заголовок и текст
      else 
         text = "\r\n" + convertFromUnicode("windows-1251", selection); //Если заголовок не изменился - пишем только текст
      
      last_text_title = title; //Накосячил тут == скопировал


И куда это вставлять? В конец? Кнопка бледнеет. В F66 это может работать? Пока только в SM 2.53(FF-60)

Отсутствует

 

№1323517-05-2019 14:24:42

fokanik
Участник
 
Группа: Members
Зарегистрирован: 05-02-2014
Сообщений: 268
UA: Firefox 52.0

Re: Custom Buttons

Chetnik пишет:

И куда это вставлять? В конец? Кнопка бледнеет. В F66 это может работать? Пока только в SM 2.53(FF-60)

В FF66 - не знаю.

Внимательно - кнопка PauseBreak - сохранить выделенный текст в файл.

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

Выделить код

Код:

// Подсказка для кнопки ..................
this.onmouseover =()=> { 
   this.tooltipText = "// Ctrl + alt + s  установить папку для сохранения текста \n// PauseBreak - добавить выделенный текст в файл";
};

var last_title = "jhftye";

(()=> {
   addEventListener('keydown', e=> {  // LOG(e.keyCode);
      
      
      
      // Ctrl + s  сохранить выделенный текст в файл
      if ( (!e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 19) ) {
           e.preventDefault();
           saveSelectionToFile();
           }
       
      // Ctrl + alt + s  установить папку для сохранения текста
      if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 83) )
           setPathToFile();
           
   });

   function saveSelectionToFile() {
      var s = "CB.saveSelectionToFile", pref = Services.prefs;
      try { var pathToFile = pref.getStringPref ? pref.getStringPref(s) : pref.getComplexValue(s, Ci.nsISupportsString).data; }
      catch(e) { setPathToFile() };

      var title = convertFromUnicode("windows-1251", getTabLabel());
      var selection = gBrowser.contentDocument.defaultView.getSelection().toString(); 
      
      var text = "*****\r\n" + title + "\r\n" + convertFromUnicode("windows-1251", selection) + "\r\n";
      if(title == last_title) text = "\r\n" + convertFromUnicode("windows-1251", selection) + "\r\n";
      last_title = title;
      
      var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
      file.initWithPath(pathToFile);
      
      var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
      file.exists() ? foStream.init(file, 0x02 | 0x10, 0664, 0) : foStream.init(file, 0x02|0x08|0x20, 0666, 0);
      foStream.write(text, text.length);
      foStream.close();
      
      document.activeElement.blur();  
      setTimeout(()=> window.content.focus(), 300);
   };
   
   function setPathToFile() {     
      var fp = window.makeFilePicker();
      fp.init(window, "Создайте текстовой файл для сохранения текста!", fp.modeSave);
      fp.appendFilters(fp.filterText);
      fp.defaultString = getTabLabel();
      fp.open(result => result == fp.returnOK && cbu.setPrefs("CB.saveSelectionToFile", convertFromUnicode("windows-1251", fp.file.path) + ".txt"));
   };
   
   function convertFromUnicode(charset, str) {
      var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
      converter.charset = charset;
      str = converter.ConvertFromUnicode(str);
      return str + converter.Finish();
   };
   
   function getTabLabel() { 
      var label = gBrowser.mCurrentTab.label;      
      var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
      return label;
   };
})();

Отсутствует

 

№1323617-05-2019 17:57:10

fokanik
Участник
 
Группа: Members
Зарегистрирован: 05-02-2014
Сообщений: 268
UA: Firefox 52.0

Re: Custom Buttons

bunda1, а еще хотелка есть, добавлять текст в файл по имени сайта.

К примеру скопированный текст со страницы https://forum.mozilla-russia.org/viewtopic.php?pid=770076 - сохраняем/добавляем в текстовой документ под именем /forum.mozilla-russia.org/.txt (примерно так).

Или чего я выдумываю, можно через getTabLabel() название файла задать.

На рабочий стол прямо можно, как легче писать в общем.

Отредактировано fokanik (17-05-2019 18:07:15)

Отсутствует

 

№1323717-05-2019 18:49:59

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

Re: Custom Buttons

Dumby
В 68b1 перестала работать куча кнопок. Наверное, опять что-то вырезали
Походу из-за отключения однопроцессорного режима.
Можно ли теперь восстановить работоспособность этих кнопок?
Autocopy

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

Выделить код

Код:

[b]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()) {
            (win.docShell || win.document.docShell).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%);`);

Отредактировано Garalf (17-05-2019 20:27:48)

Отсутствует

 

№1323817-05-2019 19:50:51

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 574
UA: Firefox 52.0

Re: Custom Buttons

bunda1 пишет:

Не знал что на FF66 еще можно отключить многопроцессорность.

Пока можно, но начиная с Firefox 68... http://www.opennet.ru/opennews/art.shtml?num=50691

На форуме

 

№1323917-05-2019 20:22:37

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

Re: Custom Buttons

Теперь понятно почему многие кнопки отрубились(

Отсутствует

 

№1324017-05-2019 21:29:01

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

Re: Custom Buttons

kokoss пишет:

Пока можно, но начиная с Firefox 68... http://www.opennet.ru/opennews/art.shtml?num=50691

Печально.

Отсутствует

 

№1324118-05-2019 05:26:58

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

Re: Custom Buttons

Garalf пишет:

Походу из-за отключения однопроцессорного режима.

Ну, если есть стойкое предпочтение однопроцессного Firefox и не требуется переключать,
то можно просто создать соответствующую переменную среды.
Требуется пере-запуск: выход из Firefox, запуск Firefox (не рестарт).

У меня более капризные требования, хочется чтобы состояние процессности
следовало за настойкой и подхватывалось после рестарта, поэтому,
пока конфигурационный файл ещё не уничтожен, добавил в него

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

Выделить код

Код:

//
try {
    Components.interfaces.nsIUDPSocketChild ||
    Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment).set(
        "MOZ_FORCE_DISABLE_E10S",
        Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch)
            .getBoolPref("browser.tabs.remote.autostart", true) ? "" : "1"
    );
} catch(ex) {}


Autocopy посмотрел, там Services схомячили.
А вот глюки Custom Elements что-то не соображу как разрулить,
пришлось отказаться от концепции одного меню :(.
скрытый текст

Выделить код

Код:

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) {
                var btn = e.target;
                if (btn.nodeName != "toolbarbutton") return e.preventDefault();
                else if (e.ctrlKey || e.shiftKey) return;

                var popup = btn.popup || parent.createPopup(btn);
                if (e.detail > 1) return popup.hidePopup();
                e.preventDefault();
                for(var menuitem of popup.menuitems)
                    menuitem.setAttribute("checked", parent[menuitem.pref]);
                popup.openPopup(this, "after_start");
            },
            createPopup(btn) {
                var doc = btn.ownerDocument;
                var popup = btn.popup = btn.appendChild(doc.createElementNS(xulns, "menupopup"));
                popup.setAttribute("onclick", "event.stopPropagation();");
                popup.setAttribute("oncommand", "creator.handleCommand(event.target);");
                popup.menuitems = [];
                for(var [lab, pref] of Object.entries({
                    "Выделенный текст мигает при автокопировании": PREF_BLINK,
                    "Выключать автокопирование при выходе из браузера": PREF_RESET
                })) {
                    var menuitem = popup.appendChild(doc.createElementNS(xulns, "menuitem"));
                    menuitem.setAttribute("label", lab);
                    menuitem.setAttribute("type", "checkbox");
                    menuitem.pref = pref;
                    popup.menuitems.push(menuitem);
                }
                popup.creator = this;
                return 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);
            },
            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()) {
            (win.docShell || win.document.docShell).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);
    },
    get fm() {
        delete this.fm;
        return this.fm = Components.classes["@mozilla.org/focus-manager;1"]
            .getService(Components.interfaces.nsIFocusManager);
    },
    getFocusedWin(win) {
        var focusedWin = {};
        var elm = this.fm.getFocusedElementForWindow(win.top, true, focusedWin);
        return focusedWin.value;
    },
    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%);`);

Отсутствует

 

№1324218-05-2019 09:04:33

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

Re: Custom Buttons

Dumby
Добавил ваш фикс в config: появился однопроцессорный режим, Autocopy заработала (с заменой кода и без)
Но оказывается это еще не все. Нет системного контекстного меню кнопок (редактировать, удалить итд)
Проверьте, пожалуйста.

Отредактировано Garalf (18-05-2019 09:18:32)

Отсутствует

 

№1324318-05-2019 15:14:42

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

Re: Custom Buttons

Dumby
Пожалуйста обрати внимание на это Вопрос знающим людям

Отсутствует

 

№1324418-05-2019 18:09:33

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

Re: Custom Buttons

Garalf пишет:

Проверьте, пожалуйста.

Видел в своё время, но да, теперь и на b1 полюбовался.
Однако, собирать накануне Merge Date не слишком хорошая идея.
Будет обидно, если за оставшиеся два дня в Firefox 68 успеют ещё какой-нибудь порчи завезти.
Но если так уж прям невтерпёж...

custom_buttons-0.0.7.0.0.4-fx-paxmod.xpi
custom_buttons-0.0.7.0.0.4-fx-bootstrap.xpi

Конфигурация, надеюсь, остаётся прежней.

bunda1 пишет:

обрати внимание на это

Да, это я видел. Но там написано то, чего не может быть.

скрытый текст
Хотя бы потому, что слэши не экранированы, то есть одинарные, а не двойные.
Таким образом ошибка никак не может быть такой, как указано.

К тому же, текст ошибки содержит адрес файла в котором дважды упоминается Pale Moon.
Не то чтобы это совсем невероятно, но как-то настораживает.

«записать текст в архив xpi» — это я вообще не понял к чему.

Ладно, на всё это можно бы было закрыть глаза,
но «на последних версиях Firefox» — это мне ниочём не говорит.
Непонятно почему во множественном числе, и непонятно почему
не указать версии CB и FF конкретно.

Пытаться сочинить что-то поуниверсальней слегка лениво.
Ну и что я должен написать? Наугад, вслепую, типа: попробуй так

Выделить код

Код:

var text = "Internet Explorer";

for(var win of CustomizableUI.windows) 
    win.document.getElementById(_id).setAttribute("Help", text);
var AO = new custombuttons.cbService.parent.AppObject();
AO.getButton(_id).setAttribute("Help", text);
AO.overlay.saveOverlayToProfile();

Или: url CustomButtonsService.js можно попробовать получить так

Выделить код

Код:

alert(
    Cc["@mozilla.org/network/protocol;1?name=resource"].getService(Ci.nsIResProtocolHandler)
        .getSubstitution("custombuttons-modules").resolve("../components/CustomButtonsService.js")
);

И наконец, если я правильно припоминаю, такой нестандартный метод записи
использовался когда-то давно для того, чтобы кнопка, при переинициализации,
не дёргала соседей по тулбару.

Так ли это актуально для «последних версий Firefox» ?
Я попробовал у себя классический вариант, и у меня ничего не дёргается,
ну может мигнёт, иногда.
Возможно, стоит и тебе проверить.

Выделить код

Код:

var text = "Internet Explorer";

var link = custombuttons.makeButtonLink("update", _id);
var params = custombuttons.cbService.getButtonParameters(link).wrappedJSObject;
params.help = text;
custombuttons.cbService.installButton(params.wrappedJSObject = params);

Отсутствует

 

№1324518-05-2019 18:21:03

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

Re: Custom Buttons

Выделить код

Код:

var text = "Internet Explorer";

var link = custombuttons.makeButtonLink("update", _id);
var params = custombuttons.cbService.getButtonParameters(link).wrappedJSObject;
params.help = text;
custombuttons.cbService.installButton(params.wrappedJSObject = params);

Спасибо, это работает :)

Отсутствует

 

№1324618-05-2019 20:00:03

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

Re: Custom Buttons

Dumby пишет:

Но если так уж прям невтерпёж...

Живем! Благодарю, думаю, не только от себя.

Отсутствует

 

№1324719-05-2019 19:56:20

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1304
UA: Firefox 42.0

Re: Custom Buttons

Можно ли к этой кнопке (открытия сайта в новой вкладке) добавить чтобы сайт открывался в контейнере?

Выделить код

Код:

gBrowser.selectedTab = gBrowser.addTab('https://www.google.ru');

Отредактировано Stkvsky (19-05-2019 21:13:33)

Отсутствует

 

№1324820-05-2019 15:18:42

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1304
UA: Firefox 42.0

Re: Custom Buttons

Вот эта кнопка в контекстном меню, открывает ссылку в выбранном контейнере, можно ли ее совместить с кнопкой выше?

скрытый текст
https://i.imgur.com/W1jmo6D.jpg

Отсутствует

 

№1324920-05-2019 16:11:54

Parazit
Участник
 
Группа: Members
Зарегистрирован: 04-02-2017
Сообщений: 17
UA: Firefox 56.0

Re: Custom Buttons

Подскажите, где можно скачать custom-buttons?

Отсутствует

 

№1325020-05-2019 17:41:25

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

Re: Custom Buttons

Parazit пишет:

Подскажите, где можно скачать custom-buttons?

18-05-2019 18:09:33

Отсутствует

 

Board footer

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